Java 为什么检查hadoop中是否存在文件会导致NullPointerException?

Java 为什么检查hadoop中是否存在文件会导致NullPointerException?,java,hadoop,Java,Hadoop,我试图创建或打开一个文件以在HDFS中存储一些输出,但在调用下面代码段倒数第二行中的exists方法时,我得到了一个NullPointerException: DistributedFileSystem dfs = new DistributedFileSystem(); Path path = new Path("/user/hadoop-user/bar.txt"); if (!dfs.exists(path)) dfs.createNewFile(path); FSDataOutputSt

我试图创建或打开一个文件以在HDFS中存储一些输出,但在调用下面代码段倒数第二行中的
exists
方法时,我得到了一个NullPointerException:

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)

可能是什么问题?

默认构造函数DistributedFileSystem()不执行初始化;您需要显式调用dfs.initialize()

出现空指针异常的原因是DistributedFileSystem在内部使用DFSClient的实例。由于未调用initialize(),DFSClient的实例为空。getFileStatus()调用dfsClient.getFileInfo(getPathName(f)-这会导致NullPointerException,因为dfsClient为null


参见

我认为最好的方法是:

Configuration conf = new Configuration();
conf.set("fs.default.name", "hdfs://mynamenodehost:9000");
FileSystem fs = FileSystem.get(conf);
Path path = ...
这样,您就不必将代码绑定到文件系统的特定实现;另外,您也不必担心文件系统的每个实现是如何初始化的

这应该有用


你能发布异常stacktrace吗?我添加了stack trace.mhh中没有任何记录:-/我想你应该尝试为此打开一个问题。检查邮件列表:dfs.initialize()需要两个参数,一个URI和一个配置。我假设配置就是客户端设置为的JobConf。URI呢?根据文档,URI是“一个URI,它的权限部分为这个文件系统命名主机、端口等。”我如何得到它?我用什么来代替
conf.set中的字符串(“fs.default.name”hdfs://mynamenodehost:9000“
?哦,好的,我刚刚在虚拟机上替换了
ifconfig
的结果,结果成功了。
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);