当前位置:  开发笔记 > 大数据 > 正文

如何使用MapReduce/Hadoop实现特征值计算?

如何解决《如何使用MapReduce/Hadoop实现特征值计算?》经验,为你挑选了2个好方法。

这是可能的,因为PageRank是一种特征值形式,这就是MapReduce引入的原因.但是在实际实现中似乎存在问题,例如每台从属计算机都必须维护矩阵的副本?



1> mrflip..:

PageRank通过迭代求解网络的稳态离散流条件来解决主导特征向量问题.

如果NxM矩阵A描述了从节点n到节点m的链路权重(流量),那么

p_{n+1} = A . p_{n} 

在p已经收敛到稳定状态(p_n + 1 = p_n)的极限中,这是特征值1的特征向量问题.

PageRank算法不要求矩阵保存在内存中,但在密集(非稀疏)矩阵上效率低.对于密集矩阵,MapReduce是错误的解决方案 - 您需要在节点之间进行局部性和广泛交换 - 而您应该看看LaPACK和MPI以及朋友.

你可以在wukong 库中看到一个有效的pagerank实现(hadoop流为ruby)或者在Heretrix pagerank子模块中.(heretrix代码独立于Heretrix运行)

(免责声明:我是悟空的作者.)



2> Gavin Miller..:

前言:

给定正确的数据隔离,可以在每台机器上没有完整的数据集的情况下实现并行计算结果.

以下面的循环为例:

for (int i = 0; i < m[].length; i++)
{
    for (int j = 0; j < m[i].length; j++)
    {
        m[i][j]++; 
    }
}

并给出以下布局的矩阵:

       j=0   j=1   j=2
 i=0  [   ] [   ] [   ]
 i=1  [   ] [   ] [   ]
 i=2  [   ] [   ] [   ]

存在并行构造,使得可以将J列发送到每个计算机并且并行地计算单个列.当您拥有包含依赖项的循环时,并行化的难点就出现了.

for (int i = 0; i < m[].length; i++)
{
    for (int j = 0; j < m[i].length; j++)
    {
        //For obvious reasons, matrix index verification code removed
        m[i][j] = m[i/2][j] + m[i][j+7]; 
    }
}

显然,像上面那样的循环变得极其成问题(注意矩阵索引器.)但是存在用于展开这些类型的循环并创建有效的并行算法的技术.

答案:

谷歌有可能开发出一种计算特征值的解决方案,而无需在所有从属计算机上维护矩阵的副本.- 或 - 他们使用蒙特卡罗或其他一些近似算法来开发"足够接近"的计算.

实际上,我甚至会说Google会尽可能地尽可能地使其PageRank算法所需的任何计算尽可能高效.当你运行这些和这样的机器(注意以太网电缆)时,你无法传输大型数据集(100次演出),因为鉴于商用NIC卡的硬件限制,这是不可能的.

话虽如此,谷歌擅长令程序员社区感到惊讶,他们的实施可能完全不同.

POSTAMBLE:

并行计算的一些好资源包括OpenMP和MPI.两种并行实现都采用非常不同的范式进行并行计算,其中一些范式源于机器实现(集群与分布式计算).

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有