最近一位面试官问我这个问题:在hadoop中,“如何将整个文件作为输入提供给mapper?”我说通过配置块大小或分割大小等于文件大小。他说这是错误的。你能告诉我正确的答案吗。我在谷歌上搜索了一下,但没有得到答案。
8zzbczxx1#
面试官想知道通过gzip压缩输入文件可以使issplitable返回false。在这种情况下,mapreduce会做正确的事情,不会尝试分割gzip文件,因为它知道输入是gzip压缩的(通过查看文件扩展名),并且gzip不支持分割。这将起作用,但以牺牲局部性为代价:单个Map将处理所有hdfs块,其中大多数块不是Map的局部块。此外,使用更少的Map,作业的粒度更小,因此可能需要更长的时间才能运行。
huwehgph2#
如果你这样说的话,我想他不喜欢“配置块大小”的部分。编辑:不知何故,我认为改变块大小是一个坏主意,因为它是全局的hdfs。另一方面,防止拆分的解决方案是将最小拆分大小设置为大于要Map的最大文件。一个更干净的解决方案是将相关的inputformat实现子类化。特别是通过重写isspitable()方法返回false。在您的情况下,可以使用fileinputformat执行以下操作:
public class NoSplitFileInputFormat extends FileInputFormat { @Override protected boolean isSplitable(JobContext context, Path file) { return false; } }
2条答案
按热度按时间8zzbczxx1#
面试官想知道通过gzip压缩输入文件可以使issplitable返回false。
在这种情况下,mapreduce会做正确的事情,不会尝试分割gzip文件,因为它知道输入是gzip压缩的(通过查看文件扩展名),并且gzip不支持分割。
这将起作用,但以牺牲局部性为代价:单个Map将处理所有hdfs块,其中大多数块不是Map的局部块。此外,使用更少的Map,作业的粒度更小,因此可能需要更长的时间才能运行。
huwehgph2#
如果你这样说的话,我想他不喜欢“配置块大小”的部分。
编辑:不知何故,我认为改变块大小是一个坏主意,因为它是全局的hdfs。
另一方面,防止拆分的解决方案是将最小拆分大小设置为大于要Map的最大文件。
一个更干净的解决方案是将相关的inputformat实现子类化。特别是通过重写isspitable()方法返回false。在您的情况下,可以使用fileinputformat执行以下操作: