让我们假设我有200个输入文件,每个文件大小为10MB。 // total_size = 2GB如何在hadoop2中处理多个(100s)输入文件,其中每个文件的大小都小于10MB?
如何让这些文件存储在16个HDFS块中? // default_block_size = 128MB
通过这样做,我认为16个映射器将比200个映射器对200个输入文件有效地完成我的工作。
让我们假设我有200个输入文件,每个文件大小为10MB。 // total_size = 2GB如何在hadoop2中处理多个(100s)输入文件,其中每个文件的大小都小于10MB?
如何让这些文件存储在16个HDFS块中? // default_block_size = 128MB
通过这样做,我认为16个映射器将比200个映射器对200个输入文件有效地完成我的工作。
您不能在HDFS中的单个块内存储多个文件,这是HDFS的基本规则。在你的情况下,HDFS块的使用效果不好,总共128MB的块中只有10MB被使用,其余的118MB不能被任何其他文件使用,并且它将保持空闲状态。 (这里要注意的一点是,HDFS块是逻辑的,你的HDFS块只需要10MB的物理存储空间,尽管你已经设置为128MB)。到许多HDFS块到文件不能是一对多的。
首先你不能以这种方式存储(16个HDFS块)。
为了为这些文件产生大约16个映射器,可以使用CombileFileInputFormat,这样它就会合并文件直到满足提供的限制。 (在边界情况下不同)。
需要指定: - mapreduce.input.fileinputformat.split.maxsize和mapreduce.input.fileinputformat.split.minsize
最好的办法是改变你的过程,写到HDFS保存一个等于(或)近似等于块大小的文件。这将确保您正在优化块大小,并且在Hadoop集群上执行任何作业时,它将启动等于块或分割的地图任务数量。
如果输入数据集太大,一种理想的方法是进一步压缩数据,然后保存在HDFS中。这将减少集群中保存的数据的占用空间,并提高读取数据的作业性能。
你可以简单地写一个包含每个文件作为记录的序列文件。 –
是的,否则你可以先加载到临时表(如果文件在s3中,你可以创建一个外部表),然后插入你的核心表。 – MikA