hadoop
优点(四高)
高可靠性:hadoop的底层有多个数据副本,所以即是hadoop的某个元素和存储出现故障,也不会导致数据的丢失
高扩展性:在集群分配任务,方便数以千机的节点
高效性:在mapreduce的思想下,hadoop是并行工作的,以加快处理任务的速度
高容错性:都够自动将失败的任务重新分配
hadoop组成
HDFS框架
namenode:存储文件的元数据,文件的块列表和块所在的datanode
datanode: 在本地文件系统存储文件块数据,以及对数据块的校验
secondary namenode:每个一段时间对namenode元数据备份
yarn框架
resource manager :管理整个集群的资源
node manager:管理单个服务器的资源
application master : 管理单个任务的运行
container:容器,相当于一个独立的服务器里面包含了任务所需要的资源(cpu,内存,磁盘,网落等)
mapreduce框架
map阶段并行锤输入数据
reduce结点对map的结果进行汇总
HDFS
优点
高容错性
可以存入多个副本
副本丢失了可以自动回复
适合处理大数据
数据规模能到tb以上
文件规模能够处理百万以上
可构建廉价的机器上,通过多副本,提高性能
缺点
不适合低延迟的数据访问,比如毫秒级别的是做不到的
无法高效的对大量小文件进行存储
存储大量小文件的话,namenode的内存是有限的
小文件存储的寻址时间超过读取时间
不支持并发
一个文件只能有一个写,不孕系多个线程同时写
仅支持append追加,不允许修改
组成
Namenode
管理hdfs元数据
Config副本测流哦
管理数据块的映射信息
处理客户端的读写请求
Datanode
实际存储的数据块
实行数据块的读写操作
Client
文件切分
与namenode进行交互获取文件的位置信息
与datanode进行交互,获取或写入数据
Client提供命令来管理hdfs,比如namenode的个数话
Client可以通过一些命令来访问hdfs比如增删改查
Seconday namenode
辅助namenode,分担其工作量,比如定期合并fsimage个edits并推送给namenode
在紧急情况下,可以恢复namenode(但是只能恢复一部分)
Hdfs的数据块
的大小2.x和3.x默认的是128,1.x的是64
(通常是128,如果公司支持的话可以改成256)看具体时间
最佳状态是寻址时间为传输时间的百分之一
传输速度看硬件
不能设置太小
会增加寻址时间,导致程序一直再找位置
不能太大
导致数据传输的时间会远大于寻址时间,导致处理数据会非常慢
HDFS写数据流程
(1)客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在。
(2)NameNode返回是否可以上传。
(3)客户端请求第一个 Block上传到哪几个DataNode服务器上。
(4)NameNode返回3个DataNode节点,分别为dn1、dn2、dn3。
(5)客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。
(6)dn1、dn2、dn3逐级应答客户端。
(7)客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。
(8)当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器。(重复执行3-7步)。
副本结点的选择
第一个副本在客户端所在的结点上,如果客户端不在集群上,就随机选择一个
第二个副本在另一个机架的随机一个结点
第三个副本在第二个副本所在机架的随机结点
HDFS读数据流程
(1)客户端通过DistributedFileSystem向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址。
(2)挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据。
(3)DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)。
(4)客户端以Packet为单位接收,先在本地缓存,然后写入目标文件。
namenode和secondary namenode工作机制
1)第一阶段:NameNode启动
(1)第一次启动NameNode格式化后,创建Fsimage和Edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。
(2)客户端对元数据进行增删改的请求。
(3)NameNode记录操作日志,更新滚动日志。
(4)NameNode在内存中对元数据进行增删改。
2)第二阶段:Secondary NameNode工作
(1)Secondary NameNode询问NameNode是否需要CheckPoint。直接带回NameNode是否检查结果。
(2)Secondary NameNode请求执行CheckPoint。
(3)NameNode滚动正在写的Edits日志。
(4)将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode。
(5)Secondary NameNode加载编辑日志和镜像文件到内存,并合并。
(6)生成新的镜像文件fsimage.chkpoint。
(7)拷贝fsimage.chkpoint到NameNode。
(8)NameNode将fsimage.chkpoint重新命名成fsimage。
Fsimage和Edits解析
NameNode被格式化之后,将在opt/module hadoop-3.1.3/ap/dfs/mame rent目录中产生如下文件 t= imzge 000000 00 00 00 0000000 f= imzge 00000000 00 000000000 md5 seen txid UERS ION
(1)Fmage文件: DES文件系统元数据的一个永久性的检查点,其中包含EDFS文件系统的所有目录和文件iode的字列化信息。 (2)文件:存放EDFS文件系统的所有更新操作的路径,文件系统客户端执行的所有写操作首先会洪记录到欧远文件中。 (3)seen_tsid文件保存的是一个数字,就是最后一个edis_的数字 (4)每次NameNode启动的时候都会将Fsimaee文件读入内存,加Ds里面的更新操作,保证内存中的元数据信自是最新的、同步的,可以看成NameNode启动的时候就将m和文件进行了合并
DataNode工作机制
1启动之后向namenode注册
2注册成功后(一个周期)每六个小时上报所有块信息
3每三秒发送一次心跳(带有namenode发送datanode的命令)
4超过十分钟+30秒没有收到datanode的心跳就视为该节点不可用
(1)一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。
(2)DataNode启动后向NameNode注册,通过后,周期性(6小时)的向NameNode上报所有的块信息。
(3)心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个DataNode的心跳,则认为该节点不可用。
(4)集群运行中可以安全加入和退出一些机器。
data保证数据完整性
(1)当DataNode读取Block的时候,它会计算CheckSum。
(2)如果计算后的CheckSum,与Block创建时值不一样,说明Block已经损坏。
(3)Client读取其他DataNode上的Block。
(4)常见的校验算法crc(32),md5(128),sha1(160)
(5)DataNode在其文件创建后周期验证CheckSum。
mapreduce
MapReduce是一个分布式运算程序的编程框架
MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群上。
优点
1**)MapReduce易于编程**
它简单的实现一些接口,就可以完成一个分布式程序,这个分布式程序可以分布到大量廉价的PC机器上运行。也就是说你写一个分布式程序,跟写一个简单的串行程序是一模一样的。就是因为这个特点使得MapReduce编程变得非常流行。
2**)良好的扩展性**
当你的计算资源不能得到满足的时候,你可以通过简单的增加机器来扩展它的计算能力。
3**)高容错性**
MapReduce设计的初衷就是使程序能够部署在廉价的PC机器上,这就要求它具有很高的容错性。比如其中一台机器挂了,它可以把上面的计算任务转移到另外一个节点上运行,不至于这个任务运行失败,而且这个过程不需要人工参与,而完全是由Hadoop内部完成的。
4**)适合PB级以上海量数据的离线处理**
可以实现上千台服务器集群并发工作,提供数据处理能力。
缺点
1**)不擅长实时计算**
MapReduce无法像MySQL一样,在毫秒或者秒级内返回结果。
2**)不擅长流式计算**
流式计算的输入数据是动态的,而MapReduce的输入数据集是静态的,不能动态变化。这是因为MapReduce自身的设计特点决定了数据源必须是静态的。
3**)不擅长DAG(有向无环图)计算**
多个应用程序存在依赖关系,后一个应用程序的输入为前一个的输出。在这种情况下,MapReduce并不是不能做,而是使用后,每个MapReduce作业的输出结果都会写入到磁盘,会造成大量的磁盘IO,导致性能非常的低下。
核心思想
1)分布式的运算程序往往需要分成至少2个阶段。
(2)第一个阶段的MapTask并发实例,完全并行运行,互不相干。
(3)第二个阶段的ReduceTask并发实例互不相干,但是他们的数据依赖于上一个阶段的所有MapTask并发实例的输出。
(4)MapReduce编程模型只能包含一个Map阶段和一个Reduce阶段,如果用户的业务逻辑非常复杂,那就只能多个MapReduce程序,串行运行。
总结:分析WordCount数据流走向深入理解MapReduce核心思想。
进程
一个完整的MapReduce程序在分布式运行时有三类实例进程:
(1)MrAppMaster:负责整个程序的过程调度及状态协调。
(2)MapTask:负责Map阶段的整个数据处理流程。
(3)ReduceTask:负责Reduce阶段的整个数据处理流程。
Hadoop序列化特点:
(1**)紧凑** :高效使用存储空间。
(2**)快速:**读写数据的额外开销小。
(3**)互操作:**支持多语言的交互
工作流程
上面的流程是整个MapReduce最全工作流程,但是Shuffle过程只是从第7步开始到第16步结束,具体Shuffle过程详解,如下:
(1)MapTask收集我们的map()方法输出的kv对,放到内存缓冲区中
(2)从内存缓冲区不断溢出本地磁盘文件,可能会溢出多个文件
(3)多个溢出文件会被合并成大的溢出文件
(4)在溢出过程及合并的过程中,都要调用Partitioner进行分区和针对key进行排序
(5)ReduceTask根据自己的分区号,去各个MapTask机器上取相应的结果分区数据
(6)ReduceTask会抓取到同一个分区的来自不同MapTask的结果文件,ReduceTask会将这些文件再进行合并(归并排序)
(7)合并成大文件后,Shuffle的过程也就结束了,后面进入ReduceTask的逻辑运算过程(从文件中取出一个一个的键值对Group,调用用户自定义的reduce()方法)
注意:
(1)Shuffle中的缓冲区大小会影响到MapReduce程序的执行效率,原则上说,缓冲区越大,磁盘io的次数越少,执行速度就越快。
(2)缓冲区的大小可以通过参数调整,参数:mapreduce.task.io.sort.mb默认100M。
mapreduce详细工作流程--东东版
假设我们有一个200mb的数据
1客户端会通过submit发送到集群但是在这之前,获取数的信息并对其进行划分的规格 0-128 128-200
2提交的信息会到yarn的resourcemanager上面去(信息包括job.split wc.jar(当成计算数据的java包) job.xml(放一些参数啥的))
3resmanager会根据数据的大小去请求足够的maptask
4 maptask会通过textinputformat方法调用inputformat在调用recordereader方法将数据转成kv形式逐条获取(key是偏移量,vlue是数据)
5获取到之后发放到mapper方法中的map方法在经过一些逻辑计算给他write出去 (map后实际上就是shuffle了)
6标记好之后会发送到环形缓冲区(默认100m 80%开始溢写)会产生大量的溢文件(文件分区并且有序)
在溢写之前会对数据进行分区排序排序的规则就是将key进行字典式排序手段是快排、
key取哈希值 哈希值除以reducetask的数量余几就放到那个分区里(每个分区就是一个文件)
7溢写完之后会调用merger方法进行归并排序(默认将十个溢写文件写成一个大的文件)
也可以对数据进行combiner操作前提是这个结果不会最终的结果有影响
8等待所有的maptask合并完之后会启动一定数量的reducetask
9reducetask会发取线程到map拉去数据这个拉去的线程数会一次发送十个
拉取到数据会先加载到内存,内存不够的话会写到磁盘中
10等到所有的数据都拉去过来之后会将这些数据进行一次归并排序 (shuffle就到这里基本上就结束了)
归并完成之后会在进行一次分组操作然后将数据一组为单位发送到reduce中
reduce进行一些逻辑的操作判断之后会调用outputformat方法在调用recordwriter将数据以kv的形式进行输出(地址可以自己选择,本地,hdfs,等等)
shuffle工作详情(单独拉出来的话可以说这个)
shuffle阶段又可以分为Map端的shuffle和Reduce端的shuffle。
一、Map端的shuffle
Map端会处理输入数据并产生中间结果,这个中间结果会写到本地磁盘,而不是HDFS。每个Map的输出会先写到内存缓冲区中,当写入的数据达到设定的阈值时,系统将会启动一个线程将缓冲区的数据写到磁盘,这个过程叫做spill。
在spill写入之前,会先进行二次排序,首先根据数据所属的partition进行排序,然后每个partition中的数据再按key来排序。partition的目是将记录划分到不同的Reducer上去,以期望能够达到负载均衡,以后的Reducer就会根据partition来读取自己对应的数据。接着运行combiner(如果设置了的话),combiner的本质也是一个Reducer,其目的是对将要写入到磁盘上的文件先进行一次处理,这样,写入到磁盘的数据量就会减少。最后将数据写到本地磁盘产生spill文件(spill文件保存在{mapred.local.dir}指定的目录中,Map任务结束后就会被删除)。
最后,每个Map任务可能产生多个spill文件,在每个Map任务完成前,会通过多路归并算法将这些spill文件归并成一个文件。至此,Map的shuffle过程就结束了。
二、Reduce端的shuffle
Reduce端的shuffle主要包括三个阶段,copy、sort(merge)和reduce。
首先要将Map端产生的输出文件拷贝到Reduce端,但每个Reducer如何知道自己应该处理哪些数据呢?因为Map端进行partition的时候,实际上就相当于指定了每个Reducer要处理的数据(partition就对应了Reducer),所以Reducer在拷贝数据的时候只需拷贝与自己对应的partition中的数据即可。每个Reducer会处理一个或者多个partition,但需要先将 自己对应的partition中的数据从每个Map的输出结果中拷贝过来。
接下来就是sort阶段,也成为merge阶段,因为这个阶段的主要工作是执行了归并排序。从Map端拷贝到Reduce端的数据都是有序的,所以很适合归并排序。最终在Reduce端生成一个较大的文件作为Reduce的输入。
最后就是Reduce过程了,在这个过程中产生了最终的输出结果,并将其写到HDFS上。
combiner
conbiner的父类是reduce 他们俩作的就是聚合汇总但是区别就在于运行的位置
combiner实在每一个maptask的这个节点上运行的
reduce就是reducetask上运行的用于接受所有的map的结果
combiner的意义就是对每一个maptask进行一个局部汇总用于减少网落的传输
每一mapper都有可能产生大量的本地文件combiner的作用就是对map的输出先做一次localreduce
就是在本地做一次reduce的操作把这些本地的数据进行计算然后给他合并那合并完的结果肯定比刚输出到本地的时候要笑的多
这样就能减少map到reduce传输的量
用的前提是不能影响最终的结果
就比如 有是十个maptask去求个和 然后十个就会出十个结果把这个十个结果合起来就是最终结果就是没错
但是 你如果你去求平均值 maptask后我们会得到十个平均值但是你要把这个十个平均值在进行一次平均的话的数据就不对了,所一们要在不影响结果的前提下去选择他
并行度
MapTask并行度由切片个数决定,
切片个数由输入文件和切片规则决定。
ReduceTask的并行度默认是一个但是可以手动设置
reducetask的数量不能任意设置,需要再考虑到业务逻辑需求,和集群性能来进行选择
适当的加多会减少运行时间,太多了
数据清洗(ETL)了解即可
“ETL,是英文Extract-Transform-Load的缩写,用来描述将数据从来源端经过抽取(Extract)、转换(Transform)、加载(Load)至目的端的过程。ETL一词较常用在数据仓库,但其对象并不限于数据仓库
在运行核心业务MapReduce程序之前,往往要先对数据进行清洗,清理掉不符合用户要求的数据。清理的过程往往只需要运行Mapper程序,不需要运行Reduce程序。
mapreduce总结(请认真看完上面的)(这部分只是简介了解即可)
1**)输入数据接口:InputFormat**
(1)默认使用的实现类是:TextInputFormat
(2)TextInputFormat的功能逻辑是:一次读一行文本,然后将该行的起始偏移量作为key,行内容作为value返回。
(3)CombineTextInputFormat可以把多个小文件合并成一个切片处理,提高处理效率。
2**)逻辑处理接口:Mapper**
用户根据业务需求实现其中三个方法:map() setup() cleanup ()
3**)Partitioner分区**
(1)有默认实现 HashPartitioner,逻辑是根据key的哈希值和numReduces来返回一个分区号;key.hashCode()&Integer.MAXVALUE % numReduces
(2)如果业务上有特别的需求,可以自定义分区。
4**)Comparable排序**
(1)当我们用自定义的对象作为key来输出时,就必须要实现WritableComparable接口,重写其中的compareTo()方法。
(2)部分排序:对最终输出的每一个文件进行内部排序。
(3)全排序:对所有数据进行排序,通常只有一个Reduce。
(4)二次排序:排序的条件有两个。
5**)Combiner合并**
Combiner合并可以提高程序执行效率,减少IO传输。但是使用时必须不能影响原有的业务处理结果。
6**)逻辑处理接口:Reducer**
用户根据业务需求实现其中三个方法:reduce() setup() cleanup ()
7**)输出数据接口:OutputFormat**
(1)默认实现类是TextOutputFormat,功能逻辑是:将每一个KV对,向目标文本文件输出一行。
(2)用户还可以自定义OutputFormat。
压缩
gzip,bzip,lzo,snappy
压缩方式选择
压缩方式选择时重点考虑:压缩/解压缩速度、压缩率(压缩后存储大小)、压缩后是否可以支持切片。
4.3.1 Gzip压缩
优点:压缩率比较高;
缺点:不支持Split;压缩/解压速度一般;
4.3.2 Bzip2压缩
优点:压缩率高;支持Split;
缺点:压缩/解压速度慢。
4.3.3 Lzo压缩
优点:压缩/解压速度比较快;支持Split;
缺点:压缩率一般;想支持切片需要额外创建索引。
4.3.4 Snappy压缩
优点:压缩和解压缩速度快;
缺点:不支持Split;压缩率一般;
yarn
基础架构
YARN主要由ResourceManager、NodeManager,ApplicationMaster和Container等组件构成。
ResourceManager
1.处理客户端的请求
2.监控nodemanager
3.启动监控applicationmaster
4.资源的分配与调度
nodemanager
1管理单个结点上的资源
2处理来自ResourceManager上的命令
3处理来自applicationmaster上的命令
applicationmaster
1.为应用程序申请资源并分配任务
2.任务的监控与容错
container
拥有处理任务的资源(磁盘内存cpu等)
工作流程
1客户端运行mr 会创建一个yarnrunner
2去ResourceManager申请运行一个application
3会返回一个hdfs的路径
4客户端将数据进行切片发送的hfds(job.split,jop.xml,wc.jar)
5.提交完毕申请运行mrappmaster
6.ResourceManager将用户的请求初始化成一个task
7.将请求发给送到队列中
8.然后我们这请求就会被执行
9执行了就会启动一个mrappmaster
10申请运行maptask容器(数量根据切片分)
11申请到了container容器
12mrappmaster就可以container中运行maptask了
13maptaskc从hdfs获取数据进行计算运算完了之后会把数据按照分区进行存储(写到本地)
14mrappmaster会再次去ResourceManager申请运行redcetask
15申请到足够数量的container
16mrappmaster在container运行reducetask
17会根据数据的分区获取到自己的数据
18reducetask运行完之后会把数据再次存放到hdfs中
19都运行完成之后mrappmaster会申请注销自己
调度器
FIFO调度器(First In First Out):单队列,根据提交作业的先后顺序,先来先服务。
Capacity Scheduler(容量调度器)
1 多队列: 每个队列可配皆一定的资是,每个队列采用FTFO调度策略
2容量保证:管理员可为每个队列设置资源最低保证和资源使用上限
3灵活性:如果一个队列中的资原有利杀,可以暂时共享给那些需要资原的队列,而一旦该队列有新的应用程序提交,则其他队列借调的资原会归还给该队列。
4多租户 支持多用户共亭年群和多应用程序同时运行 为了防止同一个用户的作业独占队列中的资原,该调产器会对同一用户提交的作业所占资原尾进行限定。
Fair Schedulere是Facebook开发的多用户调度器。
与容量调度器相同点
1 多队列: 每个队列可配皆一定的资是,每个队列采用FTFO调度策略
2容量保证:管理员可为每个队列设置资源最低保证和资源使用上限
3灵活性:如果一个队列中的资原有利杀,可以暂时共享给那些需要资原的队列,而一旦该队列有新的应用程序提交,则其他队列借调的资原会归还给该队列。
4多租户 支持多用户共亭年群和多应用程序同时运行 为了防止同一个用户的作业独占队列中的资原,该调产器会对同一用户提交的作业所占资原尾进行限定。
与容量不同
核心调度策略不同
容量优先选择资源利用率的队列
公平优先选择对资源缺额大的
每个队列可以单独设置的资源分配方式不同
容量:fifo和drf
公平:fifo,fair,drf
fair相当于多个fifio并行
drf他会判断你这个任务需要用多少资源他就会分配给你多少资源
公平调度器实在时间的尺度上,让所有的作业获的公平的资源,
(公平资源调度器涉及到的知识点又点多,现在你只要知道上述的就行了)(主要是知识点又点多蒙了吧唧的)(以后懂了再写)
Hadoop是一个开源的分布式计算框架,以其高可靠性和高扩展性著称。HDFS作为其分布式文件系统,包含Namenode和Datanode,确保数据的冗余和容错。YARN作为资源管理系统,管理Resourcemanager和NodeManager。MapReduce是处理大规模数据的计算模型,通过Map和Reduce阶段实现数据处理。Hadoop还涉及到了数据的压缩、ETL过程和调度策略如FIFO、CapacityScheduler和FairScheduler等。

2497

被折叠的 条评论
为什么被折叠?



