2011-11-28 54 views
2

我有一个HBase数据库存储有向图的邻接列表,每个方向的边存储在一对列族中,其中每行表示一个顶点。我正在编写一个mapreduce作业,该作业将所有节点的边缘指向同一个顶点,并指向其他顶点(指定为查询主题)。这有点难以解释,但是在下面的图中,当查询顶点'A'时,作为输入的节点集合将是{A,B,C},由于它们都具有来自顶点的边“1”:将多个连续HBase查询的结果传递给Mapreduce作业

Example graph

要执行HBase的这个查询,我首先在反向沿列族边缘“A”产生查找顶点{1},并且,在每一个元件设置,在前沿列族中查找包含该组元素边的顶点。

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

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

感谢,

回答

2

您的问题是不与地图流动这么好/ Reduce的范式。我看到许多M/R链接解决了最短路径问题。这不是那么高效,但需要在缩减级别获得全局视图。

就你而言,似乎你可以在你的映射器中执行所有的请求,方法是跟踪边界并保留可见节点的列表。

然而,从地图作业中进行IO让我不安

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

请确保在HBase表格中保留小块大小以优化您的读取并尽可能少地为您的区域使用HFile。我假设你的数据在这里是相当静态的,所以做一个重要的压缩将HFile合并在一起,并减少要读取的文件数量。

+0

感谢Pierre-Luc,这真是一个非常好的答案 - 我没有考虑数据如何分布在hbase节点上的特性以及对查询性能的可能影响,这非常有启发性。谢谢! – mistertim

+0

我很高兴它帮助你。你手边有一个有趣的问题。 –

相关问题