[HADOOP] Java API를 사용하여 HDFS에 데이터 업로드
HADOOPJava 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.나는 당신이 따르는 접근법에 대해 확신하지 못한다. 그러나 아래는 자바 라이브러리를 사용하여 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.두가지:
두가지:
RunJar 클래스의 createClassLoader 메서드를 검토하면 여러 위치가 클래스 경로에 포함되어있는 것을 볼 수 있습니다.
그런 다음 java -jar 명령을 사용하여 클래스를 직접 실행하는 경우 hadoop jar이 수행중인 hadoop에서 작업을 실행하는 데 필요한 다른 모든 단계를 무시할 수 있습니다.
-
==============================
3.카사,이 방법을 써야 해.
카사,이 방법을 써야 해.
public static FileSystem get(URI uri,Configuration conf)
fs를 얻으려면 java -jar 명령을 사용하는 경우 uri 매개 변수가 필요합니다.
from https://stackoverflow.com/questions/32399075/upload-data-to-hdfs-with-java-api by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] Hive 그룹에서 요소별로 배열 / 가방을 얻는 방법은? (0) | 2019.07.02 |
---|---|
[HADOOP] 파일을 HDFS에 저장하는 명령 (0) | 2019.07.02 |
[HADOOP] NoSuchMethodError : org.apache.spark.sql.SQLContext.applySchema (0) | 2019.07.02 |
[HADOOP] PySpark : newAPIHadoopFile을 사용하여 여러 줄 레코드 텍스트 파일에서 읽고 매핑하고 줄입니다. (0) | 2019.07.02 |
[HADOOP] 감속기가 <Text, IntWritable> 및 <Text, IntWritable>을 수신 할 매퍼를 내보내도록 설정하는 방법은 무엇입니까? (0) | 2019.07.02 |