我有一个用例,其中我有3072个gz文件,我正在这些文件上构建一个HIVE表。现在,每当我在此表上运行查询时,该查询都会生成3072个映射器,大约需要44分钟才能完成。早些时候,384个文件中存在相同的数据(即相同的数据大小)。同样的查询只花了大约9分钟。
我在网上搜索了一下,发现映射器的数量是由I/p数据的"拆分"数量决定的。因此,设置参数:mapreduce.input.fileinputformat.split.minsize
和mapreduce.input.fileinputformat.split.maxsize
的高值(如64MB)将导致每个映射器占用64MB的数据,即使这需要由同一映射器处理多个文件。
但是,这个解决方案不适用于我的情况,因为GZ文件是"不可拆分的"格式。因此,它们不能在多个映射器之间拆分,也不能由单个映射器连接处理。
有人也面临过这个问题吗?
对此可以有各种解决方案,比如解压缩gz文件,然后使用上面的params来减少映射器的数量,或者使用更高端的ec2实例来减少处理时间。但是,Hadoop/Hive/EMR中是否有一个固有的解决方案来解决这个问题?
提前感谢您的帮助!
我遇到了同样的问题。我认为这将帮助您:http://www.ibm.com/developerworks/library/bd-hadoopcombine/
其主要思想是使用CombineInputSplit和CombineRecordReader来创建CombineInputFormat。由于你的文件是.gz,它们将被解压缩,然后由RecordReader读取到记录中。