在Hadoop中拥有更小/更大的块需要做些什么?
具体来说,我希望拥有更多的映射器,这些映射器可以处理更小的数据。似乎我需要减小块大小,但我很困惑(我是Hadoop的新手) - 在将文件放在HDFS上时是否需要做某事,或者我是否需要指定与输入分割大小相关的内容或两者兼而有之?
我正在共享群集,因此我无法执行全局设置,因此如果可能,需要在每个作业的基础上进行此操作吗?我正在从代码中运行这项工作(稍后可能来自Oozie)。
答案 0 :(得分:1)
映射器的运行由输入拆分控制,完全取决于您如何指定它。 HDFS块大小 nothing 与它有关(除了大多数分割器使用块大小作为基本'块'来创建输入分割以实现良好数据局部性的事实)。你可以编写自己的拆分器,它接受一个HDFS块并分成100个分区,如果你这么喜欢的话。 Aslo看看Change File Split size in Hadoop。
现在有人说,做到这一点的智慧(“许多有小分裂的地图制作者”)是非常值得怀疑的。其他人都试图执行相反的(创建几个具有聚合分割的映射器)。请参阅Dealing with Hadoop's small files problem,The Small Files Problem,Amazon Elastic MapReduce Deep Dive and Best Practices等。
答案 1 :(得分:1)
你真的不必减少块大小以拥有更多的映射器,这将处理更少量的数据。
您不必修改HDFS块大小(dfs.blocksize
),根据您的群集配置使用默认全局值。
您可以在作业配置中使用mapreduce.input.fileinputformat.split.maxsize
属性,其值小于块大小。
将使用此值计算输入拆分,并为计算的每个输入拆分触发一个映射器。