我正在使用
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数据。
我可能做错了什么? 我该如何解决这个问题?
答案 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