我可以通过将输入数据拆分成更小的块来增加hadoop map / reduce作业的性能时间吗?
第一个问题: 例如,我有1GB的输入文件用于映射任务。我的默认块大小为250MB。因此,只会分配4个映射器来完成这项工作。如果我将数据分成10个部分,每个部分将是100MB,那么我有10个映射器来完成工作。但是,每个拆分件将占用存储器中的1个块,这意味着每个拆分数据块将浪费150MB。如果我不想更改存储空间的块大小,我该怎么办?
第二个问题:如果我在映射作业之前拆分输入数据,它可以提高映射作业的性能。因此,如果我想减少工作量,我应该让mapper在将数据提供给reducer之前拆分数据,还是应该让reducer执行此操作?
非常感谢你。如果我也误解了一些事情,请纠正我。 Hadoop对我来说很新鲜。所以任何帮助都表示赞赏。
答案 0 :(得分:2)
当您将块大小更改为100 MB时,150 MB的不会被浪费。它仍然是系统的可用内存。
如果增加Mappers,并不意味着它肯定会提高性能。因为它取决于您拥有的datanode数量。例如,如果您有10个DataNode - > 10 Mapper,这是一个很好的协议。但是如果你有4个datanode - > 10 Mapper,显然所有的映射器都不能同时运行。因此,如果您有4个数据节点,最好有4个块(块大小为250MB)。
Reducer就像是所有地图制作者的合并。输出,你不能要求Mapper分割数据。相反,您可以通过定义Combiner
让Mapper进行迷你缩减。组合器只是执行映射器的同一节点中的reducer,在发送到实际的reducer之前运行。因此I / O将被最小化,实际减速器的工作也将被最小化。引入Combiner将是提高性能的更好选择
祝Hadoop好运!!
答案 1 :(得分:1)
根据节点中可用的映射插槽数,可以在节点中为同一作业运行多个并行映射器。因此,是制作较小的输入部分应该为您提供更多并行映射器并加快处理速度。(如何将所有部分输入为单个输入? - 将所有部分放在一个目录中并添加作为输入路径)
在减速机方面你可以组合后处理的多个输出文件,你可以设置更多的减速机数量和最大并行减速机运行可能是你的集群中可用的减少数量。这应该可以提高集群利用率并加快减少阶段。
如果可能,您也可以使用组合器来减少磁盘和网络i / o开销。