在Hadoop中,"如何将整个文件作为输入提供给mapper?"

时间:2014-02-04 13:26:26

标签: hadoop mapreduce hdfs bigdata

一位采访者最近问我这个问题:

在Hadoop中,“如何将整个文件作为输入提供给mapper?”

我说通过配置块大小或分割大小等于文件大小。

他说这是错的。 你能告诉我正确的答案吗?我用Google搜索但没有得到答案。

2 个答案:

答案 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块,其中大多数块不是地图的本地块。此外,由于地图较少,作业的粒度较小,因此可能需要更长时间才能运行。