减少大量GZ文件的Hadoop映射器数量

时间:2016-04-02 08:03:05

标签: hadoop mapreduce hive emr

我有一个用例,我有3072个gz文件,我正在构建一个HIVE表。 现在,每当我对此表运行查询时,查询会生成3072个映射器,并且需要大约44分钟才能完成。 早些时候,384个文件中存在相同的数据(即相等的数据大小)。同样的查询只花了大约9分钟。

我搜索了网页,在那里我发现地图制作者的数量取决于"分裂"的i / p数据。因此,设置参数: mapreduce.input.fileinputformat.split.minsizemapreduce.input.fileinputformat.split.maxsize到64 MB这样的高值会导致每个映射器占用64 MB的数据,即使这需要由同一个映射器处理多个文件。

但是,这个解决方案对我的情况不起作用,因为GZ文件是"不可分割的"格式。因此,它们不能跨映射器分割或连接以由单个映射器处理。

有没有人遇到这个问题?

可以有各种解决方案,例如解压缩gz文件,然后使用上面的参数来使用更少数量的映射器,或使用更高端的ec2实例来减少处理时间。 但是,Hadoop / Hive / EMR中有一个固有的解决方案可以解决这个问题吗?

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

我遇到了同样的问题。我想这会对你有所帮助: http://www.ibm.com/developerworks/library/bd-hadoopcombine/

主要思想是使用CombineInputSplit和CombineRecordReader创建CombineInputFormat。由于您的文件是.gz,它们将被解压缩,然后由RecordReader读取到记录中。