一整个单个文件作为Mapper的记录

时间:2016-08-10 05:19:11

标签: hadoop mapreduce

此方案有哪些可用选项和最佳做法:将单个文件作为输入传递给映射器或重新表述它 - 映射器将整个文件作为单个记录处理。与默认情况下一样,每个记录/行都会调用一个映射器,但是如何处理/传递整个文件作为记录

通过阅读,我发现了几个选项:

  • 序列文件:因为它对大号没有好处。对于可以压缩和压缩的较小文件,然后键将是文件名,值将是实际的zip文件。

  • CombinefileInput格式:这是我遇到的一种方式,也是WholeFileInputFormat。但是整个文件输入格式仅扩展了CombinefileInputformat。

  • IsSplittable():我也遇到过这种方法,在mapreduce程序的setup方法中覆盖了IsSplittable。

现在应该使用哪种方式或什么是此方案的最佳实践

1 个答案:

答案 0 :(得分:0)

CombinefileInput格式:当你有大量小文件时这很有用,在这种情况下,如果我们不使用CombineFileInput格式,那么即使是非常小的文件,每个文件也会对应一个分割,这意味着一个映射器将存在每个小文件,因此很多映射器将运行,并将占用您的集群的不必要的资源。

可拆分:在这种情况下,如果你有大文件,它不会分成多个拆分,它会转到一个映射器,但不会有任何并行性,但这可以解决这个目的,将一个大文件发送到一个映射器

如果你想在一个完整的文件中发送一条记录,那么你必须自定义你自己的记录阅读器,默认情况下它会在你的文件中检测到'\ n'时打破一条记录,所以如果你想发送在一个记录中完成文件,您必须通过基于总字节数而不是\ n来编写逻辑来覆盖上述功能。