Создать файл последовательности Hadoop - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь создать файл последовательности hadoop.

Я успешно создаю файл последовательности в HDFS, но если я пытаюсь прочитать файл последовательности, «Файл последовательности не является файлом последовательности» Произошла ошибка. Я также проверяю созданный файл последовательности в HDFS.

enter image description here

Вот мой исходный код, который может читать и записывать файл последовательности в HDFS.

package us.qi.hdfs;

import java.io.IOException;
import java.net.URI;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.ArrayFile;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.SequenceFile;
import org.apache.hadoop.io.Text;

public class SequenceFileText {
    public static void main(String args[]) throws IOException {

        /** Get Hadoop HDFS command and Hadoop Configuration*/
        HDFS_Configuration conf = new HDFS_Configuration();
        HDFS_Test hdfs = new HDFS_Test();

        String uri = "hdfs://slave02:9000/user/hadoop/test.seq";

        /** Get Configuration from HDFS_Configuration Object by using get_conf()*/
        Configuration config = conf.get_conf();

        SequenceFile.Writer writer = null;
        SequenceFile.Reader reader = null;

        try {
            Path path = new Path(uri);

            IntWritable key = new IntWritable();
            Text value = new Text();

            writer = SequenceFile.createWriter(config, SequenceFile.Writer.file(path), SequenceFile.Writer.keyClass(key.getClass()),
                    ArrayFile.Writer.valueClass(value.getClass()));
            reader = new SequenceFile.Reader(config, SequenceFile.Reader.file(path));

            writer.append(new IntWritable(11), new Text("test"));
            writer.append(new IntWritable(12), new Text("test2"));
            writer.close();

            while (reader.next(key, value)) {
                System.out.println(key + "\t" + value);
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            IOUtils.closeStream(writer);
            IOUtils.closeStream(reader);
        }
    }
}

И эта ошибка возникает.

2018-09-17 17: 15: 34,267 WARN [main] util.NativeCodeLoader (NativeCodeLoader.java:(62)) - Невозможно загрузить native-hadoop библиотека для вашей платформы ... с использованием встроенных классов Java, где применимо 2018-09-17 17: 15: 38 870 ИНФОРМАЦИЯ [основная] компресс. Кодовый бассейн (CodecPool.java:getCompressor(153)) - Получен новый компрессор [.deflate] java.io.EOFException: hdfs: // slave02: 9000 / user / hadoop / test.seq не является SequenceFile в org.apache.hadoop.io.SequenceFile $ Reader.init (SequenceFile.java:1933) в org.apache.hadoop.io.SequenceFile $ Reader.initialize (SequenceFile.java:1892) в org.apache.hadoop.io.SequenceFile $ чтения. (SequenceFile.java:1841) at us.qi.hdfs.SequenceFileText.main (SequenceFileText.java:36)

1 Ответ

0 голосов
/ 18 сентября 2018

Это моя ошибка. Я изменяю некоторый исходный код.

Во-первых, я проверяю, что файл уже существует в hdfs. Если файла нет, я создаю объект записи.

И когда процесс записи завершен, я проверяю файл последовательности. После проверки файла я успешно прочитал файл последовательности.

Вот мой код. Спасибо!

try {
            Path path = new Path(uri);

            IntWritable key = new IntWritable();
            Text value = new Text();

            /** First, Check a file already exists.
             * If there is not exists in hdfs, writer object is created.
             * */
            if (!fs.exists(path)) {
                writer = SequenceFile.createWriter(config, SequenceFile.Writer.file(path), SequenceFile.Writer.keyClass(key.getClass()),
                        ArrayFile.Writer.valueClass(value.getClass()));

                writer.append(new IntWritable(11), new Text("test"));
                writer.append(new IntWritable(12), new Text("test2"));
                writer.close();
            } else {
                logger.info(path + " already exists.");
            }

            /** Create a SequenceFile Reader object.*/
            reader = new SequenceFile.Reader(config, SequenceFile.Reader.file(path));

            while (reader.next(key, value)) {
                System.out.println(key + "\t" + value);
            }

            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            IOUtils.closeStream(writer);
            IOUtils.closeStream(reader);
        }
...