算法 – MapReduce矩阵乘法复杂度

假设我们有大文件,其中包含两个矩阵(A和B)的单元格的描述:

+---------------------------------+
|  i  |  j  |  value  |   matrix  |
+---------------------------------+
|  1  |  1  |   10    |     A     |
|  1  |  2  |   20    |     A     |
|     |     |         |           |
| ... | ... |   ...   |    ...    |
|     |     |         |           |
|  1  |  1  |    5    |     B     |
|  1  |  2  |    7    |     B     |
|     |     |         |           |
| ... | ... |   ...   |    ...    |
|     |     |         |           |
+---------------------------------+

我们想要计算这个矩阵的乘积:C = A x B.
根据定义:C_i_j = sum(A_i_k * B_k_j)

这里有一个两步MapReduce算法,用于计算这个产品(我将提供一个伪代码):

第一步:

function Map (input is a single row of the file from above):

    i = row[0]
    j = row[1]
    value  = row[2]
    matrix = row[3]

    if(matrix == 'A')
        emit(i, {j, value, 'A'})
    else
        emit(j, {i, value, 'B'})

这个Map函数的复杂度是O(1)

function Reduce(Key, List of tuples from the Map function):

    Matrix_A_tuples = 
        filter( List of tuples from the Map function, where matrix == 'A' )

    Matrix_B_tuples = 
        filter( List of tuples from the Map function, where matrix == 'B' )

    for each tuple_A from Matrix_A_tuples
        i = tuple_A[0]
        value_A = tuple_A[1]

        for each tuple_B from Matrix_B_tuples
            j = tuple_B[0]
            value_B = tuple_B[1]

            emit({i, j}, {value_A * value_b, 'C'})

该Reduce函数的复杂度为O(N ^ 2)

在第一步之后,我们将获得类似以下文件(包含O(N ^ 3)行)的内容:

+---------------------------------+
|  i  |  j  |  value  |   matrix  |
+---------------------------------+
|  1  |  1  |   50    |     C     |
|  1  |  1  |   45    |     C     |
|     |     |         |           |
| ... | ... |   ...   |    ...    |
|     |     |         |           |
|  2  |  2  |    70   |     C     |
|  2  |  2  |    17   |     C     |
|     |     |         |           |
| ... | ... |   ...   |    ...    |
|     |     |         |           |
+---------------------------------+

所以,我们所要做的就是 – 从行中对值进行求和,其中包含相同的值i和j.

第二步:

function Map (input is a single row of the file, which produced in first step):
    i = row[0]
    j = row[1]
    value = row[2]
    emit({i, j}, value)
function Reduce(Key, List of values from the Map function)

    i = Key[0]
    j = Key[1]

    result = 0;

    for each Value from List of values from the Map function
        result += Value

    emit({i, j}, result)

在第二步之后,我们将获得包含矩阵C的单元格的文件.

所以问题是:

考虑到MapReduce集群中有多个实例 – 这是估计所提算法复杂性的最正确方法吗?

想到的第一个是这样的:
当我们假设MapReduce集群中的实例数是K.
并且,由于在第一步之后产生的来自文件的行数是O(N ^ 3) – 总体复杂度可以估计为O((N ^ 3)/ K).

但是这种估计没有考虑到许多细节:例如MapReduce集群实例之间的网络带宽,在距离之间分配数据的能力 – 以及在本地执行大部分计算等.

因此,我想知道哪种方法可以用于估算所提供的MapReduce算法的效率,并且使用Big-O表示法来估计MapReduce算法的效率是否有意义?

最佳答案 正如你所说,Big-O估计计算复杂性,并没有考虑网络问题(带宽,拥塞,延迟……)

如果要计算实例之间的通信效率,在这种情况下,您需要其他网络指标…

但是,我想告诉你一些事情,如果你的文件不够大,你就不会看到执行速度方面的改进.这是因为MapReduce仅对BIG数据有效.而且,您的代码有两个步骤,即两个作业. MapReduce,从一个作业到另一个作业,需要时间上传文件并再次启动作业.这可能会略微影响性能.

我认为你可以在速度和时间方面有效地计算,因为MapReduce方法在大数据方面肯定会更快.这是我们将它与顺序算法进行比较.

而且,效率可以与容错有关.这是因为MapReduce将自己处理故障.因此,程序员无需处理实例故障或网络故障.

点赞