1

Я запускал программу MapReduce Matrix Multiplication.java, найденную на этом сайте http://www.norstad.org/matrix-multiply/index.html.
(исходный код можно увидеть в конце участка)Hadoop input SequenceFile умножения матрицы

Когда я выполнил его, он сказал, что вход не был SequenceFile

Мой входной файл недавно 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-файла, который у меня уже есть?

ответ

1

Глядя на прилагаемый тестовый код (по предоставленной вами ссылке) в TestMatrixMultiply должен дать вам что-то для работы.

Я достал соответствующие биты, чтобы вы начали. Этот (непроверенный) код должен создавать два файла последовательности (см. testIdentity()).

В методе writeMatrix вы можете увидеть, как он создает SequenceFile и используемую структуру, которую я предполагаю, это то же самое, с которой работает фактическое задание mapreduce.

Вы можете расширить этот код, чтобы прочитать свой текстовый файл, правильно заполнить 2D-матричный массив и затем записать файл последовательности.

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, которое берет ваш текстовый файл в качестве входных данных и выписывает файл последовательности.

Смежные вопросы