2012-10-08 5 views
8

Java 코드를 사용하여 로컬 시스템에서 HDFS로 디렉토리를 복사하는 데 문제가 있습니다. 개별 파일을 이동할 수는 있지만 하위 폴더 및 파일을 사용하여 전체 디렉토리를 이동하는 방법을 알아낼 수는 없습니다. 누구든지 저를 도울 수 있습니까? 미리 감사드립니다.디렉토리를 로컬 시스템에서 hdfs로 복사 Java 코드

+0

어떤 버전의 Hadoop을 사용하고 있습니까? 'bin/hadoop dfs -copyFromLocal folder'는'folder'를 복사하고 재귀 적으로 모든 것을 복사합니다. 디렉토리가 '파일'이 아니기 때문에 –

+0

입니다. 재귀 적으로 디렉토리를 생성하고 하나씩 파일을 이동해야합니다 (원하는 경우 평행하게 수행 할 수 있습니다). 물론,이 작업은 원 자성이 아니라는 것을 알아야합니다. 따라서 실패 할 경우 hdfs에서 끝난 파일이 있습니다. – octo

답변

17

FileSystemcopyFromLocalFile 방법을 사용하면됩니다. 소스 경로가 로컬 디렉토리 인 경우 HDFS 대상에 복사됩니다.

... 
Configuration conf = new Configuration(); 
conf.addResource(new Path("/home/user/hadoop/conf/core-site.xml")); 
conf.addResource(new Path("/home/user/hadoop/conf/hdfs-site.xml")); 

FileSystem fs = FileSystem.get(conf); 
fs.copyFromLocalFile(new Path("/home/user/directory/"), 
    new Path("/user/hadoop/dir")); 
... 
+0

내가 제공하는 hdfs의 경로는 "hdfs : //cluster.abc.com : 8080/user/something"형식이지만 "wrong FS, expected file : ///"라고 표시됩니다. 이것에 대한 도움이 필요하십니까? – Chirag

+1

fs.default.name에 대한 core-site.xml에는 어떤 값이 있습니까? hdfs : // host [: port] –

+0

감사합니다. fs.default.name을 필요한 hdfs : // host : port로 설정하십시오. – Chirag

0

여기는 HDFS에서 읽고 쓰는 전체 작업 코드입니다. 이 두 인자

  1. 입력 경로 (로컬/HDFS)

  2. 출력 경로 (HDFS) I는 클라우 데라 샌드 박스를 사용

걸린다.

package hdfsread; 

import java.io.BufferedInputStream; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.net.URI; 

import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.fs.FileSystem; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.io.IOUtils; 

public class ReadingAFileFromHDFS { 

    public static void main(String[] args) throws IOException { 
     String uri = args[0]; 
     InputStream in = null; 
     Path pt = new Path(uri); 
     Configuration myConf = new Configuration(); 
     Path outputPath = new Path(args[1]); 

     myConf.set("fs.defaultFS","hdfs://quickstart.cloudera:8020"); 
     FileSystem fSystem = FileSystem.get(URI.create(uri),myConf); 
     OutputStream os = fSystem.create(outputPath); 
     try{ 
      InputStream is = new BufferedInputStream(new FileInputStream(uri)); 
      IOUtils.copyBytes(is, os, 4096, false); 
     } 
     catch(IOException e){ 
      e.printStackTrace(); 
     } 
     finally{ 
      IOUtils.closeStream(in); 
     } 
    } 
} 
+0

안녕하세요,이 하나를 시도하면 org/apache/hadoop/fs/FSDataOutputStream 오류가 나타납니다. 나는 hadoop-common, hadoop-hdfs 라이브러리를 pom에 추가했다. core-site.xml, hdfs-site.xml을 내 구성에 추가했습니다. – user4342532

관련 문제