Java HDF fsDataOutputStream при записи не удается создать пустой файл - PullRequest
1 голос
/ 23 октября 2019

У меня странная проблема с записью небольших файлов на hadoop. ниже приведен пример программы

public void writeFile(Configuration conf, String message, String filename) throws Exception {
        FSDataOutputStream fsDataOutputStream = null;
        DistributedFileSystem fs = null;
        try {
            fs = (DistributedFileSystem) FileSystem.get(URI.create(properties.getHadoop().getRawLocation()), conf);
            Path hdfswritepath = new Path(properties.getHadoop().getRawLocation() + "/" + filename + ".json");
            fsDataOutputStream = fs.create(hdfswritepath);
            fsDataOutputStream.write(message.getBytes());
            fsDataOutputStream.close();
            fsDataOutputStream.hsync();
        } catch (IllegalArgumentException | IOException e) {
            System.out.println("Got Exception");
            e.printStackTrace();
            throw e;
        } finally {
            fs.close();
            System.out.println("clean up done");
        }

    }

Выше код создает пустой файл в месте расположения hasoop. Вот некоторые из них, которые я пробовал

  1. Брандмауэр не существует между клиентом и сервером hadoop
  2. Работает копирование с локального на hadoop.

Проблема в создании только 0-байтового файла.

Я получаю исключение для этого ниже.

09:12:02,129 INFO  [org.apache.hadoop.hdfs.DFSClient] (Thread-118) Exception in createBlockOutputStream: java.net.ConnectException: Connection timed out: no further information
    at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
    at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717)
    at org.apache.hadoop.net.SocketIOWithTimeout.connect(SocketIOWithTimeout.java:206)
    at org.apache.hadoop.net.NetUtils.connect(NetUtils.java:531)
    at org.apache.hadoop.hdfs.DFSOutputStream.createSocketForPipeline(DFSOutputStream.java:1533)
    at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.createBlockOutputStream(DFSOutputStream.java:1309)
    at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.nextBlockOutputStream(DFSOutputStream.java:1262)
    at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:448)

1 Ответ

1 голос
/ 23 октября 2019

Мне удалось это исправить с помощью

conf.set ("dfs.client.use.datanode.hostname", "true");

...