我刚刚浏览了MapReduce中的单词计数示例。地图功能非常简单。是否有更高级别的函数来决定文件的哪个部分转到哪个映射器? 假设您依赖于依赖于整个文件输入的函数(例如SHA1),是否有任何告诉框架不要拆分文件?
答案 0 :(得分:2)
是否有更高级别的函数来决定文件的哪个部分转到哪个映射器?
当节点上的映射槽空闲时,调度程序会选择最接近节点的拆分,以尽可能避免数据传输。如果未处理的输入拆分与空闲映射插槽位于同一节点上,则处理该拆分,否则将选择同一机架中的拆分,或者选择在机架外部拆分。
有没有告诉框架不要拆分文件?
实施FileInputFormat#isSplitable()。然后输入文件不会被拆分,并且每个地图都会处理一次。
import org.apache.hadoop.fs.*;
import org.apache.hadoop.mapred.TextInputFormat;
public class NonSplittableTextInputFormat extends TextInputFormat {
@Override
protected boolean isSplitable(FileSystem fs, Path file) {
return false;
}
}
答案 1 :(得分:1)
您可以在Hadoop中编写自定义InputSplit和RecordReader。您可以对这些方法进行编程,以告诉框架以您希望的方式拆分输入文件。