我正在运行在此站点找到的 MapReduce Matrix Multiplication.java 程序 http://www.norstad.org/matrix-multiply/index.html .
(源码见文末)
当我执行它时,它说输入不是一个序列文件
我的输入文件最近是inputA.txt
,它看起来像这样
A,0,1,1.0
A,0,2,2.0
A,0,3,3.0
A,0,4,4.0
A,1,0,5.0
A,1,1,6.0
A,1,2,7.0
A,1,3,8.0
A,1,4,9.0
格式为:MatrixName, row, col, element
当然,它没有用。
我真的很想运行这个源代码,因为它的算法。那么在这种情况下如何生成正确的 SequenceFile 呢?
我可以从已有的 .txt 文件生成它吗?
最佳答案
查看 TestMatrixMultiply
中包含的测试代码(在您提供的链接中)应该会给您一些有用的东西。
我已经提取了相关部分来帮助您入门。此(未经测试的)代码应创建两个序列文件(参见 testIdentity()
)。
您可以在 writeMatrix
方法中看到它如何创建 SequenceFile 和使用的结构,我假设这与实际的 mapreduce 作业使用的相同。
您可以扩展此代码以读取您的文本文件,正确填充二维矩阵数组,然后编写序列文件。
public class TestMatrixMultiply {
private static final String DATA_DIR_PATH = "/tmp/MatrixMultiply";
private static final String INPUT_PATH_A = DATA_DIR_PATH + "/A";
private static final String INPUT_OATH_B = DATA_DIR_PATH + "/B";
private static Configuration conf = new Configuration();
private static FileSystem fs;
public static void writeMatrix (int[][] matrix,
int rowDim, int colDim, String pathStr) throws IOException {
Path path = new Path(pathStr);
SequenceFile.Writer writer = SequenceFile.createWriter(fs, conf, path,
MatrixMultiply.IndexPair.class, IntWritable.class,
SequenceFile.CompressionType.NONE);
MatrixMultiply.IndexPair indexPair = new MatrixMultiply.IndexPair();
IntWritable el = new IntWritable();
for (int i = 0; i < rowDim; i++) {
for (int j = 0; j < colDim; j++) {
int v = matrix[i][j];
if (v != 0) {
indexPair.index1 = i;
indexPair.index2 = j;
el.set(v);
writer.append(indexPair, el);
}
}
}
writer.close();
}
public static void main (String[] args) throws Exception {
new GenericOptionsParser(conf, args);
fs = FileSystem.get(conf);
fs.mkdirs(new Path(DATA_DIR_PATH));
A = new int[][] { {1,0}, {0,1}};
B = new int[][] { {1,0}, {0,1}};
writeMatrix(A, 2, 2, INPUT_PATH_A);
writeMatrix(B, 2, 2, INPUT_OATH_B);
}
}
您应该注意,这种方法适用于少量数据。一旦您开始达到任何规模,您可能想要编写一个 mapreduce 作业,将您的文本文件作为输入并写出一个序列文件。
关于矩阵乘法的Hadoop输入SequenceFile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40490334/