복붙노트

[HADOOP] Java API를 사용하여 HDFS에 데이터 업로드

HADOOP

Java API를 사용하여 HDFS에 데이터 업로드

나는 지금 약간의 시간을 수색했고 아무 해결책도 나를 위해 일하지 않는 것처럼 보인다.

매우 간단합니다 - Java API를 사용하여 로컬 파일 시스템에서 HDFS로 데이터를 업로드하고 싶습니다. Java 프로그램은 셸 (예 : hdfs dfs -ls 등)을 통해 원격 Hadoop 클러스터와 통신하도록 구성된 호스트에서 실행됩니다.

내 프로젝트에 아래의 종속성을 포함 시켰습니다.

hadoop-core:1.2.1
hadoop-common:2.7.1
hadoop-hdfs:2.7.1

다음과 같은 코드가 있습니다.

 File localDir = ...;
 File hdfsDir = ...;
 Path localPath = new Path(localDir.getCanonicalPath());
 Path hdfsPath = new Path(hdfsDir.getCanonicalPath());
 Configuration conf = new Configuration();
 conf.set("fs.hdfs.impl", org.apache.hadoop.hdfs.DistributedFileSystem.class.getName());
 conf.set("fs.file.impl", org.apache.hadoop.fs.LocalFileSystem.class.getName());
 Filesystem fs = FileSystem.get(configuration);
 fs.getFromLocalFile(localPath, hdfsPath);

로컬 데이터가 Hadoop 클러스터로 복사되지 않지만 오류가보고되지 않으며 예외가 발생하지 않습니다. org.apache.hadoop 패키지에 대한 TRACE 로깅을 사용하도록 설정했습니다. 다음 결과가 표시됩니다.

 DEBUG Groups:139 -  Creating new Groups object
 DEBUG Groups:139 -  Creating new Groups object
 DEBUG Groups:59 - Group mapping impl=org.apache.hadoop.security.ShellBasedUnixGroupsMapping; cacheTimeout=300000
 DEBUG Groups:59 - Group mapping impl=org.apache.hadoop.security.ShellBasedUnixGroupsMapping; cacheTimeout=300000
 DEBUG UserGroupInformation:147 - hadoop login
 DEBUG UserGroupInformation:147 - hadoop login
 DEBUG UserGroupInformation:96 - hadoop login commit
 DEBUG UserGroupInformation:96 - hadoop login commit
 DEBUG UserGroupInformation:126 - using local user:UnixPrincipal: willra05
 DEBUG UserGroupInformation:126 - using local user:UnixPrincipal: willra05
 DEBUG UserGroupInformation:558 - UGI loginUser:<username_redacted>
 DEBUG UserGroupInformation:558 - UGI loginUser:<username_redacted>
 DEBUG FileSystem:1441 - Creating filesystem for file:///
 DEBUG FileSystem:1441 - Creating filesystem for file:///
 DEBUG FileSystem:1290 - Removing filesystem for file:///
 DEBUG FileSystem:1290 - Removing filesystem for file:///
 DEBUG FileSystem:1290 - Removing filesystem for file:///
 DEBUG FileSystem:1290 - Removing filesystem for file:///

아무도 내가이 문제를 해결하도록 도울 수 있습니까?

수정 1 : (2014 년 9 월 15 일)

Hadoop 의존성 중 2 개를 제거했습니다. 지금은 하나만 사용하고 있습니다.

hadoop-core:1.2.1

내 코드는 이제 다음과 같습니다.

File localDir = ...;
File hdfsDir = ...;
Path localPath = new Path(localDir.getCanonicalPath());
Path hdfsPath = new Path(hdfsDir.getCanonicalPath());
Configuration conf = new Configuration();
fs.getFromLocalFile(localPath, hdfsPath);

이전에 다음 명령을 사용하여 응용 프로그램을 실행했습니다.

$ java -jar <app_name>.jar <app_arg1> <app_arg2> ...

이제이 명령으로 실행하고 있습니다.

$ hadoop jar <app_name>.jar <app_arg1> <app_arg2> ...

이러한 변경 사항을 통해 이제 내 응용 프로그램은 의도 한대로 HDFS와 상호 작용합니다. 내가 아는 한, hadoop jar 명령은 실행 가능한 jar로 패키징 된 Map Reduce 작업에 대해서만 의미가 있지만,이 변경 사항은 나에게 도움이되었다.

해결법

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

    1.나는 당신이 따르는 접근법에 대해 확신하지 못한다. 그러나 아래는 자바 라이브러리를 사용하여 hdfs에 데이터를 업로드 할 수있는 한 가지 방법이다.

    나는 당신이 따르는 접근법에 대해 확신하지 못한다. 그러나 아래는 자바 라이브러리를 사용하여 hdfs에 데이터를 업로드 할 수있는 한 가지 방법이다.

    //imports required 
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FileSystem;
    
    //some class here .....
    Configuration conf = new Configuration();
    conf.set("fs.defaultFS", <hdfs write endpoint>);
    FileSystem fs = FileSystem.get(conf);
    fs.copyFromLocalFile(<src>, <dst>);
    

    또한 hadoop conf xmls를 로컬로 가지고 있다면 클래스 경로에 포함시킬 수 있습니다. 그런 다음 hadoop fs 세부 사항이 런타임에 자동으로 선택되므로 "fs.defaultFS"를 설정할 필요가 없습니다. 또한 이전 hdfs 버전에서 실행중인 경우 "fs.defaultFS"대신 "fs.default.name"을 사용해야 할 수도 있습니다. hdfs 엔드 포인트를 모르는 경우 일반적으로 hdfs namenode url입니다. 다음은 로컬 시스템에서 hdfs java 코드로 디렉토리를 복사하는 이전 유사한 질문의 예제입니다

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

    2.두가지:

    두가지:

    RunJar 클래스의 createClassLoader 메서드를 검토하면 여러 위치가 클래스 경로에 포함되어있는 것을 볼 수 있습니다.

    그런 다음 java -jar 명령을 사용하여 클래스를 직접 실행하는 경우 hadoop jar이 수행중인 hadoop에서 작업을 실행하는 데 필요한 다른 모든 단계를 무시할 수 있습니다.

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

    3.카사,이 방법을 써야 해.

    카사,이 방법을 써야 해.

    public static FileSystem get(URI uri,Configuration conf)
    

    fs를 얻으려면 java -jar 명령을 사용하는 경우 uri 매개 변수가 필요합니다.

  4. from https://stackoverflow.com/questions/32399075/upload-data-to-hdfs-with-java-api by cc-by-sa and MIT license