Почему проверка наличия файла в hadoop вызывает исключение NullPointerException? - PullRequest
6 голосов
/ 18 января 2011

Я пытаюсь создать или открыть файл для хранения некоторого вывода в HDFS, но я получаю исключение NullPointerException, когда вызываю метод exists во второй строке кода фрагмента кода ниже:

DistributedFileSystem dfs = new DistributedFileSystem();
Path path = new Path("/user/hadoop-user/bar.txt");
if (!dfs.exists(path)) dfs.createNewFile(path);
FSDataOutputStream dos = dfs.create(path);

Вот трассировка стека:

java.lang.NullPointerException
        at org.apache.hadoop.dfs.DistributedFileSystem.getFileStatus(DistributedFileSystem.java:390)
        at org.apache.hadoop.fs.FileSystem.exists(FileSystem.java:667)
        at ClickViewSessions$ClickViewSessionsMapper.map(ClickViewSessions.java:80)
        at ClickViewSessions$ClickViewSessionsMapper.map(ClickViewSessions.java:65)
        at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:47)
        at org.apache.hadoop.mapred.MapTask.run(MapTask.java:227)
        at org.apache.hadoop.mapred.TaskTracker$Child.main(TaskTracker.java:2209)

В чем может быть проблема?

Ответы [ 3 ]

10 голосов
/ 19 января 2011

Я думаю, предпочтительный способ сделать это:

Configuration conf = new Configuration();
conf.set("fs.default.name", "hdfs://mynamenodehost:9000");
FileSystem fs = FileSystem.get(conf);
Path path = ...

Таким образом, вы не привязываете свой код к конкретной реализации FileSystem;плюс вам не нужно беспокоиться о том, как инициализируется каждая реализация FileSystem.

8 голосов
/ 18 января 2011

Конструктор по умолчанию DistributedFileSystem () не выполняет инициализацию;вам нужно явно вызвать dfs.initialize ().

Причина, по которой вы получаете исключение нулевого указателя, заключается в том, что DistributedFileSystem внутренне использует экземпляр DFSClient.Поскольку вы не вызывали initialize (), экземпляр DFSClient имеет значение null.getFileStatus () вызывает dfsClient.getFileInfo (getPathName (f) - что вызывает NullPointerException, поскольку dfsClient имеет значение null.

См. https://trac.declarativity.net/browser/src/hdfs/org/apache/hadoop/dfs/DistributedFileSystem.java?rev=3593

0 голосов
/ 22 октября 2013

Это шоуд работа

DistributedFileSystem dfs = new DistributedFileSystem();
dfs.initialize(new URI("URI to HDFS"), new Configuration());
Path path = new Path("/user/hadoop-user/bar.txt");
if (!dfs.exists(path)) dfs.createNewFile(path);
FSDataOutputStream dos = dfs.create(path);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...