一位采访者最近问我这个问题:
在Hadoop中,“如何将整个文件作为输入提供给mapper?”
我说通过配置块大小或分割大小等于文件大小。
他说这是错的。 你能告诉我正确的答案吗?我用Google搜索但没有得到答案。答案 0 :(得分:3)
好吧,如果你告诉它,我认为他不喜欢“配置块大小”部分。
编辑:不知怎的,我认为更改块大小是一个坏主意,因为它对HDFS是全局的。
另一方面,防止分裂的解决方案是将 min split size 设置为比要映射的最大文件大。
更清洁的解决方案是子类化相关的InputFormat实现。特别是通过重写isSpitable()方法来返回false。在你的情况下,你可以使用FileInputFormat执行类似的操作:
public class NoSplitFileInputFormat extends FileInputFormat
{
@Override
protected boolean isSplitable(JobContext context, Path file)
{
return false;
}
}
答案 1 :(得分:3)
面试官想听听你可以通过gzip压缩输入文件让isSplitable返回false。
在这种情况下,MapReduce将做正确的事情,而不是尝试拆分gzip文件, 因为它知道输入是gzip压缩的(通过查看文件扩展名) 并且gzip不支持拆分。
这将起作用,但是以牺牲局部性为代价:单个地图将处理所有HDFS块,其中大多数块不是地图的本地块。此外,由于地图较少,作业的粒度较小,因此可能需要更长时间才能运行。