Hadoop数据本地化

来源:互联网 发布:java笔试选择题及答案 编辑:程序博客网 时间:2024/06/08 14:30
首先需要知道,hadoop数据本地化是指的map任务,reduce任务并不具备数据本地化特征。
      通常输入的数据首先将会分片split,每个分片上构建一个map任务,由该任务执行执行用户自定义的map函数,从而处理分片中的每条记录。
      那么切片的大小一般是趋向一个HDFS的block块的大小。为什么最佳的分片大小是趋向HDFS块的大小呢?是因为这样能够确保单节点上最大输入块的大小,如果分片跨越两个数据块,没有一个HDFS能够同时存储这两块数据,因此需要通过网络传输将部分数据传输到map任务节点上。这样明显比使用本地数据的map效率更低。
       注意,map任务执行后的结果并没有写到HDFS中,而是作为中间结果存储到本地硬盘,那为什么没有存储到HDFS呢?因为,该中间结果会被reduce处理后产生最终结果后,该中间数据会被删除,如果存储到HDFS中,他会进行备份,这样明显没有意义。如果map将中间结果传输到reduce过程中出现了错误,Hadoop会在另一个节点上重新执行map产生中间结果。
       那么为什么reduce没有数据本地化的特点呢?对于单个reduce任务来说,他的输入通常是所有mapper经过排序输出,这些输出通过网络传输到reduce节点,数据在reduce节点合并然后由reduce函数进行处理。最终结果输出到HDFS上。当多个有reduce任务的时候,map会针对输出进行分区partition,也就是为每个reduce构建一个分区,分区是由用户指定的partition函数,一般是默认的哈希函数进行分区,效率很高。
     同时为了高效传输可以指定combiner函数,他的作用就是,减少网络传输和本地传输