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

pwuypxnk  于 2021-06-02  发布在  Hadoop
关注(0)|答案(3)|浏览(314)

假设我有200个输入文件,每个文件大小为10mb//总大小=2gb
如何将这些文件存储在16个hdfs块中//默认块大小=128mb
通过这样做,我认为16个Map器可以有效地完成我的工作,而200个Map器只能处理200个输入文件。

lawou6xi

lawou6xi1#

首先,您不能以这种方式存储(16个hdfs块)。
为了为文件生成大约16个Map器,您可以使用combilefileinputformat,这样它就可以合并文件,直到满足所提供的限制边界情况不同)。
需要指定:-mapreduce.input.fileinputformat.split.maxsize和mapreduce.input.fileinputformat.split.minsize

soat7uwm

soat7uwm2#

在hdfs中,不能在一个块中存储多个文件,这是hdfs的基本规则。在您的情况下,hdfs块没有得到很好的使用,在一个块的128mb中,只有10mb被使用,剩余的118mb不能被任何其他文件使用,它将保持空闲(这里需要注意的一点是,hdfs块是逻辑的,您的hdfs块将只占用10mb的物理存储,尽管您已将其设置为128mb。)
简言之,在hdfs中,文件到hdfs块的关系是一对多,而hdfs块到文件的关系不能是一对多。

exdqitrt

exdqitrt3#

最好的选择是更改写入hdfs的进程,以保存一个与块大小相等(或近似相等)的文件。这将确保优化块大小,并且当在hadoop集群上执行任何作业时,它将使map任务的数量增加到block或split。
如果输入数据集太大,理想的方法是进一步压缩数据,然后保存在hdfs中。这将减少集群中保存的数据的占用空间,并提高读取数据的作业的性能。

相关问题