Hadoop 减少HFileOutputFormat中挂起的作业

Hadoop 减少HFileOutputFormat中挂起的作业,hadoop,hbase,hfile,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数据的情况下,我的

我正在使用

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个映射和一个reducer,所有映射都成功完成。我的reducer状态一直处于挂起状态很长一段时间。集群没有任何问题,因为其他作业运行良好,并且此作业也运行良好,数据量高达7.3GB

我可能做错了什么?
如何解决此问题

我遇到了同样的问题。查看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手册中的讨论了这一点,并提供了两个选项。这也可以通过HBase shell来实现(我想请参见
create
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);

另一种解决方案是不使用
configureIncrementalLoad
,而是:1)只通过MapReduce生成您的HFile,不使用减缩器;2) 用于将记录导入HBase。当然,我认为区域也会遇到同样的问题,因此您也需要提前创建区域(我认为)。

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

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

您可以在此处获得更多详细信息: