此场景的可用选项和最佳实践是什么:将单个文件作为输入传递给映射器或重新描述它-映射器将整个文件作为单个记录处理。就像默认情况下,每个记录/行都调用映射器,但如何处理/传递整个文件作为记录
通过阅读,我遇到了几个选项:
-
序列文件:因为它是好的大no。
可以将较小的文件压缩在一起,然后密钥将是文件名,值将是实际的zip文件。 CombinefileInput格式:这是我遇到的一种方式,也是WholeFileInputFormat。但是整个文件输入格式只扩展了CombinefileInputformat
IsSplittable():我还遇到了这个方法,其中IsSplittable在mapreduce程序的设置方法中被覆盖。
这个场景的最佳实践是什么
CombinefileInput格式:当你有大量的小文件时,这是有用的,在这种情况下,如果我们不使用CombinefileInput格式,那么即使对于一个非常小的文件,每个文件将对应一个拆分,这意味着每个小文件将有一个映射器,所以很多映射器将运行,并将占用集群不必要的资源。
Is Splittable:在这种情况下,如果你有一个大文件,它不会分解成多个拆分,它会到一个映射器,但不会有任何并行性,但这将解决发送一个大文件到一个映射器的目的。
如果你想发送一个完整的文件一个记录,在这种情况下,你将不得不自定义你自己的记录阅读器,默认情况下,当它检测到'n'在你的文件中,它打破一个记录,所以如果你想发送完整的文件在一个记录中,你将不得不重写上面的功能写基于总字节数而不是n的逻辑。