(1)高可靠性:Hadoop底层维护多个数据副本,所以即使Hadoop某个计算元素或存储出现故障,也不会导致数据的丢失。
(2)高扩展性:在集群间分配任务数据,可方便的扩展数以千计的节点。
(3)高效性:在MapReduce的思想下,Hadoop是并行工作的,以加快任务处理速度。
(4)高容错性:能够自动将失败的任务重新分配。
文件存放在一个磁盘上效率肯定是低的,如果文件特别大会超出单机的存储范围
文件在计算机都是以二进制存储的,我们可以理解为存放的都是字节数组,而数组可以拆分为多个更小的数据,所以文件也可以进行拆分,而我们使用的时候只需要将他们根据文件的偏移量将他们合并到一起就可以了
偏移量: 可以理解为 下标数组都有对应的索引(下标),可以快速的定位数据
数据块的个数 =Ceil( 文件大小 / 每个块的大小)
在HDFS中, 数据块等大是很多计算的前提,我们不能破坏
文件应该拆分成同样大小的块, 首先选定一个块的大小,然后将文件从头到尾开始切分. 从第一个快到倒数第二个块都是大小相同的,除了最后一个块
如果切分块的时候大小不一致,会引来什么问题?
每个磁盘存储的数据量大小不同,存储的时间不一致,拼接文件的时候, 我们必须等所有的块都找齐之后才能开始拼接
如果数据块大小不一致在设计算法的时候, 需要为单独的块设计算法读取时间和程序计算时间
是否能修改HDFS上的数据?
迁移数据量不可控
破坏了等大的特性
总结: 在HDFS上一但数据被上传,就不能修改,但是可以追加,追加功能默认是关闭的
优点
缺点
开启集群
关闭集群
hadoop fs:
hadoop dfs
hdfs dfs(推荐)
调用文件系统(FS)Shell命令应使用 bin/hadoop fs 的形式。 所有的的FS shell命令使用URI路径作为参数
1 hadoop fs -ls <path> 列出指定目录下的内容,支持pattern匹配。输出格式如filename(full
path)<r n>size.n代表备份数。2 hadoop fs -lsr <path> 递归列出该路径下所有子目录信息3
hadoop fs -du<path>显示目录中所有文件大小,或者指定一个文件时,显示此文件大小4 hadoop fs -
dus<path>显示文件大小 相当于 linux的du -sb s代表显示只显示总计,列出最后的和 b代表显示文件大
小时以byte为单位5 hadoop fs -mv <src> <dst> 将目标文件移动到指定路径下,当src为多个文件,
dst必须为目录6 hadoop fs -cp <src> <dst>拷贝文件到目标位置,src为多个文件时,dst必须是个目
录7 hadoop fs -rm [skipTrash] <src>删除匹配pattern的指定文件8 hadoop fs -rmr
[skipTrash] <src>递归删除文件目录及文件9 hadoop fs -rmi [skipTrash] <src>为了避免误删数
据,加了一个确认10 hadoop fs -put <> ... <dst>从本地系统拷贝到dfs中11 hadoop fs -
copyFromLocal<localsrc>...<dst>从本地系统拷贝到dfs中,与-put一样12 hadoop fs -
moveFromLocal <localsrc>...<dst>从本地系统拷贝文件到dfs中,拷贝完删除源文件13 hadoop fs
-get [-ignoreCrc] [-crc] <src> <localdst> 从dfs中拷贝文件到本地系统,文件匹配
pattern,若是多个文件,dst必须是个目录14 hadoop fs -getmerge <src> <localdst>从dfs中
拷贝多个文件合并排序为一个文件到本地文件系统15 hadoop fs -cat <src>输出文件内容16 hadoop
fs -copyTolocal [-ignoreCre] [-crc] <src> <localdst>与 -get一致17 hadoop fs -mkdir
<path>在指定位置创建目录18 hadoop fs -setrep [-R] [-w] <rep> <path/file>设置文件的备份
级别,-R标志控制是否递归设置子目录及文件19 hadoop fs -chmod [-R]
<MODE[,MODE]...|OCTALMODE>PATH修改文件权限, -R递归修改 mode为a+r,g-w,+rwx ,octalmode
为75520 hadoop fs -chown [-R] [OWNER][:[GROUP]] PATH递归修改文件所有者和组21 hadoop
fs -count[q] <path>统计文件个数及占空间情况,输出表格列的含义分别为:
DIR_COUNT.FILE_COUNT.CONTENT_SIZE.FILE_NAME,如果加-q 的话,还会列出
QUOTA,REMAINING_QUOTA,REMAINING_SPACE_QUOTA
-mkdir 创建目录 hdfs dfs -mkdir [-p] < paths>
-ls 查看目录下内容,包括文件名,权限,所有者,大小和修改时间 hdfs dfs -ls [-R] <
args>
-put 将本地文件或目录上传到HDFS中的路径 hdfs dfs -put < localsrc> … < dst>
-get 将文件或目录从HDFS中的路径拷贝到本地文件路径 hdfs dfs -get [-ignoreCrc] [-crc]
< src> < localdst>
选项:-ignorecrc选项复制CRC校验失败的文件。-crc选项复制文件和CRC。
-du 显示给定目录中包含的文件和目录的大小或文件的长度,用字节大小表示。 hdfs dfs -du [-
s] [-h] URI [URI …] 选项:-s选项将显示文件长度的汇总摘要,而不是单个文件。-h选项将以“人可
读”的方式格式化文件大小(例如64.0m而不是67108864);第一列标示该目录下总文件大小,第二列标示该
目录下所有文件在集群上的总存储大小和你的副本数相关(第二列内容=文件大小*副本数),第三列标示你查
询的目录
-dus 显示文件长度的摘要。 hdfs dfs -dus < args> 注意:不推荐使用此命令。而是使用
hdfs dfs -du -s。
-mv 在HDFS文件系统中,将文件或目录从HDFS的源路径移动到目标路径。不允许跨文件系统移动文件。
-cp 在HDFS文件系统中,将文件或目录复制到目标路径下 hdfs dfs -cp [-f] [-p | -p
[topax] ] URI [ URI …] < dest> 选项:-f选项覆盖已经存在的目标。-p选项将保留文件属性
[topx](时间戳,所有权,权限,ACL,XAttr)。如果指定了-p且没有arg,则保留时间戳,所有权和权
限。如果指定了-pa,则还保留权限,因为ACL是一组超级权限。确定是否保留原始命名空间扩展属性与-p标
志无关。
-copyFromLocal 从本地复制文件到hdfs文件系统(与-put命令相似)hdfs dfs -copyFromLocal <
localsrc> URI 选项:如果目标已存在,则-f选项将覆盖目标。
-copyToLocal 复制hdfs文件系统中的文件到本地 (与-get命令相似) hdfs dfs -
copyToLocal [-ignorecrc] [-crc] URI < localdst>
-rm 删除一个文件或目录 hdfs dfs -rm [-f] [-r|-R] [-skipTrash] URI [URI …] 选
项:如果文件不存在,-f选项将不显示诊断消息或修改退出状态以反映错误。-R选项以递归方式删除目录及其
下的任何内容。-r选项等效于-R。-skipTrash选项将绕过垃圾桶(如果已启用),并立即删除指定的文件。
当需要从超配额目录中删除文件时,这非常有用。
-cat 显示文件内容到标准输出上。 hdfs dfs -cat URI [URI …]
-text 获取源文件并以文本格式输出文件。允许的格式为zip和TextRecordInputStream。 hdfs
dfs -text
-touchz 创建一个零长度的文件。 hdfs dfs -touchz URI [URI …]
-stat 显示文件所占块数(%b),文件名(%n),块大小(%n),复制数(%r),修改时间(%y%Y) hdfs
dfs -stat URI [URI …]
-tail 显示文件的最后1kb内容到标准输出 hdfs dfs -tail [-f] URI 选项: -f选项将
在文件增长时输出附加数据,如在Unix中一样。
-count 统计与指定文件模式匹配的路径下的目录,文件和字节数 hdfs dfs -count [-q] [-h]
< paths>
-getmerge 将源目录和目标文件作为输入,并将src中的文件连接到目标本地文件(把两个文件的内容合
并起来) hdfs dfs -getmerge < src> < localdst> [addnl] 注:合并后的文件位于当前目
录,不在hdfs中,是本地文件
-grep 从hdfs上过滤包含某个字符的行内容 hdfs dfs -cat < srcpath> | grep 过滤字段
-chown hdfs上文件权限修改 hadoop fs -chown [-R] [OWNER][:[GROUP]] URI [URI ]#修
改文件的所有者 例如:hdfs dfs -chown -R Administrator:Administrator /user/
-distcp 最常用在集群之间的拷贝:hadoop distcp hdfs://master1:8020/foo/bar
hdfs://master2:8020/bar/foo
文件有一个stat命令
文件有一个vim命令
分类
元数据
描述文件信息的数据
File 文件名
Size 文件大小(字节)
Blocks 文件使用的数据块总数
IO Block 数据块的大小
regular file:文件类型(常规文件)
Device 设备编号
Inode 文件所在的Inode
Links 硬链接次数
Access 权限
Uid 属主id/用户
Gid 属组id/组名
Access Time:简写为atime,表示文件的访问时间。当文件内容被访问时,更新这个时间
Modify Time:简写为mtime,表示文件内容的修改时间,当文件的数据内容被修改时,更新这个
时间。
Change Time:简写为ctime,表示文件的状态时间,当文件的状态被修改时,更新这个时间,例
如文件的链接数,大小,权限,Blocks数。
真实数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CrrpFs77-1656229012818)(C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220618082104567.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M0EqAgkN-1656229012820)(C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220617162658926.png)]
NameNode存放文件与Block的映射关系
NameNode会记录Block与DataNode的映射关系,但是不会持久化
文件的归属
文件的权限
文件的大小时间
Block信息,但是block的位置信息不会持久化,需要每次开启集群的时候DN上报
收集Block的信息
NN关机的时候是不会存储任意的Block与DN的映射信息 ,DN启动的时候,会将自己节点上存储的Block信息汇报给NN ,NN接受请求之后重新生成映射关系 Block–DN3 ,如果某个数据块的副本数小于设置数,那么NN会将这个副本拷贝到其他节点
NN与DN保持心跳机制,三秒钟发送一次,如果客户端需要读取或者上传数据的时候,NN可以知道DN的健康情况 ,可以让客户端读取存活的DN节点
如果DN超过三秒没有心跳,就认为DN出现异常
不会让新的数据读写到DataNode
客户访问的时候不提供异常结点的地址
如果DN超过10分钟+30秒没有心跳,那么NN会将当前DN存储的数据转存到其他节点
超时时长的计算公式为: timeout = 2 * heartbeat.recheck.interval + 10 * dfs.heartbeat.interval。 而默认的heartbeat.recheck.interval 大小为5分钟, dfs.heartbeat.interval默认为3秒。
NameNode为了效率,将所有的操作都在内存中完成
NameNode不会和磁盘进行任何的数据交换
问题:
数据的持久化
数据保存在内存中,掉电易失
存放的是文件的数据信息和验证文件完整性的校验信息
数据会存放在硬盘上
1m=1条元数据 1G=1条元数据
NameNode非常排斥存储小文件,一般小文件在存储之前需要进行压缩
汇报
启动时
汇报之前先验证Block文件是否被损坏
向NN汇报当前DN上block的信息
运行中
向NN保持心跳机制
客户可以向DN读写数据,
当客户端读写数据的时候,首先去NN查询file与block与dn的映射
然后客户端直接与dn建立连接,然后读写数据
效率:内存
安全:硬盘
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QZLApYgx-1656229012822)(E:\program\安装资料\笔记工具\Markdown\Big_Data\Linux\04.Hadoop\07.Secondary NameNode1.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZiotM438-1656229012822)(D:\应用软件\微信\WeChat Files\wxid_8da4dpgm117m22\FileStorage\MsgAttach\b8a278761eef1b34b8ccc096f5c25f0e\File\2022-06\Linux\04.Hadoop\07.Secondary NameNode2.png)]
做任何操作之前先记录日志 ,当NN下次启动的时候,只需要重新按照以前的日志“重做”一遍即可
缺点
edits文件大小不可控,随着时间的发展,集群启动的时间会越来越长
有可能日志中存在大量的无效日志
优点
绝对不会丢失数据
关机时我们可以将内存中的数据写出到硬盘上
序列化
启动时还可以将硬盘上的数据写回到内存中
反序列化
缺点
关机时间过长
如果是异常关机,数据还在内存中,没法写入到硬盘
如果写出频率过高,导致内存使用效率低(stop the world) JVM
优点
启动时间较短
解决思路(日志edits+快照fsimage)
让日志大小可控 ,定时快照保存
NameNode文件目录
解决方案
当我们启动一个集群的时候,会产生四个文件
我们每次操作都会记录日志 -->edits_inprogress-000000001
随和时间的推移,日志文件会越来越大,当达到阈值的时候(64M 或 3600秒)
dfs.namenode.checkpoint.period 每隔多久做一次checkpoint ,默认3600s
dfs.namenode.checkpoint.txns 每隔多少操作次数做一次checkpoint,默
认1000000次
dfs.namenode.checkpoint.check.period 每个多久检查一次操作次数,默认60s
会合并成新的日志文件
因为合并数据的时候需要占用和NameNode当前数据相等量的内存
然后将当前镜像与后续的日志进行叠加
如果放在NN中,NN压力太大,于是合并的操作就交给了SecondaryNameNode
但不可能NN每次执行都合并一次并写出,于是设置了一个阀值:
3600s与64M
强行杀死NameNode节点
清空namenode下name中的fsimage和edtis文件
[root@node01 ~]# rm -rf /var/yjx/hadoop/full/dfs/name/current/*
secondary namenode下的name中的fsimage和edits复制到namenode对应文件夹中
[root@node01 ~]# scp -r
root@node02:/var/yjx/hadoop/full/dfs/namesecondary/current/*
/var/yjx/hadoop/full/dfs/name/current
启动namenode
访问namenode节点页面,成功
[root@node01 ~]# rm -rf /var/yjx/hadoop/full/dfs/name/current/*
集群启动时的一个状态
安全模式是HDFS的一种工作状态,处于安全模式的状态下,只向客户端提供文件的只读视图,不接受对命名空间的修改;同时NameNode节点也不会进行数据块的复制或者删除,
集群启动时 主节点先载入镜像文件(快照) 执行最新日志里的各项操作 创建新的日志
然后进入安全模式 数据节点向主节点汇报当前节点所拥有的有效节点
如果节点启动失败,块的副本数达不到最小要求,主节点会将块复制到其他数据节点上
NameNode启动时,
系统中的数据块的位置并不是由NameNode维护的,而是以块列表的形式存储在DataNode中。
安全模式下
如果NN收集的Block信息没有达到最少副本数,就会将缺失的副本,从有的DN上拷贝到其他DN
安全模式相关命令
hadoop dfsadmin -safemode leave 强制NameNode退出安全模式
hadoop dfsadmin -safemode enter 进入安全模式
hadoop dfsadmin -safemode get 查看安全模式状态
hadoop dfsadmin -safemode wait 等待一直到安全模式结束
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q19SCONS-1656229012823)(C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220618162400621.png)]
就是块选择DateNode 的一种策略, 为了保证副本在集群的安全性
写数据就是将客户端的数据上传到HDFS
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v5yIg5iO-1656229012826)(C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220618175312378.png)]
Active NameNode 的功能和原理的NN的功能是一样的
接受客户端请求,查询数据块DN信息
存储数据的元数据信息
工作
存储介质
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7fxCQBAv-1656229012827)(C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220618175955430.png)]
Standby NameNode:NN的备用节点
他和主节点做同样的工作,但是它不会发出任何指令
存储:数据的元数据信息
工作
存储介质
合并日志和镜像
当搭建好集群的时候,格式化主备节点的时候,ANN和SNN都会会默认创建
当我们操作HDFS的时候ANN会产生日志信息
主节点会将日志文件中新增的数据同步到JournalNode集群上
所以只需要snn有操作的日志信息,就可以合并fsImage与edits信息,理论上是一直在合并数据
SNN将合并好的Fsimage发送给ANN,ANN验证无误后,存放到自己的目录中
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wEMOBG2q-1656229012827)(C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220619160507423.png)]
存储
介质
启动时
运行中
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8YJJOvbv-1656229012827)(C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220619160849482.png)]
Quorum JournalNode Manager 共享存储系统,NameNode通过共享存储系统实现日志数据同步。
JournalNode是一个独立的小集群,它的实现原理和Zookeeper的一致( Paxos)
ANN产生日志文件的时候,就会同时发送到 JournalNode的集群中每个节点上
JournalNode不要求所有的jn节点都接收到日志,只要有半数以上的(n/2+1)节点接受收到日志,那么本条日志就生效
SNN每间隔一段时间就去QJM上面取回最新的日志
HA集群的状态正确至关重要,一次只能有一个NameNode处于活动状态。
JournalNode只允许单个NameNode成为作者。在故障转移期间,将变为活动状态的NameNode将承担写入JournalNodes的角色,这将有效地防止另一个NameNode继续处于活动状态,从而使新的Active节点可以安全地进行故障转移
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mc63ynOt-1656229012828)(C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220619162006808.png)]
Failover Controller(故障转移控制器)
对 NameNode 的主备切换进行总体控制,能及时检测到 NameNode 的健康状况
启动时:
运行时:
主备节点正常切换
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D6o5eJ6O-1656229012828)(C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220619162534906.png)]
为主备切换控制器提供主备选举支持。
辅助投票
和ZKFC保持心跳机制,确定ZKFC的存活
定义:
脑裂是Hadoop2.X版本后出现的全新问题,实际运行过程中很有可能出现两个namenode同时服务于整个集群的情况,这种情况称之为脑裂。
原因:
脑裂通常发生在主从namenode切换时,由于ActiveNameNode的网络延迟、设备故障等问题,另一个NameNode会认为活跃的NameNode成为失效状态,此时StandbyNameNode会转换成活跃状态,此时集群中将会出现两个活跃的namenode。因此,可能出现的因素有网络延迟、心跳故障、设备故障等。
脑裂场景:
NameNode 可能会出现这种情况,NameNode 在垃圾回收(GC)时,可能会在长时间内整个系统无响应
zkfc客户端也就无法向 zk 写入心跳信息,这样的话可能会导致临时节点掉线,备 NameNode
会切换到 Active 状态
这种情况可能会导致整个集群会有同时有两个Active NameNode
解决方案:
方案一:
方案二:
如果集群发生脑裂,我们要保证只有一个NN的命令是有效的, 即使有多个NN发送指令, 倒是只有一个命令会被认可
简介
EC技术
Yarn:
提供YARN的时间轴服务V.2,以便用户和开发人员可以对其进行测试,并提供反馈意见
优化Hadoop Shell脚本
重构Hadoop Client Jar包
支持随机Container
MapReduce任务级本地优化
支持文件系统连接器
MapReduce计算框架必须基于HSDFS之上, 他是一个离线的计算框架, 所以有很高的延迟性,
1 )MapReduce 易于编程
它简单的实现一些接口, 就可以完成一个分布式程序, 这个分布式程序可以分布到大量廉价的 PC 机器上运行。也就是说你写一个分布式程序,跟写一个简单的串行程序是一模一样的。就是因为这个特点使得 MapReduce 编程变得非常流行。
2 ) 良好的扩展性
当你的计算资源不能得到满足的时候, 你可以通过简单的增加机器来扩展它的计算能力。
3 ) 高容错性
MapReduce 设计的初衷就是使程序能够部署在廉价的 PC 机器上, 这就要求它具有很高的容错性。比如其中一台机器挂了,它可以把上面的计算任务转移到另外一个节点上运行,不至于这个任务运行失败, 而且这个过程不需要人工参与, 而完全是由Hadoop内部完成的。
4 ) 适合 PB 级以上海量数据的离线处理
可以实现上千台服务器集群并发工作,提供数据处理能力。
1 ) 不擅长实时计算
MapReduce 无法像 MySQL 一样,在毫秒或者秒级内返回结果。
2 ) 不擅长流式计算
流式计算的输入数据是动态的, 而 MapReduce 的输入数据集是静态的, 不能动态变化。
这是因为 MapReduce 自身的设计特点决定了数据源必须是静态的。
3 ) 不擅长 DAG (有向无环图)计算
多个应用程序存在依赖关系,后一个应用程序的输入为前一个的输出。在这种情况下,MapReduce 并不是不能做, 而是使用后, 每个 MapReduce 作业的输出结果都会写入到磁盘,会造成大量的磁盘 IO,导致性能非常的低下。
原始数据 File
将1T数据切分成块 存放在HDFS上 每一块128M
数据块Block
块的大小一样且不可改变 可能出现块的数量和集群计算能力不匹配 需要一个单位进行动态调节
切片Split
切片是一个逻辑概念,在不改变数据存储情况下,控制参与计算的节点数目
一个切片对应一个MapTask映射任务,一般切片大小为Block的整数倍(2 1/2)
计算节点 MapTask
map默认每次从切片中读取一行到内存中进行计算,这会产生大量临时数据 内存空间大小有限
存硬盘效率太低 此时提出了 环形数据缓冲区 的方案用来解决
环形数据缓冲区
在内存中构建了一个100M的环形数据缓存区,设阈值为80%,当数据达到80M时开始向硬盘中溢写数据
同时还剩20M的空间可以使用效率不会被减缓,数据写到硬盘后腾出空间可以继续运算
存储到硬盘的过程中
**分区Partation:**根据Key直接计算出对应的Reduce Key指我需要的结果
**排序Sort:**将溢写的数据按照先 Partation(分区)后以Key的顺序进行排序
**溢写Spill:**将内存计算后的数据存储到硬盘上,避免OOM 每次产生一个80M的文件
从硬盘中取每个节点数据结果时
**合并Merge:**溢写会产生很多有序的小文件,将这些有序的文件合并成一个有序的大文件, 就是把每个计算节点生成的好几个80m的小文件合成一个大的结果 ,合并小文件的时候同时进行排序(归并排序),最终产生一个有序的大文件 计算节点数量=文件数量
组合器combiner
对每一个maptask的输出进行局部汇总,以减小网络传输量
最后汇总数据
**拉取Fetch:**将Map的临时结果拉取到对应Reduce节点 相同的Key必须拉取到同一个Reduce节点 Reduce节点可以有多个Key, 就是说从每个结算节点的计算结果中拉取需要的数据,因为有多个计算节点所以会拉取到好几份数据
**合并Merge:**拉取的时候会从多个Map中拉取数据, 将这些有序的小文件再归并成大文件
写出Output:最后将结果写出:每个reduce将自己计算的最终结果都会存放到HDFS上
可以循环利用这块内存区域,减少数据溢写时map的停止时间
每一个Map可以独享的一个内存区域
在内存中构建一个环形数据缓冲区(kvBuffer),默认大小为100M
设置缓冲区的阈值为80%,当缓冲区的数据达到80M开始向外溢写到硬盘
溢写的时候还有20M的空间可以被使用效率并不会被减缓
而且将数据循环写到硬盘,不用担心OOM问题
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TOBr2rYj-1656229012829)(C:\Users\胡MS\AppData\Roaming\Typora\typora-user-images\image-20220620171951211.png)]
combiner的意义就是对每一个maptask的输出进行局部汇总,以减小网络传输量。
yarn是Hadoop集群的资源管理者
client
ResourceManager
NodeManager
Container
ApplicationMaster
Task(MapTask–ReduceTask)
四大组件:(四个进程)
ResourceManager(Rm):主进程
Nodemanager(NM):各个机器节点管理器
ApplicationMaster(AM):申请资源
Container容器:处理各个节点分布式作业的

(1) MR程序提交到客户端所在的节点。
(2)Yarn Runner向ResourceManager申请一个Application。
(3)RM将该应用程序的资源路径返回给YarnRunner。
(4)该程序将运行所需资源提交到HDFS上。
(5)程序资源提交完毕后,申请运行mrAppMaster。
(6)RM将用户的请求初始化成一个Task。
(7)其中一个NodeManager领取到Task任务。
(8)该NodeManager创建容器Container,并产生MAppmaster。
(9)Container从HDFS上拷贝资源到本地。
(10)MRAppmaster向RM 申请运行MapTask资源。
(11)RM将运行MapTask任务分配给另外两个NodeManager,另两个NodeManager分别领取任务并创建容器。
(12)MR向两个接收到任务的NodeManager发送程序启动脚本,这两个NodeManager分别启动MapTask,MapTas对数据分区排序。
(13)MrAppMaster等待所有MapTask运行完毕后,向RM申请容器,运行ReduceTask。
(14)ReduceTask向MapTask获取相应分区的数据。
(15)程序运行完毕后,MR会向RM申请注销自己。