对于这种情况,有哪些可用的选项和最佳实践:将单个文件作为输入传递给Map器,或者将其重新表述—Map器将整个文件作为单个记录进行处理。像在默认情况下一样,为每个记录/行调用Map器,但是如何将整个文件作为记录进行处理/传递
通过阅读,我发现了几种选择:
序列文件:因为它适合大数量的小文件,可以压缩和压缩在一起,然后键将是文件名和值将是实际的压缩文件。
CombineFileInputFormat:这是我遇到的一种方法,也是wholefileinputformat。但是整个文件输入格式只扩展了combinefileinputformat。
issplittable():我还遇到了这个方法,在mapreduce程序的setup方法中,issplittable被重写。
现在应该在什么时候使用,或者什么是这个场景的最佳实践
1条答案
按热度按时间hyrbngr71#
combinefileinput格式:当您有大量的小文件时,这很有用,在这种情况下,如果我们不使用combinefileinput格式,那么即使对于非常小的文件,每个文件将对应于一个分割,这意味着一个Map器将在那里为每个小文件,所以许多Map器将运行,并将采取不必要的资源,您的集群。
是可拆分的:在这种情况下,如果你有一个大文件,它不会被拆分成多个部分,它会去一个Map器,但不会有任何并行性,但这将解决发送一个大文件到一个Map器的目的。
如果你想发送一个完整的文件一个记录在这种情况下,你将不得不定制自己的记录阅读器,默认情况下,它在文件中检测到“\n”时会中断一条记录,因此如果要在一条记录中发送完整的文件,则必须根据总字节数而不是\n来写入逻辑,从而覆盖上述功能。