我是hadoop的新手,我正在wordcount示例中处理大量的小文件。它需要很多Map任务,并导致执行速度减慢。如何减少Map任务的数量??如果我的问题的最佳解决方案是将小文件转换成大文件,我如何才能转换它们?
anhgbhbe1#
如果你用的是 TextInputFormat ,问题是每个文件至少有一个拆分,因此Map数的上限是文件数,在您有许多非常小的文件的情况下,最终会有许多Map者处理每个非常小的数据。要解决这个问题,你应该使用 CombineFileInputFormat 它会将多个文件打包到同一个分割中(我认为最多可以达到块大小限制),因此使用这种格式,Map器的数量将独立于文件的数量,它将仅仅取决于数据量。您必须通过扩展 CombineFileInputFormt ,您可以在这里找到一个实现。一旦你有了 InputFormat 定义好了,让我们在链接中这样称呼它 CombinedInputFormat ,你可以告诉你的工作如何使用它:
TextInputFormat
CombineFileInputFormat
CombineFileInputFormt
InputFormat
CombinedInputFormat
job.setInputFormatClass(CombinedInputFormat.class);
e3bfsja22#
cloudera在不久前发布了一篇关于小文件问题的博客。这是一个旧条目,但建议的方法仍然适用。
2条答案
按热度按时间anhgbhbe1#
如果你用的是
TextInputFormat
,问题是每个文件至少有一个拆分,因此Map数的上限是文件数,在您有许多非常小的文件的情况下,最终会有许多Map者处理每个非常小的数据。要解决这个问题,你应该使用
CombineFileInputFormat
它会将多个文件打包到同一个分割中(我认为最多可以达到块大小限制),因此使用这种格式,Map器的数量将独立于文件的数量,它将仅仅取决于数据量。您必须通过扩展
CombineFileInputFormt
,您可以在这里找到一个实现。一旦你有了InputFormat
定义好了,让我们在链接中这样称呼它CombinedInputFormat
,你可以告诉你的工作如何使用它:e3bfsja22#
cloudera在不久前发布了一篇关于小文件问题的博客。这是一个旧条目,但建议的方法仍然适用。