Почему проверка наличия файла в hadoop вызывает исключение NullPointerException?
Я пытаюсь создать или открыть файл для хранения некоторого вывода в 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 ответа
Я думаю, что предпочтительный способ сделать это:
Configuration conf = new Configuration();
conf.set("fs.default.name", "hdfs://mynamenodehost:9000");
FileSystem fs = FileSystem.get(conf);
Path path = ...
Таким образом, вы не привязываете свой код к конкретной реализации FileSystem; Кроме того, вам не нужно беспокоиться о том, как инициализируется каждая реализация FileSystem.
Конструктор по умолчанию DistributedFileSystem() не выполняет инициализацию; вам нужно явно вызвать dfs.initialize().
Причина, по которой вы получаете исключение нулевого указателя, заключается в том, что DistributedFileSystem внутренне использует экземпляр DFSClient. Поскольку вы не вызывали initialize(), экземпляр DFSClient имеет значение null. getFileStatus() вызывает dfsClient.getFileInfo(getPathName(f) - что вызывает исключение NullPointerException, поскольку dfsClient имеет значение null.
Это шоуд работа
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);