此方案有哪些可用选项和最佳做法:将单个文件作为输入传递给映射器或重新表述它 - 映射器将整个文件作为单个记录处理。与默认情况下一样,每个记录/行都会调用一个映射器,但是如何处理/传递整个文件作为记录
通过阅读,我发现了几个选项:
序列文件:因为它对大号没有好处。对于可以压缩和压缩的较小文件,然后键将是文件名,值将是实际的zip文件。
CombinefileInput格式:这是我遇到的一种方式,也是WholeFileInputFormat。但是整个文件输入格式仅扩展了CombinefileInputformat。
IsSplittable():我也遇到过这种方法,在mapreduce程序的setup方法中覆盖了IsSplittable。
现在应该使用哪种方式或什么是此方案的最佳实践
答案 0 :(得分:0)
CombinefileInput格式:当你有大量小文件时这很有用,在这种情况下,如果我们不使用CombineFileInput格式,那么即使是非常小的文件,每个文件也会对应一个分割,这意味着一个映射器将存在每个小文件,因此很多映射器将运行,并将占用您的集群的不必要的资源。
可拆分:在这种情况下,如果你有大文件,它不会分成多个拆分,它会转到一个映射器,但不会有任何并行性,但这可以解决这个目的,将一个大文件发送到一个映射器
如果你想在一个完整的文件中发送一条记录,那么你必须自定义你自己的记录阅读器,默认情况下它会在你的文件中检测到'\ n'时打破一条记录,所以如果你想发送在一个记录中完成文件,您必须通过基于总字节数而不是\ n来编写逻辑来覆盖上述功能。