说明:
我一直在做一个涉及矩阵乘法和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中的分布方式?为什么具有行/列主要格式的方阵与非常非方阵占用几乎相同的时间,而具有分布式格式的方阵只占用大约三分之一的时间来执行?如有任何见解,我们将不胜感激。
暂无答案!
目前还没有任何答案,快来回答吧!