将多个顺序 HBase 查询的结果传递给 Mapreduce 作业

Posted

技术标签:

【中文标题】将多个顺序 HBase 查询的结果传递给 Mapreduce 作业【英文标题】:Passing the results of multiple sequential HBase queries to a Mapreduce job 【发布时间】:2011-11-28 10:16:23 【问题描述】:

我有一个 HBase 数据库,它存储有向图的邻接列表,每个方向的边存储在一对列族中,其中每一行表示一个顶点。我正在编写一个 mapreduce 作业,它将所有节点都作为其输入,这些节点也具有指向与指向其他顶点(被指定为查询的主题)相同的顶点的边。这有点难以解释,但在下图中,作为输入的节点集,当在顶点“A”上查询时,将是A,B,C,因为它们都具有来自顶点的边'1':

要在 HBase 中执行此查询,我首先在产生 1 的反向边列族中查找边为“A”的顶点,然后对于该集合中的每个元素,查找具有该元素边的顶点集合中的前边缘列族。

这应该产生一组键值对:1: A,B,C。

现在,我想获取这组查询的输出并将其传递给 hadoop mapreduce 作业,但是,我找不到将 hbase 查询“链接”在一起以向 TableMapper 中的 TableMapper 提供输入的方法Hbase mapreduce API。到目前为止,我唯一的想法是提供另一个初始映射器,它获取第一个查询的结果(在反向边缘表上),对于每个结果,在前向边缘表上执行查询,并产生要传递给的结果第二个地图作业。但是,从映射作业中执行 IO 让我感到不安,因为它似乎与 mapreduce 范式背道而驰(如果多个映射器都试图同时访问 HBase,则可能会导致瓶颈)。因此,任何人都可以提出执行此类查询的替代策略,或提供有关以这种方式使用 hbase 和 mapreduce 的最佳实践的任何建议吗?我也很想知道我的数据库架构是否有任何改进可以缓解这个问题。

谢谢,

提姆

【问题讨论】:

【参考方案1】:

您的问题在 Map/Reduce 范式中表现不佳。我已经看到许多 M/R 链接在一起解决的最短路径问题。这不是那么有效,但需要在 reducer 级别获得全局视图。

在您的情况下,您似乎可以通过跟踪边缘并保留已看到节点的列表来执行映射器中的所有请求。

但是,从地图作业中执行 IO 让我感到不安

你不应该担心这个。您的数据模型是绝对随机的,尝试执行数据局部性将非常困难,因此您别无选择,只能通过网络查询所有这些数据。 HBase 旨在处理大型并行查询。对不相交的数据进行多个映射器查询将产生良好的请求分布和高吞吐量。

确保在 HBase 表中保持较小的块大小以优化您的读取,并为您的区域提供尽可能少的 HFile。我假设您的数据在这里是相当静态的,因此进行主要压缩会将 HFile 合并在一起并减少要读取的文件数量。

【讨论】:

感谢 Pierre-Luc,这是一个非常好的答案 - 我没有考虑数据可能如何在 hbase 节点之间分布的特征,以及对查询性能的可能影响,这有真的很有启发性。谢谢! 很高兴它对您有所帮助。你手头有一个有趣的问题。

以上是关于将多个顺序 HBase 查询的结果传递给 Mapreduce 作业的主要内容,如果未能解决你的问题,请参考以下文章

0762-5.16.2-Impala查询HBase表字段顺序不正确异常分析

如何将一个查询的结果传递给第二个查询并将结果显示在一个表中?

如何将查询结果传递给相同的函数?

如何将执行查询的结果放入 ViewData 并传递给视图

Codeigniter - 使用 json 将单个查询结果传递给控制器​​ - 如果存在

Gatsby:如何将多个上下文 ID 传递给单个查询?