我有一个HBase数据库存储有向图的邻接列表,每个方向的边存储在一对列族中,其中每行表示一个顶点。我正在编写一个mapreduce作业,该作业将所有节点的边缘指向同一个顶点,并指向其他顶点(指定为查询主题)。这有点难以解释,但是在下面的图中,当查询顶点'A'时,作为输入的节点集合将是{A,B,C},由于它们都具有来自顶点的边“1”:将多个连续HBase查询的结果传递给Mapreduce作业
要执行HBase的这个查询,我首先在反向沿列族边缘“A”产生查找顶点{1},并且,在每一个元件设置,在前沿列族中查找包含该组元素边的顶点。
这应该产生一组键值对:{1:{A,B,C}}。
现在,我想将这组查询的输出传递给hadoop mapreduce作业,但是,我找不到一种方法将hbase查询连接在一起以将输入提供给TableMapper在Hbase mapreduce API中。到目前为止,我唯一的想法是提供另一个初始映射器,它将第一个查询的结果(在反向边缘表中),每个结果,在前向边缘表上执行查询,并产生要传递给的结果第二个地图作业。然而,从地图作业中执行IO让我感到不安,因为它似乎与mapreduce范式相反(如果几个mapper都试图一次访问HBase,可能会导致瓶颈)。因此,任何人都可以提出执行这种查询的替代策略,或者提供有关以这种方式使用hbase和mapreduce的最佳实践的任何建议?我也有兴趣知道是否有任何改进我的数据库模式,可以缓解这个问题。
感谢,
添
感谢Pierre-Luc,这真是一个非常好的答案 - 我没有考虑数据如何分布在hbase节点上的特性以及对查询性能的可能影响,这非常有启发性。谢谢! – mistertim
我很高兴它帮助你。你手边有一个有趣的问题。 –