MapReduce 如何解决负载均衡和数据倾斜:
阶段主要出在Map作业结束后,shuffer(洗牌)过程中,如何将map处理后的结果分成多少份,交由Reduce作业,使得每部分reduce作业尽可能均衡处理数据计算。
系统默认将partitions 按照Hash模运算分割(存储对象的hash值与reduce的个数取模),这样很容易出现数据倾斜,导致其中一个reduce作业分得大量数据计算,另一个ruduce作业基本上没有任何数据处理。如何,解决的这种事情,就需要靠程序控制partitions的值
Sort:默认排序是按照字典排序的(按ASCII)
Shuffer阶段比较的操作要执行两次,一次是map task之后的sort另一次是在从本次磁盘将partition数据拷贝到指定reduce 之前的合并,将符合统一范围的key的数据归并
面试:
1.partition:将map输出的数据,按照某种规则将数据划分,分给哪一个reduce,默认使用hash模运算执行
2.spill:
过程:map的内存缓存区数据填满时,启动一个单独的线程,将数据按照一定比例写入本地磁盘。
Sort:将数据按照大小排序(可自定义)默认字典排序
Combiner:(可有可无)将相同的K_V中的value加起来,减少溢写磁盘的数据
Shuffer的后半过程:
将map处理后放入map节点的本地磁盘的数据拷贝到rudece节点的内存中 去,数据量少的话,直接交由reduce处理。数据量大的时候,同样需要溢写到磁盘中,按照K值相同的方法进行merge,然后在交由指定的reduce执行
修改默认hdfs的block大小:
这个需要修改hdfs-site.conf配置文件,增加全局参数dfs.block.size。
如下:
修改后参数,
把配置同步到其它节点,并重启hdfs。
原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/191139.html