복붙노트

[HADOOP] Java를 사용하여 HDFS에서 파일 액세스

HADOOP

Java를 사용하여 HDFS에서 파일 액세스

Java API를 사용하여 HDFS의 파일에 액세스하려고 시도하지만 파일을 찾을 수 없을 때마다 발생합니다. 내가 액세스하는 데 사용하는 코드는 다음과 같습니다.

Configuration conf = new Configuration();
    conf.addResource(FileUtilConstants.ENV_HADOOP_HOME + FileUtilConstants.REL_PATH_CORE_SITE);
    conf.addResource(FileUtilConstants.ENV_HADOOP_HOME + FileUtilConstants.REL_PATH_HDFS_SITE);

    try {
        FileSystem fs = FileSystem.get(conf);
        Path hdfsfilePath = new Path(hdfsPath);
        logger.info("Filesystem URI : " + fs.getUri());
        logger.info("Filesystem Home Directory : " + fs.getHomeDirectory());
        logger.info("Filesystem Working Directory : " + fs.getWorkingDirectory());
        logger.info("HDFS File Path : " + hdfsfilePath);
        if (!fs.exists(hdfsfilePath)) {
            logger.error("File does not exists : " + hdfsPath);
        }

다음은 코드에서 출력되는 명령 행입니다.

[root@koversevms ~]# java -jar /tmp/thetus-incendiary-koverse-extension-fileutils-1.0-SNAPSHOT.jar 
13/07/10 02:47:18 INFO fileutils.HadoopFileChecksumUtils: Filesystem URI : file:///
13/07/10 02:47:18 INFO fileutils.HadoopFileChecksumUtils: Filesystem Home Directory : file:/root
13/07/10 02:47:18 INFO fileutils.HadoopFileChecksumUtils: Filesystem Working Directory : file:/root
13/07/10 02:47:18 INFO fileutils.HadoopFileChecksumUtils: HDFS File Path : /usr/hadoop/sample/sample.txt
13/07/10 02:47:18 ERROR fileutils.HadoopFileChecksumUtils: File does not exists : /usr/hadoop/sample/sample.txt

나는 잘못되었다는 것을 모르기 때문에 hadoop을 처음 사용합니다.

해결법

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

    1.다음은이 질문에 대한 대답의 맥락에서 원래 게시 된 코드 단편입니다. 원래 질문의 의도에도 불구하고 귀하의 질문을 해결해야합니다. 코드의 핵심은 scheme (file : //)부터 시작하는 문제입니다. 구성에서 fs.defaultFS 변수를 확인하십시오.

    다음은이 질문에 대한 대답의 맥락에서 원래 게시 된 코드 단편입니다. 원래 질문의 의도에도 불구하고 귀하의 질문을 해결해야합니다. 코드의 핵심은 scheme (file : //)부터 시작하는 문제입니다. 구성에서 fs.defaultFS 변수를 확인하십시오.

    package org.myorg;
    
    import java.security.PrivilegedExceptionAction;
    
    import org.apache.hadoop.conf.*;
    import org.apache.hadoop.security.UserGroupInformation;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.FileStatus;
    
    public class HdfsTest {
    
        public static void main(String args[]) {
    
            try {
                UserGroupInformation ugi
                    = UserGroupInformation.createRemoteUser("hbase");
    
                ugi.doAs(new PrivilegedExceptionAction<Void>() {
    
                    public Void run() throws Exception {
    
                        Configuration conf = new Configuration();
                        conf.set("fs.defaultFS", "hdfs://1.2.3.4:8020/user/hbase");
                        conf.set("hadoop.job.ugi", "hbase");
    
                        FileSystem fs = FileSystem.get(conf);
    
                        fs.createNewFile(new Path("/user/hbase/test"));
    
                        FileStatus[] status = fs.listStatus(new Path("/user/hbase"));
                        for(int i=0;i<status.length;i++){
                            System.out.println(status[i].getPath());
                        }
                        return null;
                    }
                });
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
  2. from https://stackoverflow.com/questions/17564074/accessing-files-in-hdfs-using-java by cc-by-sa and MIT license