如何处理 hadoop2 中的多个(100 个)输入文件,其中每个文件的大小都小于 10MB?

How to handle multiple(100s) input files in hadoop2 where size of each of those files is less than 10MB?

让我们假设我有 200 个输入文件,每个文件大小为 10MB。 //total_size=2GB

如何让这些文件存储在 16 个 HDFS 块中? //default_block_size=128MB

通过这样做,与 200 个映射器处理 200 个输入文件相比,我认为 16 个映射器可以更高效地完成我的工作。

你不能在HDFS的单个块中存储多个文件,这是HDFS的基本规则。在你的情况下,HDFS 块没有得到很好的使用,在一个块中的总 128MB 中,只有 10MB 被使用,剩下的 118MB 不能被任何其他文件使用,它将保持空闲。 (这里需要注意的一点是,HDFS 块是合乎逻辑的,尽管您将其设置为 128MB,但您的 HDFS 块将仅占用 10MB 的物理存储空间。)

简而言之,在 HDFS 中,文件与 HDFS 块的关系是一对多的,而 HDFS 块与文件不能是一对多的。

首先你不能以那种方式存储(16 个 HDFS 块)。

为了为文件生成大约 16 个映射器,您可以使用 CombileFileInputFormat ,以便它合并文件直到达到提供的限制。 (在边界情况下不同)。

需要指定:- mapreduce.input.fileinputformat.split.maxsizemapreduce.input.fileinputformat.split.minsize

最好的选择是更改写入 HDFS 的进程以保存等于(或)近似等于块大小的文件。这将确保您正在优化块大小,并且当在 Hadoop 集群上执行任何作业时,它将增加等于块或拆分的映射任务数。

如果您的输入数据集太大,一个理想的方法是进一步压缩数据,然后保存在 HDFS 中。这将减少集群中保存的数据占用空间并提高读取数据的作业的性能。