2013-03-11 3 views
0

내부의 모든 내용을 담은 HDFS에서 전체 디렉토리를 복사하는 가장 좋은 방법을 찾고 있습니다. 예 :내용이있는 디렉토리를 HDFS에서 로컬 파일 시스템으로 복사

Path srcPath = new Path("hdfs://localhost:9000/user/britva/data"); 
Path dstPath = new Path("/home/britva/Work"); 
fs.copyToLocal(false, srcPath, dstPath); 

또한 "data"폴더에는 "Work"디렉토리에없는 폴더가있을 수 있습니다. 이렇게하는 가장 좋은 방법은 무엇입니까?

답변 해 주셔서 감사합니다.

하나의 파일 시스템 -HDFS 만 초기화 했으므로 해결책 중 하나는 FileUtil 개체를 사용하는 것이지만 사용 방법은 확실하지 않다고 가정합니다. 그러면 문제는 내 로컬 FS를 어떻게 초기화해야합니까? 이 유틸리티는 많은 노드가있을 때 사용됩니다. 하지만 내가 원하는 것은 - 로컬 FS로 작업하여 HDFS에서 프로젝트 소스로 복사하는 것입니다.

또한 Play! 프레임 워크는 Play.application.path + "/public/stuff"처럼 경로를 사용하는 것이 좋습니다. 나는 위의 코드를 사용하기 위해 노력하고있어 경우

, 그것은 말한다 :

java.io.IOException: No FileSystem for scheme: file 
+1

'FileUtil.copy()'의'dstFS'로 사용하기 위해'LocalFileSystem' 객체를 인스턴스화해야한다고 생각합니다. 참조 : http://hadoop.apache.org/docs/current/api/org/apache/hadoop/fs/LocalFileSystem.html – Quetzalcoatl

+0

나는 그것을하려고하는데,'NullPointerException : null (RawLocalFileSystem. java : 370)'. 인터넷에서 보았을 때 fs.local.block.size를 읽는 순간이 내 conf 파일에 확실히 설정되어 있습니다. 조금 이상합니다. 비록 폴더가 내 로컬 FS에서 생성되었으므로 조금 나아졌습니다. 감사! – psisoyev

+0

네, 그것은 로컬 포인터가 자신의 구성 객체를 가지고 있지 않기 때문에 null 포인터를 발생시키는 것 같지만, 복사하는 동안 존재하지 않는 conf에서 로컬 블록 속성을 얻으려고합니다. 그래서 초기화 메소드를 호출하고 conf를 추가했습니다. 모든 것이 작동합니다. – psisoyev

답변

0

당신은 내가이 내 경우처럼 문제가 있었다 예외 '계획 없음 파일 시스템'에 관한 maven를 사용하여 프로젝트를 빌드하는 경우

실행하려는 JAR의 내용을 확인하십시오. 특히 META-INFO/services 디렉토리의 파일 org.apache.hadoop.fs.FileSystem. 파일 시스템 구현 클래스 목록이 있어야합니다. 확인 라인 org.apache.hadoop.hdfs.DistributedFileSystem은 HDFS에 대한 목록에 있고 로컬 파일 구성표에 대해서는 org.apache.hadoop.fs.LocalFileSystem입니다.

이 경우 빌드 중에 참조 된 리소스를 재정의해야합니다.

다른 가능성은 클래스 패스에 hadoop-hdfs.jar이 없어도 가능성이 낮습니다. 일반적으로 올바른 hadoop-client 종속성이있는 경우 옵션이 아닙니다.

1

저는 scala를 사용합니다. 그래서 여기에 자바와 비슷한 scala 예제가 있습니다.

1 단계. hdfs가 활성 상태인지 확인하십시오. 지역 사용자는 열려고 시도합니다. 127.0.0.1:50070

2 단계. 여기 스칼라 코드 :

val hdfsConfig = new Configuration 
val hdfsURI = "127.0.0.1:9000" 
val hdfs = FileSystem.get(new URI(hdfsURI), hdfsConfig) 
val targetPath = new Path("127.0.0.1:9000/hdfsData") 
if (hdfs.exists(targetPath)) { 
    hdfs.delete(targetPath, true) 
} 
val oriPath = new Path(#your_local_file_path) 
hdfs.copyFromLocalFile(oriPath, new Path(hdfsURI+"/")) 
hdfs.close() 

Step3. 예를 들어 내 로컬 파일 경로는/tmp/hdfsData입니다.

2 단계 코드를 실행 한 후이 디렉토리 아래의 모든 파일을 HDFS에 복사하려고합니다. 모든 파일은 "127.0.0.1:9000/hdfsData/"에 있습니다.

단계 4. HDFS에서 로컬로 복사 할 때 "copyFromLocalFile"을 "copyToLocalFile"로 변경하십시오.

관련 문제