1、数据从input split中进来。
input split有多大,与hdfs文件切块有什么关系?
首先,hadoop2.0的hdfs文件切块是128M,这是定死的,称为物理切块。
inputsplit默认也是128M和hdfs文件切块保大小持一致,称为逻辑切块。既然是逻辑切块,说明他的大小是可变的,如果设置小于或者大于hdfs的物理切块都会带来横跨两个物理切块的可能,会带来数据网络传输的延时。
例:(1)假如设置逻辑块inputsplit大小为64M,那么刚好一个hdfs物理切块可以分成两个逻辑切块,就不需要去其他机器上拉取数据。(2)假如设置逻辑块inputsplit大小为65M,那么一个hdfs物理切块只够一个逻辑切块,少了2M,而下一个物理切块又不在这台机器上,就必须去其他机器上拉取数据。(3)如果逻辑切块大于物理切块也是同样的道理。
例:一个1G大小的文件存储在hdfs上,会被切成8个物理块。如果逻辑块设置成100M就会有11个inputsplit。
综上:hdfs文件切块大小和inputsplit大小没有硬性联系,但是为了计算方便省去不必要的麻烦,往往设置成相同大小。
2、map函数是对数据进行一个操作,如果是word count任务的话,就是对一句话中的单词计数,比如说:
3、经过map操作之后的数据肯定是要到内存中的,内存缓存区实行spill to disk(溢出到磁盘),map将输出不断写入到这个缓冲区中,当缓冲区使用量达到一定比例之后,一个后台线程开始把缓冲区的数据写入磁盘,这个写入的过程叫spill。开始spill的Buffer比例默认为0.80,可以通过mapreduce.map.sort.spill.percent配置。在后台线程写入的同时,map继续将输出写入这个环形缓冲,如果缓冲池写满了,map会阻塞直到spill过程完成,而不会覆盖缓冲池中的已有的数据。
4、spill的时候做了两件事情:(1)同一分区的数据聚集到一起。(2)同一分区的数据根据key值排序。
5、map task和reduce task是两个进程,同一个任务的两个进程可以在同一台机子上完成,也可以在不同的机子上完成。现实大部分的情况都是在两台机子上。
6、merge on disk就是为了把多个spill文件合并成一个。
7、
8、reduce task的数量是在driver中指定的,partition数量和reduce task的数量要一致,map执行完以后不同分区发往不同reduce task执行。