我正在尝试根据http://i.stanford.edu/~ullman/mmds/ch5.pdf第 162 页的示意图使用 Hadoop 实现块矩阵向量乘法算法。我的矩阵将是稀疏的,并且向量密集,这也正是 PageRank 所需要的。假定向量不适合内存。
我考虑可能实现的方式是使用 CompositeInputFormat 并基本上执行矩阵块与向量块的映射侧连接,并将中间结果块相加,这些中间结果块有助于组合器/减速器中的最终结果块。这种方法与一般地图侧连接之间的区别在于,我需要将矩阵的几个块与一个向量块连接起来。我知道 Hadoop 中关于拆分、排序等的 map-side join 的要求,在拆分方面,我会通过为每个相应命名的块创建一个文件来解决这个问题。对我来说,看起来我需要修改确定应加入哪些文件的代码,以便 Hadoop 不再希望加入来自两个具有相同名称的路径的文件,而是根据我定义的方案。然而,我不知道这是否是一种有效的方法以及这部分代码的位置。我查看了 Hadoop 源代码,但找不到它。
我知道我可以使用 reduce-side join 来做到这一点,但这里的效率至关重要,因为这种矩阵向量乘法需要大量执行。分布式缓存是不可能的,因为向量不适合内存。
有谁知道如何解决这个问题?