wKioL1dSZv2ixUCMAAYxguhShCc473.png-wh_50

wKioL1dSZv-QoWDMAAPRGF9EtIw230.png-wh_50

wKiom1dSZf7gjuXVAALFYYzZLow783.png-wh_50

wKiom1dSZgDhFq7AAAU9EkNqGzA155.png-wh_50

MapReduce 如何解决负载均衡和数据倾斜:

阶段主要出在Map作业结束后,shuffer(洗牌)过程中,如何将map处理后的结果分成多少份,交由Reduce作业,使得每部分reduce作业尽可能均衡处理数据计算。

系统默认将partitions  按照Hash模运算分割(存储对象的hash值与reduce的个数取模),这样很容易出现数据倾斜,导致其中一个reduce作业分得大量数据计算,另一个ruduce作业基本上没有任何数据处理。如何,解决的这种事情,就需要靠程序控制partitions的值

 

Sort:默认排序是按照字典排序的(按ASCII

 

Shuffer阶段比较的操作要执行两次,一次是map task之后的sort另一次是在从本次磁盘将partition数据拷贝到指定reduce 之前的合并,将符合统一范围的key的数据归并



wKioL1dSZwbjVUaiAAX1-_kHMG0135.png-wh_50

wKioL1dSZwuDIt9GAAkSsVz73Bc988.png-wh_50

面试:

1.partition:将map输出的数据,按照某种规则将数据划分,分给哪一个reduce,默认使用hash模运算执行

  2.spill

    过程:map的内存缓存区数据填满时,启动一个单独的线程,将数据按照一定比例写入本地磁盘。

 Sort:将数据按照大小排序(可自定义)默认字典排序

 Combiner:(可有可无)将相同的K_V中的value加起来,减少溢写磁盘的数据

wKiom1dSZgrgQdmNAAOtPq5opWM697.png-wh_50

Shuffer的后半过程:

 map处理后放入map节点的本地磁盘的数据拷贝到rudece节点的内存中 去,数据量少的话,直接交由reduce处理。数据量大的时候,同样需要溢写到磁盘中,按照K值相同的方法进行merge,然后在交由指定的reduce执行


wKiom1dSZ__Sn1vQAAE1n8Wg_GE533.png-wh_50


修改默认hdfsblock大小:

这个需要修改hdfs-site.conf配置文件,增加全局参数dfs.block.size

如下:

修改后参数,

把配置同步到其它节点,并重启hdfs

wKioL1dSZw2QeONNAABKU-uwWMs281.png-wh_50


wKiom1dSZguwuvUTAAIfEaGPaOU952.png-wh_50