Tôi đang chạy chương trình Phép nhân ma trận MapReduce được tìm thấy tại http://www.norstad.org/matrix-multiply/index.html. Tôi phát hiện ra rằng triển khai này không hoạt động đúng khi có 0 trong ma trận đầu vào. Nhưng tôi không hiểu tại sao, và làm thế nào để tôi sửa đổi chương trình để làm cho nó hoạt động? Các hoạt động MapReduce hoàn tất, nhưng sản lượng luôn luôn là một ma trận với tất cả các yếu tố 0.Nhân bản ma trận Hadoop
đầu vào My ma trận A & B là:
Matrix A Matrix B
0 0 0 6 7 4
0 1 6 9 1 3
7 8 9 7 6 2
Output Matrix:
0 0 0
0 0 0
0 0 0
Sau đây là được lấy từ tệp nhật ký cho công việc:
Đầu ra bản đồ cho ma trậnB:
##### Map setup: matrixA = false for hdfs://localhost/user/hadoop-user/B
strategy = 4
R1 = 4
I = 3
K = 3
J = 3
IB = 3
KB = 3
JB = 3
##### Map input: (0,0) 6
##### Map output: (0,0,0,1) (0,0,6)
##### Map input: (0,1) 7
##### Map output: (0,0,0,1) (0,1,7)
##### Map input: (0,2) 4
##### Map output: (0,0,0,1) (0,2,4)
##### Map input: (1,0) 9
##### Map output: (0,0,0,1) (1,0,9)
##### Map input: (1,1) 1
##### Map output: (0,0,0,1) (1,1,1)
##### Map input: (1,2) 3
##### Map output: (0,0,0,1) (1,2,3)
##### Map input: (2,0) 7
##### Map output: (0,0,0,1) (2,0,7)
##### Map input: (2,1) 6
##### Map output: (0,0,0,1) (2,1,6)
##### Map input: (2,2) 2
##### Map output: (0,0,0,1) (2,2,2)
Bản đồ đầu ra cho Matrix A:
##### Map setup: matrixA = true for hdfs://localhost/user/hadoop-user/A
strategy = 4
R1 = 4
I = 3
K = 3
J = 3
IB = 3
KB = 3
JB = 3
##### Map input: (1,1) 1
##### Map output: (0,0,0,0) (1,1,1)
##### Map input: (1,2) 6
##### Map output: (0,0,0,0) (1,2,6)
##### Map input: (2,0) 7
##### Map output: (0,0,0,0) (2,0,7)
##### Map input: (2,1) 8
##### Map output: (0,0,0,0) (2,1,8)
##### Map input: (2,2) 9
##### Map output: (0,0,0,0) (2,2,9)
ý rằng bản đồ cho ma trận A không đọc số không từ tập tin đầu vào. Lưu ý: cả hai tệp đầu vào đều được lưu trữ trong HDFS dưới dạng tệp trình tự và đầu ra cũng là một tệp chuỗi. Ai đó có thể làm sáng tỏ vấn đề là gì không? Cảm ơn!
Mã cho lớp Mapper được đưa ra dưới đây:
/** The job 1 mapper class. */
private static class Job1Mapper
extends Mapper<IndexPair, IntWritable, Key, Value>
{
private Path path;
private boolean matrixA;
private Key key = new Key();
private Value value = new Value();
public void setup (Context context) {
init(context);
FileSplit split = (FileSplit)context.getInputSplit();
path = split.getPath();
matrixA = path.toString().startsWith(inputPathA);
if (DEBUG) {
System.out.println("##### Map setup: matrixA = " + matrixA + " for " + path);
System.out.println(" strategy = " + strategy);
System.out.println(" R1 = " + R1);
System.out.println(" I = " + I);
System.out.println(" K = " + K);
System.out.println(" J = " + J);
System.out.println(" IB = " + IB);
System.out.println(" KB = " + KB);
System.out.println(" JB = " + JB);
}
}
private void printMapInput (IndexPair indexPair, IntWritable el) {
System.out.println("##### Map input: (" + indexPair.index1 + "," +
indexPair.index2 + ") " + el.get());
}
private void printMapOutput (Key key, Value value) {
System.out.println("##### Map output: (" + key.index1 + "," +
key.index2 + "," + key.index3 + "," + key.m + ") (" +
value.index1 + "," + value.index2 + "," + value.v + ") ");
}
private void badIndex (int index, int dim, String msg) {
System.err.println("Invalid " + msg + " in " + path + ": " + index + " " + dim);
System.exit(1);
}
public void map (IndexPair indexPair, IntWritable el, Context context)
throws IOException, InterruptedException
{
if (DEBUG) printMapInput(indexPair, el);
int i = 0;
int k = 0;
int j = 0;
if (matrixA) {
i = indexPair.index1;
if (i < 0 || i >= I) badIndex(i, I, "A row index");
k = indexPair.index2;
if (k < 0 || k >= K) badIndex(k, K, "A column index");
} else {
k = indexPair.index1;
if (k < 0 || k >= K) badIndex(k, K, "B row index");
j = indexPair.index2;
if (j < 0 || j >= J) badIndex(j, J, "B column index");
}
value.v = el.get();
if (matrixA) {
key.index1 = i/IB;
key.index3 = k/KB;
key.m = 0;
value.index1 = i % IB;
value.index2 = k % KB;
for (int jb = 0; jb < NJB; jb++) {
key.index2 = jb;
context.write(key, value);
if (DEBUG) printMapOutput(key, value);
}
} else {
key.index2 = j/JB;
key.index3 = k/KB;
key.m = 1;
value.index1 = k % KB;
value.index2 = j % JB;
for (int ib = 0; ib < NIB; ib++) {
key.index1 = ib;
context.write(key, value);
if (DEBUG) printMapOutput(key, value);
}
}
}
}
Nếu có bất kỳ lỗi cú pháp, nó chỉ vì tôi copy-dán mã và sửa đổi nó ở đây, vì vậy tôi có thể đã bỏ qua điều gì đó.
Tôi cần trợ giúp về logic của hàm Bản đồ, không đọc 0 từ tệp đầu vào, bất kỳ ai cũng có thể cho tôi biết lý do không?
Đây là hơn 700 dòng mã. Bạn có nghĩ rằng bất cứ ai sẽ gỡ lỗi thông qua điều này cho bạn? –
Tôi đã sửa đổi bài đăng của mình để chỉ bao gồm mã lớp bản đồ. Tôi cần trợ giúp về logic, theo nghĩa nào đó, tôi không thể đưa ra giải thích là tại sao 0 không được đọc bởi tệp đầu vào bởi hàm Bản đồ. – Chaos
@ThomasJungblut - Tôi nghĩ bạn sẽ quảng bá Hama cho phép nhân Matrix :) –