参考:https://blog.csdn.net/thomas0yang/article/details/8562910
http://www.sohu.com/a/147016674_487514

hadoop有不同版本之分,写这篇文章的时候已经有版本3了,但是主要还是以版本二为主,1 2 的主要不同是在mapreduce部分
尤其是资源管理部分由原来的tasktracker  JobTracker转为了YARN,而计算部分没变。另HDFS也没怎么变,作为一个新手,试着记录一下自己的理解吧。

整个hadoop的框架是先用HDFS存储数据,上面加上YARN用于资源管理,在上面用mapreduce进行计算。
HDFS分为namenode 和n多个datanode,(一般每个节点放一个datanode)前者负责记录信息,后者负责存储实际的数据,YARN分为sourcemanager  和nodemanager,前者负责整体的资源调度,每个节点的nodemanager负责本节点的计算啊,结果啊,资源等信息。
也就是:客户想要做一件事,先把数据给HDFS,其中的namenode告诉应该怎么分,哪一块存在哪个datanode上,把信息返回给客户(job.split),客户再把数据分配方式,程序jar  xml等一堆文件给yarn,yarn看了一眼job.split,分了3个块,告诉管家appmaster那就启动3个maptask(尽量在数据节点上启动相应的maptask)。maptask一行行的读取目标文件,交给map程序,处理完之后把结果写出去,保存到本机的一个结果文件,这个文件中的内容是分区且有序的,分区的作用就是定义那些key在一组,一个分区对应一个reducer.具体过程如下:

mapreduce中的shuffle和sort分析:当客户向mapreduce框架提交一个计算作业时,会首先把计算作业拆分成若干个Map.分配到不同的节点上去执行,每个map结束产生输出的时候先写到内存(并做一些预排序),到了一定数量之后spill到磁盘(spill线程在写到此盘前会进行二次排序,首先按照所属的partition(eg:在wordcount例子中,把a-g分为p1,h-n为p2),然后在p中按照key排序)如果有combiner(map节点上的小reduce先能合并的就合并)的话在这个基础上进行,然后输出一个索引文件和数据文件。,因为一个map节点会spill好多次,会有好多个spill文件,所以完成最后一次spill之后要合并(partition),归并成一个索引文件和数据文件。然后压缩(减小写入磁盘的速度),然后把文件写到本节点的磁盘上(删除之前临时的spill文件),这样map节点工作完成。

之后是reduce阶段,用http读取对应数据(这个过程有每个nodemanager和sourcemanager沟通,得到获取方式),每个map节点都处理着不同的partition数据,如果有N个partion数据appmaster就生成N个reduce节点,每个节点读取不同partition,这样不同的reduce节点就分别从每个map节点获取相应的partition结果,然后进行reduce操作,比如把相同key的数量加到一起,获取相应的结果。完成每个节点的reduce操作,之后就是把结果存储到HDFS上。

以上就是hadoop的处理过程,简要的包含了HDFS存储的方式,yarn资源管理的方式和mapreduce的处理过程。
得出结论:每个节点的map操作完成后不写入结果到HDFS而是写到相应结果的磁盘,之后在对应的reduce之后才写入HDFS。

盗个图:来自上方引用的两篇之一。hadoop mapreduce原理和流程

相关文章:

  • 2021-04-10
  • 2021-04-14
  • 2021-12-25
  • 2022-12-23
  • 2021-05-08
  • 2018-04-29
  • 2022-03-02
  • 2021-06-10
猜你喜欢
  • 2021-04-30
  • 2021-09-25
  • 2021-09-19
  • 2021-09-27
  • 2021-07-18
  • 2021-04-20
相关资源
相似解决方案