복붙노트

[HADOOP] 왜 파일이 ​​hadoop에 존재하는지 검사하면 NullPointerException이 발생합니까?

HADOOP

왜 파일이 ​​hadoop에 존재하는지 검사하면 NullPointerException이 발생합니까?

만들기 또는 HDFS 일부 출력을 저장하는 파일을 열려고하지만 아래 코드 줄 마지막 줄 두 번째 exist 메서드를 호출 할 때 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)

문제는 무엇이 될 수 있습니까?

해결법

  1. ==============================

    1.나는 이렇게하는 것이 선호되는 방법이라고 생각한다.

    나는 이렇게하는 것이 선호되는 방법이라고 생각한다.

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

    그렇게하면 FileSystem의 특정 구현에 코드를 묶지 않아도됩니다. 또한 FileSystem의 각 구현을 초기화하는 방법에 대해 걱정할 필요가 없습니다.

  2. ==============================

    2.기본 생성자 인 DistributedFileSystem ()은 초기화를 수행하지 않습니다. dfs.initialize ()를 명시 적으로 호출해야합니다.

    기본 생성자 인 DistributedFileSystem ()은 초기화를 수행하지 않습니다. dfs.initialize ()를 명시 적으로 호출해야합니다.

    널 포인터 예외가 발생하는 이유는 DistributedFileSystem이 내부적으로 DFSClient의 인스턴스를 사용하기 때문입니다. initialize ()를 호출하지 않았으므로 DFSClient의 인스턴스는 null입니다. getFileStatus ()는 dfsClient.getFileInfo (getPathName (f))를 호출합니다. 이는 dfsClient가 null이므로 NullPointerException을 발생시킵니다.

    https://trac.declarativity.net/browser/src/hdfs/org/apache/hadoop/dfs/DistributedFileSystem.java?rev=3593을 참조하십시오.

  3. ==============================

    3.

    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);
    
  4. from https://stackoverflow.com/questions/4727901/why-does-checking-whether-a-file-exists-in-hadoop-cause-a-nullpointerexception by cc-by-sa and MIT license