减少HFileOutputFormat中的待处理作业

时间:2013-09-03 12:54:37

标签: hadoop hbase hfile

我正在使用

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个地图和一个减速器,所有地图都成功完成。我的减速器状态总是在等待很长时间。集群没有任何问题,因为其他作业运行正常,此作业也运行良好,最高可达7.3GB数据。

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

2 个答案:

答案 0 :(得分:0)

我遇到了同样的问题。查看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_slave01.mydomain.com”)上某个硬盘驱动器上的可用空间,因此reducer显然需要将所有数据复制到单个驱动器。

这种情况发生的原因是你的桌子只有一个全新的区域。随着数据被插入到该区域,它最终将自行拆分。

解决此问题的方法是在创建表格时预先创建区域。 HBase书中的Bulk Loading Chapter讨论了这一点,并提出了两个选项。这也可以通过HBase shell完成(参见我认为的create的{​​{1}}参数)。但挑战在于定义您的分割,以便区域获得均匀的密钥分配。我还没有完美地解决这个问题,但这就是我现在正在做的事情:

SPLITS

另一种解决方案是不使用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); ,而是:1)只通过没有减速器的MapReduce生成你的HFile; 2)使用completebulkload feature in hbase.jar将您的记录导入HBase。当然,我认为这与区域存在同样的问题,因此您也希望提前创建区域(我认为)。

答案 1 :(得分:0)

您的工作正在运行,单个减少,意味着在单个任务上处理7GB数据。 这样做的主要原因是HFileOutputFormat启动reducer对HBase表中加载的数据进行排序和合并。 这里,减速机的数量= HBase表中的区域数

增加区域数量,您将在减速器中实现并行性。 :)

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