为什么输入文件格式对我的执行时间影响这么大?

b1payxdu  于 2021-06-01  发布在  Hadoop
关注(0)|答案(0)|浏览(233)

说明:
我一直在做一个涉及矩阵乘法和hadoop的项目。我已经使用单节点和多节点集群设置运行了mapreduce代码,并且遇到了一些无法解释的结果(可能是由于我缺乏hadoop专业知识,因此提出了这个问题)。如果相关,我的集群有一个主节点和四个从节点。下面是我的mapreduce程序如何处理2x2矩阵乘法的图表:

很自然,输入被格式化为表示一个矩阵,所以 a,0,0,1 表示存在值 1 位置 0,0 矩阵的性质 A .
结果
我首先运行矩阵,矩阵的元素数相等,但维数不同。我发现矩阵越“方正”,作业执行的速度就越快。这对我来说很有意义:如果我们有 [20000x2][2x20000] 乘法,这将在我们的减速机中产生4个不同的“段”(请原谅我的术语不好),每个段有40000个元素,而 [200x200][200x200] 矩阵,其中有200个段,每个段有200个元素。由于所有实际的乘法都是在减速机中按顺序发生的,所以使用较少的段和较多的元素应该花费较长的时间,因为可以并行化的段较少。
接下来我开始考虑的是输入文件格式对执行的影响。我想尝试三种不同的输入格式。前两个是我所说的“行专业”和“列专业”。我用这个代码生成了矩阵(通过分别切换行和列变量):

for (int m = 0; m < 200; m++) {
        for (int n = 0; n < 200; n++) {
            writer.println(String.format("a,%d,%d,%.4f", m, n, ThreadLocalRandom.current().nextDouble(0, 100)));
        }
    }

    for (int n = 0; n < 200; n++) {
        for (int p = 0; p < 200; p++) {
            writerB.println(String.format("b,%d,%d,%.4f", n, p, ThreadLocalRandom.current().nextDouble(0, 100)));
        }
    }

这导致文件格式如下所示:

Row Major 
--------- 
a,0,0,20.2074
a,0,1,29.3252
a,0,2,64.5026
a,0,3,53.9574
a,0,4,29.3813
a,0,5,13.1202
a,0,6,52.8259
a,0,7,60.0963
a,0,8,11.6382
a,0,9,88.7868

Col Major
-------------
a,0,0,92.2614
a,1,0,0.1070
a,2,0,14.4420
a,3,0,97.3052
a,4,0,15.5435
a,5,0,51.5586
a,6,0,63.3186
a,7,0,84.0014
a,8,0,63.0877
a,9,0,90.8724

我也尝试了另一种格式,我称之为“分布式”。以下是生成代码:

for (int m = 0; m < 200; m++) {
        int n = 0;
        while(n <= m) {
            writer.println(String.format("a,%d,%d,%.4f", m, n++, ThreadLocalRandom.current().nextDouble(0, 100)));
        }
    }

    for (int n = 0; n < 200; n++) {
        int p = 0;
        while(p <= n) {
            writerB.println(String.format("b,%d,%d,%.4f", n, p++, ThreadLocalRandom.current().nextDouble(0, 100)));
        }
    }

以及生成的文件输出:

Distributed
-----------
a,0,0,69.0747
a,1,0,23.2568
a,1,1,39.1628
a,2,0,12.7795
a,2,1,54.9023
a,2,2,47.7321
a,3,0,39.5109
a,3,1,16.6630
a,3,2,7.5520
a,3,3,17.2945

令我惊讶的是,分布式文件格式的性能明显优于行或列主格式!事实上,我的行和列主要格式化文件的输出是如此的平庸,以至于可以与乘以 [20000x2][2x20000] 矩阵。我认为这可能只是两个矩阵都是行主矩阵或列主矩阵的情况,但是当我尝试将一个行主矩阵相乘时 A 列主矩阵 B (反之亦然),我得到了类似的结果。为了给出一些具体的例子,下面是我在多节点集群中的一些结果:

[20000x2][2x20000] Multiplication Duration: 80867 ms
[200x200][200x200] Row Major Duration:      71845 ms
[200x200][200x200] Distributed Duration:    29929 ms

问题
为什么输入文件的格式对完成mapreduce过程所需的时间有如此显著的影响?格式是否影响信息在hdfs中的分布方式?为什么具有行/列主要格式的方阵与非常非方阵占用几乎相同的时间,而具有分布式格式的方阵只占用大约三分之一的时间来执行?如有任何见解,我们将不胜感激。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题