복붙노트

[HADOOP] 프로그래밍 방식으로 Hadoop HDFS 쓰기 작업

HADOOP

프로그래밍 방식으로 Hadoop HDFS 쓰기 작업

나는 비슷한 질문을했다.하지만 내가 무슨 말을하고 있는지 알지 못했다. 나는이 질문을 세부 사항과 포인트 쿼리에 게시하고있다.

그래서 namenode와 2 개의 datanode를 가진 hadoop 클러스터를 설정했습니다. 2.9.0을 사용하고 있습니다. hdfs dfs -put "SomeRandomFile"명령을 실행했는데 제대로 작동하는 것 같습니다. 내가 여기있는 유일한 혼란은 / user / hduser / path에 내 파일을 저장하는 이유는 무엇입니까? 구성에서이 경로를 지정하지 않았으므로 hdfs에서이 경로를 구축하는 방법은 무엇입니까?

또한 같은 일을하는 작은 자바 프로그램을 만들었습니다. 간단한 이클립스 프로젝트를 만들고 다음 줄을 썼다.

public static boolean fileWriteHDFS(InputStream input, String fileName) {   
    try {
        System.setProperty("HADOOP_USER_NAME", "hduser");

        //Get Configuration of Hadoop system
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS", "hdfs://localhost:9000");
        //conf.get("fs.defaultFS");     

        //Extract destination path
        URI uri = URI.create(DESTINATION_PATH+fileName);
        Path path = new Path(uri);

        //Destination file in HDFS
        FileSystem fs = FileSystem.get(uri, conf); //.get(conf);

        //Check if the file already exists
        if (fs.exists(path))
        {
            //Write appropriate error to log file and return.
            return false;
        }

        //Create an Output stream to the destination path
        FSDataOutputStream out = fs.create(path);

        //Copy file from input steam to HDFSs
        IOUtils.copyBytes(input, out, 4096, true);

        //Close all the file descriptors
        out.close();
        fs.close();
        //All went perfectly as planned
        return true;    
    } catch (Exception e) {
        //Something went wrong
        System.out.println(e.toString());
        return false;
    }
}

그리고 다음 세 개의 hadoop 라이브러리를 추가했습니다.

당신이 볼 수 있듯이 내 hadoop 설치 위치는 /home/hduser/bin/hadoop-2.9.0 / ...이 코드를 실행하면 예외가 발생합니다. 즉

Exception in thread "main" java.lang.NoClassDefFoundError: com/ctc/wstx/io/InputBootstrapper
at com.ws.filewrite.fileWrite.fileWriteHDFS(fileWrite.java:21)
at com.ws.main.listenerService.main(listenerService.java:21)
Caused by: java.lang.ClassNotFoundException: com.ctc.wstx.io.InputBootstrapper
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 2 more

특히 예외는 거짓말에 던져집니다 :

내가 여기서 뭔가를 놓치고 있니? 이 문제의 원인은 무엇입니까? 나는 HDFS에 완전히 새로운 것이므로 분명히 나에게 용서해 준다.

해결법

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

    1.hadoop 2.9 종속성은 hadoop 2.6과 유사하지 않습니다.

    hadoop 2.9 종속성은 hadoop 2.6과 유사하지 않습니다.

    나는 같은 상황을 겪었고 의존성 항아리를 찾으려고 노력했다. 그게 어렵고 다음 번에 또 다른 병이 놓칠 수도 있습니다.

    그래서 Maven을 관리자 의존성에 사용합니다.

    이 두 가지 종속성을 추가하면 문제가 해결됩니다.

        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>2.9.0</version>
            <!--<scope>provided</scope>-->
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-hdfs</artifactId>
            <version>2.9.0</version>
        </dependency>
    
  2. from https://stackoverflow.com/questions/47823715/hadoop-hdfs-write-operation-programmatically by cc-by-sa and MIT license