Подтвердить что ты не робот

Запись файла в hdfs с помощью Java

Я хочу создать файл в HDFS и записать в него данные. Я использовал этот код:

Configuration config = new Configuration();     
FileSystem fs = FileSystem.get(config); 
Path filenamePath = new Path("input.txt");  
try {
    if (fs.exists(filenamePath)) {
        fs.delete(filenamePath, true);
    }

    FSDataOutputStream fin = fs.create(filenamePath);
    fin.writeUTF("hello");
    fin.close();
}

Он создает файл, но он ничего не пишет. Я много искал, но ничего не нашел. В чем моя проблема? Мне нужно разрешение на запись в HDFS?

Спасибо.

4b9b3361

Ответ 1

альтернатива @Tariq asnwer, вы можете передать URI при получении файловой системы

Configuration configuration = new Configuration();
FileSystem hdfs = FileSystem.get( new URI( "hdfs://localhost:54310" ), configuration );
Path file = new Path("hdfs://localhost:54310/s2013/batch/table.html");
if ( hdfs.exists( file )) { hdfs.delete( file, true ); } 
OutputStream os = hdfs.create( file,
    new Progressable() {
        public void progress() {
            out.println("...bytes written: [ "+bytesWritten+" ]");
        } });
BufferedWriter br = new BufferedWriter( new OutputStreamWriter( os, "UTF-8" ) );
br.write("Hello World");
br.close();
hdfs.close();

Ответ 2

Определите переменную среды HADOOP_CONF_DIR в вашей папке конфигурации Hadoop или добавьте следующие 2 строки в код:

config.addResource(new Path("/HADOOP_HOME/conf/core-site.xml"));
config.addResource(new Path("/HADOOP_HOME/conf/hdfs-site.xml"));

Если вы не добавите это, ваш клиент попытается записать локальную FS, что приведет к исключению, разрешенному для разрешения.

Ответ 3

Пожалуйста, попробуйте подход ниже.

FileSystem fs = path.getFileSystem(conf);
SequenceFile.Writer inputWriter = new SequenceFile.Writer(fs, conf, path, LongWritable.class, MyWritable.class);
inputWriter.append(new LongWritable(uniqueId++), new MyWritable(data));
inputWriter.close();