在为MapReduce作业编写代码时,如果我们手动设置减速器的数量,则发送到某个减速器的数据可能很大。在这种情况下,reducer任务可以同时在多个节点上运行吗?也许通过将List<Value>
中的数据除以一个键,然后在内部合并?
如果reducer无法自动调整它要使用的节点数,那么我们如何处理可能与键对应的值分布不均的情况? default hadoop MapReduce partitioner分区基于哈希值,并未考虑与密钥对应的List<Value>
的大小。
答案 0 :(得分:2)
不,减速机不会自动调节。如果它的工作量太大,它就会崩溃。
您可以做的最好(可能)是编写自己的自定义分区程序,在减速器之间均匀分配工作负载。这样做并不总是那么容易,因为您可能需要对数据进行采样或估算,甚至是额外的计数工作,并编写满足您问题需求的适当负载平衡算法。
您想要的,可能不是基于每个键的值的大小来分配负载,而是基于reducer将执行的计算(这两个并不总是相同)。