减少hfileoutputformat中挂起的作业

ergxz8rk  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(339)

我正在使用
hbase:0.92.1-cdh4.1.2,和hadoop:2.0.0-cdh4.1.2
我有一个mapreduce程序,可以在集群模式下使用hfileoutputformat将数据从hdfs加载到hbase。在那个mapreduce程序中,我使用hfileoutputformat.configureincrementalload()大容量加载一个800000个大小为7.3gb的记录数据集,它运行正常,但它没有运行900000个大小为8.3gb的记录数据集。
在8.3gb数据的情况下,我的mapreduce程序有133个Map和一个reducer,所有Map都成功完成。我的reducer状态一直处于挂起状态很长一段时间。集群没有任何问题,因为其他作业运行正常,而且此作业也运行正常,数据量高达7.3gb。
我会做错什么?如何解决此问题?

axr492tv

axr492tv1#

您的作业使用单个reduces运行,意味着在单个任务上处理7gb的数据。主要原因是hfileoutputformat启动了一个reducer,它对要加载到hbase表中的数据进行排序和合并。这里,num of reducer=hbase表中的区域数
增加区域的数量,您将在减速器中实现并行。:)
您可以在此处获得更多详细信息:http://databuzzprd.blogspot.in/2013/11/bulk-load-data-in-hbase-table.html

ttcibm8c

ttcibm8c2#

我也遇到了同样的问题。查看datatracker日志,我注意到没有足够的可用空间供单个reducer在我的任何节点上运行:

2013-09-15 16:55:19,385 WARN org.apache.hadoop.mapred.JobInProgress: No room for reduce task. Node tracker_slave01.mydomain.com:localhost/127.0.0.1:43455 has 503,777,017,856 bytes free; but we expect reduce input to take 978136413988

这个503gb是指特定从机(“tracker\u slave01.mydomain.com”)上一个硬盘上的可用空间,因此reducer显然需要将所有数据复制到一个驱动器上。
发生这种情况的原因是您的表在全新时只有一个区域。当数据被插入该区域时,它最终会自行分裂。
解决方法是在创建表时预先创建区域。hbase手册中的批量加载一章对此进行了讨论,并提供了两种方法。这也可以通过hbase shell完成(请参阅 createSPLITS 我想是的。不过,挑战在于如何定义分割,以使区域得到均匀的密钥分布。我还没有完美地解决这个问题,但我现在正在做的是:

HTableDescriptor desc = new HTableDescriptor(); 
desc.setName(Bytes.toBytes(tableName));
desc.addFamily(new HColumnDescriptor("my_col_fam"));
admin.createTable(desc, Bytes.toBytes(0), Bytes.toBytes(2147483647), 100);

另一种解决办法是不使用 configureIncrementalLoad ,取而代之的是:1)只需通过mapreduce生成您的hfile,不使用reducer;2) 使用 completebulkload hbase.jar中的功能将记录导入hbase。当然,我认为区域也会遇到同样的问题,所以您也需要提前创建区域(我认为)。

相关问题