6

Java API を使用して HDFS 内のファイルにアクセスしようとしていますが、毎回 File Not Found が発生します。アクセスに使用しているコードは次のとおりです:-

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を初めて使用するので、何が問題なのかわかりません。

4

1 に答える 1

11

これは、この質問への回答のコンテキストで最初に投稿されたコードフラグメントです。元の質問の意図が異なっていたにもかかわらず、それはあなたの質問も解決するはずです。コードの要点は、スキーム ( 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();
        }
    }
}
于 2013-07-11T08:19:23.697 に答える