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

hsvhsicv  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(407)

最近一位面试官问我这个问题:
在hadoop中,“如何将整个文件作为输入提供给mapper?”
我说通过配置块大小或分割大小等于文件大小。
他说这是错误的。你能告诉我正确的答案吗。我在谷歌上搜索了一下,但没有得到答案。

8zzbczxx

8zzbczxx1#

面试官想知道通过gzip压缩输入文件可以使issplitable返回false。
在这种情况下,mapreduce会做正确的事情,不会尝试分割gzip文件,因为它知道输入是gzip压缩的(通过查看文件扩展名),并且gzip不支持分割。
这将起作用,但以牺牲局部性为代价:单个Map将处理所有hdfs块,其中大多数块不是Map的局部块。此外,使用更少的Map,作业的粒度更小,因此可能需要更长的时间才能运行。

huwehgph

huwehgph2#

如果你这样说的话,我想他不喜欢“配置块大小”的部分。
编辑:不知何故,我认为改变块大小是一个坏主意,因为它是全局的hdfs。
另一方面,防止拆分的解决方案是将最小拆分大小设置为大于要Map的最大文件。
一个更干净的解决方案是将相关的inputformat实现子类化。特别是通过重写isspitable()方法返回false。在您的情况下,可以使用fileinputformat执行以下操作:

public class NoSplitFileInputFormat extends FileInputFormat 
{

    @Override
    protected boolean isSplitable(JobContext context, Path file) 
    {
        return false;
    }
}

相关问题