如何将 HBase 的扫描限制在 MapReduce 作业的相关(未过滤)区域
Posted
技术标签:
【中文标题】如何将 HBase 的扫描限制在 MapReduce 作业的相关(未过滤)区域【英文标题】:How can I limit the scan of HBase to only relevant (Unfiltered) regions for the MapReduce job 【发布时间】:2019-08-08 16:37:43 【问题描述】:我正在运行 mapreduce 作业以将数据从 HBase 导出到 HDFS。 有多个过滤器应用于扫描。
无法通过行键限制扫描,因为它不包含必需的信息。
在运行 MR 作业时,YARN 会为 HBase 中的每个区域创建一个映射器。其中一些区域仅包含过滤数据,因此映射器不会收到任何要读取的内容,并且会在一段时间后终止。 要提取的数据量明显少于数据总量,因此作业最终会因为大量的 mapper 被终止而失败。
我不想要的答案:
在映射器中实现“手动”过滤。 增加超时间隔。我正在寻找的是以下之一:
有关如何解决此问题的文章的链接。
对此的有效解决方案或想法(不一定有代码),不涉及通过映射器运行完整的 HBase 表。或者至少(让我们成为现实)减少了映射器中的计算负载。
确认没有有效的方法可以做到这一点,因为我已经花了相当多的时间来寻找这个。
我相信代码示例不是必需的,因为了解 HBase 的人会知道我的要求。
感谢您的建议。
【问题讨论】:
这不就是 HBase 指南中的二级索引...章节的内容吗? hbase.apache.org/book.html#secondary.indexes 感谢您的建议,这更像是一次性工作,因此不想为此创建二级索引。我最后所做的是我编写了另一个 mapreduce 作业,它对每个行键进行分类并使用 start 和 end 行键生成输出,这使我能够使用 setStart/EndRow 属性进行我的扫描 酷,感谢您的更新。值得发布作为您自己问题的答案!所以你还在建立一个索引,有点...... :) 完成,感谢您的建议,它指向了正确的方向:) 【参考方案1】:为了解决这个问题,我创建了一个 MR 作业。
Mapper 将每个行键分类到一个类别中,并为每种类型选择第一个和最后一个元素(因为所有内容都在一个区域内排序)。为了选择最后一个元素,我一直在更新单个对象并分配每个值,这些值将进入映射器。然后我在清理阶段将这两个值写入上下文(classifier_name 作为键,row_key 作为值)。
Mappers 的输出很轻(类别数 * 2),所以我将 reducer 的数量设置为 1,并编写了一些基本逻辑来创建具有 low_row/high_row 的对象,该对象在飞行中更新但我没有最后必须对任何东西进行排序。所以最终输出的形式是:classifier_name, start_rowKey, end_rowKey
然后我可以使用这些值来限制我的扫描。
希望对某人有所帮助:)
【讨论】:
以上是关于如何将 HBase 的扫描限制在 MapReduce 作业的相关(未过滤)区域的主要内容,如果未能解决你的问题,请参考以下文章