hadoop基础与实践--流程解惑

      看过好多本hadoop的书,对整个过程始终存在一些疑问,今天终于搞清楚了。立个low-flag。

整体架构好复杂的感觉?其实不复杂

      整体架构,namenode/metanode负责维护所有的元数据,datanode负责实际的物理存储,同一份数据datanode上必定多个副本,从而保证高可用。

hdfs只是个文件系统,有那么重要吗?

      hdfs,最核心组件,高可用,不适合处理碎片文件。所有存储相关都是hdfs的职责范围。

mapreduce感觉很简单,但是具体背后的逻辑是什么?

      mapreduce,核心组件。一个任务会首先从hdfs取出被inputformat切分成多个<k,v>,然后分配到mapper程序运行,运行后输出新的<k,v>,再由partioner处理mapper结果,成为<k,v list>,此处保证所有相同的k,必定会组织到一起,再传给reducer处理,完成后输出最终结果到hdfs。

      inputformat,分片操作,根据splitsize决定将源文件进行划分,数据格式化,将划分好的inputsplit格式化为<k,v>,k为偏移量(已跳过的字符数),v为每一行的内容,并每次生成一个kv就调一次mapper。

      shuffle,mapper到reducer之间,主要起到承上启下的作用。(不然mapred怎么工作?)

      mapper的shuffle,sort,combine,pation.

      mapper的shuffle,达到设置值的0.8就开始进行sort,spill溢写文件,如果剩下的0.2缓存已写满,但是spill还没完成,则会阻塞map操作。combine其实就是一次reduce的一个实现,预处理reduce。当某个map任务完成后,一般会有多个spill文件,会进行归并排序,将spill合并为一个文件,并在合并时提供partion,存储在index索引文件中。当reducer来取时,就会参照这个文件进行取用。

      reducer的shuffle,当一个mapper完成时,就会通知tasktracker,然后,reducer就会通过http协议来取数据了。reducer取到partion后,会先放jvmheap,达到设定值后,也会进行sort写入磁盘。和mapper的spill过程类似。reducerr把merge sort 完成后,就直接调用reduce函数了。

      最后,是写入hdfs。outputformat,描述数据的输出形式,生成相应的类对象,调用write方法写入到hdfs,默认调用文本写入方法。

      至此,mapred过程基本完成,总算捋清楚了。

      理解了以上,写起mapreduce的简单函数,自然没问题了,处理一些基本问题也顺心了许多。同时,也只有在理解整个过程的前提上,才能找到适用场景。

       后续其他技术,且等且实践。(基础很重要)

原文地址:https://www.cnblogs.com/yougewe/p/9181247.html