2012-07-13 4 views
7

HDFS 파일 시스템에서 로컬 시스템으로 파일을 "다운로드"하는 데 문제가 있습니다. (반대의 작동이 문제없이 작동하더라도). * 참고 :파일을 HDFS에서 로컬 컴퓨터로 복사

12/07/13 14:57:46 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 
Exception in thread "main" java.io.IOException: Cannot run program "cygpath": CreateProcess error=2, The system cannot find the file specified 
    at java.lang.ProcessBuilder.start(Unknown Source) 
    at org.apache.hadoop.util.Shell.runCommand(Shell.java:206) 
    at org.apache.hadoop.util.Shell.run(Shell.java:188) 
    at org.apache.hadoop.fs.FileUtil$CygPathCommand.<init>(FileUtil.java:412) 
    at org.apache.hadoop.fs.FileUtil.makeShellPath(FileUtil.java:438) 
    at org.apache.hadoop.fs.FileUtil.makeShellPath(FileUtil.java:465) 
    at org.apache.hadoop.fs.RawLocalFileSystem.execCommand(RawLocalFileSystem.java:573) 
    at org.apache.hadoop.fs.RawLocalFileSystem.setPermission(RawLocalFileSystem.java:565) 
    at org.apache.hadoop.fs.FilterFileSystem.setPermission(FilterFileSystem.java:403) 
    at org.apache.hadoop.fs.ChecksumFileSystem.create(ChecksumFileSystem.java:452) 
    at org.apache.hadoop.fs.ChecksumFileSystem.create(ChecksumFileSystem.java:420) 
    at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:774) 
    at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:755) 
    at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:654) 
    at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:259) 
    at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:232) 
    at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:183) 
    at org.apache.hadoop.fs.FileSystem.copyToLocalFile(FileSystem.java:1837) 
    at org.apache.hadoop.fs.FileSystem.copyToLocalFile(FileSystem.java:1806) 
    at org.apache.hadoop.fs.FileSystem.copyToLocalFile(FileSystem.java:1782) 
    at com.hmeter.hadoop.hdfs.hdfsoperations.HdfsOperations.fileCopyFromHdfsToLocal(HdfsOperations.java:75) 
    at com.hmeter.hadoop.hdfs.hdfsoperations.HdfsOperations.main(HdfsOperations.java:148) 
Caused by: java.io.IOException: CreateProcess error=2, The system cannot find the file specified 
    at java.lang.ProcessImpl.create(Native Method) 
    at java.lang.ProcessImpl.<init>(Unknown Source) 
    at java.lang.ProcessImpl.start(Unknown Source) 
    ... 22 more 

어떤 생각을 무엇을 할 수 있습니다 : 나는 다음입니다 얻을

Configuration conf = new Configuration(); 
    conf.set("fs.defaultFS", "${NAMENODE_URI}"); 
    FileSystem hdfsFileSystem = FileSystem.get(conf); 

    String result = ""; 

    Path local = new Path("${SOME_LOCAL_PATH}"); 
    Path hdfs = new Path("${SOME_HDFS_PATH}"); 

    String fileName = hdfs.getName(); 

    if (hdfsFileSystem.exists(hdfs)) 
    { 
     hdfsFileSystem.copyToLocalFile(hdfs, local); 
     result = "File " + fileName + " copied to local machine on location: " + localPath; 
    } 
    else 
    { 
     result = "File " + fileName + " does not exist on HDFS on location: " + localPath; 
    } 

    return result; 

예외 : 파일이 지정된 경로 여기

에 HDFS 파일 시스템에 존재하는 것은 코드입니다 이슈? Cygwin에서 cyqpath가 필요한 이유는 무엇입니까? 나는 Windows에서 7

감사

를이 코드를 실행하는거야

답변

9

는 API에서이 방법을 사용해보십시오 :와

hdfsFileSystem.copyToLocalFile(hdfs, local); 

: 다음을 대체 귀하의 경우

//where delSrc is do you want to delete the source, src and dst you already have and useRawLocalFileSystem should be set to true in your case 
hdfsFileSystem.copyToLocalFile(delSrc, src, dst, useRawLocalFileSystem); 

hdfsFileSystem.copyToLocalFile(false, hdfs, local, true); 
+0

oozie를 통해 작업을 제출할 때 작동합니까? – Abhinay

+0

@Abhayay 죄송합니다. – ant

6

아래에 표시된 코드를 따라갈 수 있습니다 :

public static void main(String args[]){ 
    try { 
     Configuration conf = new Configuration(); 
     conf.set("fs.defaultFS", "hdfs://localhost:54310/user/hadoop/"); 
     FileSystem fs = FileSystem.get(conf); 
     FileStatus[] status = fs.listStatus(new Path("hdfsdirectory")); 
     for(int i=0;i<status.length;i++){ 
      System.out.println(status[i].getPath()); 
      fs.copyToLocalFile(false, status[i].getPath(), new Path("localdir")); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 
관련 문제