首页 > 解决方案 > 如何将 HBase 的扫描限制在 MapReduce 作业的相关(未过滤)区域

问题描述

我正在运行 mapreduce 作业以将数据从 HBase 导出到 HDFS。有多个过滤器应用于扫描。

无法通过行键限制扫描,因为它不包含所需的信息。

在运行 MR 作业时,YARN 为 HBase 中的每个区域创建一个映射器。其中一些区域仅包含过滤数据,因此映射器不会收到任何要读取的内容,并且会在一段时间后终止。要提取的数据量明显少于数据总量,因此由于大量映射器被终止,作业最终失败。

我不想要的答案:

我正在寻找的是其中之一:

我相信代码示例不是必需的,因为了解 HBase 的人会知道我的要求。

谢谢指教。

标签: javamapreducehbase

解决方案


为了解决这个问题,我创建了一个 MR 工作。

Mapper 将每个行键分类到一个类别中,并为每种类型选择第一个和最后一个元素(因为所有内容都在一个区域内排序)。为了选择最后一个元素,我一直在更新单个对象并分配每个值,这些值将进入映射器。然后我在清理阶段将这两个值写入上下文(classifier_name 作为键,row_key 作为值)。

映射器输出很轻(类别数 * 2),所以我将减速器的数量设置为 1,并编写了一些基本逻辑来创建具有低行/高行的对象,该对象在飞行中更新,我不必排序最后的任何东西。所以最终的输出是这样的:
classifier_name, start_rowKey, end_rowKey

然后我可以使用这些值来限制我的扫描。

希望对某人有所帮助:)


推荐阅读