减少 HFileOutputFormat 中待处理的作业

Posted

技术标签:

【中文标题】减少 HFileOutputFormat 中待处理的作业【英文标题】:Reduce job pending in HFileOutputFormat 【发布时间】:2013-09-03 12:54:36 【问题描述】:

我正在使用

Hbase:0.92.1-cdh4.1.2,和 Hadoop:2.0.0-cdh4.1.2

我有一个 mapreduce 程序,它将在集群模式下使用 HFileOutputFormat 将数据从 HDFS 加载到 HBase。 在该 mapreduce 程序中,我使用 HFileOutputFormat.configureIncrementalLoad() 批量加载 800000 条记录 7.3GB 大小的数据集运行良好,但对于 8.3GB 的 900000 条记录数据集却没有运行。

在 8.3GB 数据的情况下,我的 mapreduce 程序有 133 个 map 和一个 reducer,所有 map 都成功完成。我的 reducer 状态一直处于 Pending 很长一段时间。集群没有任何问题,因为其他作业运行良好,并且该作业也运行良好,最多可容纳 7.3GB 的数据。

我可能做错了什么? 我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

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

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_slave01.mydomain.com”)上的一个硬盘驱动器上的可用空间,因此减速器显然需要将所有数据复制到单个驱动器。

发生这种情况的原因是您的表在全新时只有一个区域。当数据插入该区域时,它最终会自行拆分。

解决方案是在创建表时预先创建区域。 HBase 书中的Bulk Loading Chapter 讨论了这一点,并提供了两种选择。这也可以通过 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,不使用减速器; 2) 使用completebulkload feature in hbase.jar 将您的记录导入HBase。当然,我认为这会遇到与区域相同的问题,因此您也需要提前创建区域(我认为)。

【讨论】:

【参考方案2】:

您的作业使用单个 reduce 运行,这意味着在单个任务上处理 7GB 数据。 其主要原因是 HFileOutputFormat 启动 reducer 对要加载到 HBase 表中的数据进行排序和合并。 这里,Reducer 数量 = HBase 表中的区域数量

增加区域的数量,您将在 reducer 中实现并行性。 :)

您可以在此处获取更多详细信息: http://databuzzprd.blogspot.in/2013/11/bulk-load-data-in-hbase-table.html

【讨论】:

以上是关于减少 HFileOutputFormat 中待处理的作业的主要内容,如果未能解决你的问题,请参考以下文章

承诺仍在 then 块中待处理 - 如何解决? [复制]

Python:如何检查 multiprocessing.Pool 中待处理任务的数量?

PayPal Sandbox - 新界面中待处理交易的接受/拒绝链接在哪里

如何清除TeamCity 7+中待处理的VCS更改?

并发编程

并发编程-问题解决