gpt4 book ai didi

hadoop - 减少 HFileOutputFormat 中挂起的作业

转载 作者:可可西里 更新时间:2023-11-01 14:59:14 25 4
gpt4 key购买 nike

我正在使用

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个maps和一个reducer,所有maps都成功完成。我的reducer状态一直处于Pending很长一段时间。集群没有任何问题,因为其他作业运行良好,并且此作业也运行良好,高达 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 显然需要将所有数据复制到单个驱动器。

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

对此的解决方案是在创建表格时预先创建区域。 Bulk Loading Chapter在 HBase 书中讨论了这一点,并提供了两种选择。这也可以通过 HBase shell 完成(我认为参见 createSPLITS 参数)。不过,挑战在于定义您的拆分,以便区域获得均匀分布的 key 。我还没有完美地解决这个问题,但这是我目前正在做的事情:

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。当然,我认为这会遇到与区域相同的问题,因此您也需要提前创建区域(我认为)。

关于hadoop - 减少 HFileOutputFormat 中挂起的作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18592882/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com