说明
我一直致力于一个涉及矩阵乘法和Hadoop的项目。我使用单节点和多节点集群设置运行了我的MapReduce代码,我遇到了一些我不确定可以解释的结果(可能是由于我缺乏Hadoop专业知识,因此发布了问题)。如果它是相关的,我的集群有一个主节点和四个从节点。下面是我将MapReduce程序用于2x2矩阵乘法的图表:
当然,输入格式化为表示矩阵,因此a,0,0,1
表示矩阵1
的位置0,0
中存在A
的值。
结果
我首先运行的矩阵具有相同数量的元素但尺寸不同。我发现矩阵“更正方形”,执行的工作越快。这对我来说很有意义:如果我们有一个[20000x2][2x20000]
乘法,这将导致我们的reducer中有4个不同的“段”(借口我可怜的术语),每个都有40000个元素,相比之下{{1} }矩阵,其中将有200个段,每个段有200个元素。由于所有实际乘法都在reducer中顺序发生,因此具有更多元素的更少的段应该花费更长的时间,因为可以并行化的更少。
我开始考虑的下一件事是我的输入文件格式对执行的影响。我想尝试基本上有三种不同的输入格式。前两个是我所谓的“行专业”和“专业专业”。我用这段代码生成了矩阵(分别通过切换行和列变量):
[200x200][200x200]
这导致文件格式如下所示:
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
问题
为什么输入文件的格式会对完成MapReduce过程所花费的时间产生如此巨大的影响?格式是否会影响HDFS中信息的分发方式?为什么具有行/列主要格式的方形矩阵与非方形矩阵几乎占用相同的时间,而具有分布式格式的矩阵只需要大约三分之一的时间来执行?任何见解将不胜感激。