java - 如何将 HBase 的扫描限制在 MapReduce 作业的相关(未过滤)区域
问题描述
我正在运行 mapreduce 作业以将数据从 HBase 导出到 HDFS。有多个过滤器应用于扫描。
无法通过行键限制扫描,因为它不包含所需的信息。
在运行 MR 作业时,YARN 为 HBase 中的每个区域创建一个映射器。其中一些区域仅包含过滤数据,因此映射器不会收到任何要读取的内容,并且会在一段时间后终止。要提取的数据量明显少于数据总量,因此由于大量映射器被终止,作业最终失败。
我不想要的答案:
- 在映射器中实现“手动”过滤。
- 增加超时间隔。
我正在寻找的是其中之一:
有关如何解决此问题的文章的链接。
一个有效的解决方案或想法(不一定有代码),它不涉及通过映射器运行完整的 HBase 表。或者至少(让我们成为现实)减少了映射器中的计算负载。
确认没有有效的方法可以做到这一点,因为我花了相当多的时间来寻找这个。
我相信代码示例不是必需的,因为了解 HBase 的人会知道我的要求。
谢谢指教。
解决方案
为了解决这个问题,我创建了一个 MR 工作。
Mapper 将每个行键分类到一个类别中,并为每种类型选择第一个和最后一个元素(因为所有内容都在一个区域内排序)。为了选择最后一个元素,我一直在更新单个对象并分配每个值,这些值将进入映射器。然后我在清理阶段将这两个值写入上下文(classifier_name 作为键,row_key 作为值)。
映射器输出很轻(类别数 * 2),所以我将减速器的数量设置为 1,并编写了一些基本逻辑来创建具有低行/高行的对象,该对象在飞行中更新,我不必排序最后的任何东西。所以最终的输出是这样的:
classifier_name, start_rowKey, end_rowKey
然后我可以使用这些值来限制我的扫描。
希望对某人有所帮助:)
推荐阅读
- html - Overflow-X 不显示滚动条
- html - HTML5“按ESC退出全屏”自定义消息
- java - 如何将对象数组从一种方法转移到另一种方法并返回一个新对象?
- ruby-on-rails - 无法写入未知属性“client_mutation_id”
- java - 使用 Maven 执行 Cucumber 测试
- python - 用python计算csv文件中的行数问题
- c# - 事件 ControlRemoved 事件后如何获取刷新的 TabPages 列表?
- php - 在原始类中调用静态方法
- c++ - 有人可以帮我并行化这个 C++ 代码吗?
- apache-spark - 使用 Kafka 使用 Spark 结构化批处理作业管理偏移量