【问题标题】:Can't access HDFS via Java API (Cloudera-CDH4.4.0)无法通过 Java API (Cloudera-CDH4.4.0) 访问 HDFS
【发布时间】:2015-03-04 13:01:30
【问题描述】:

我正在尝试使用 Java 代码访问我的 HDFS,但我无法使其正常工作……经过 2 天的努力,我认为是时候寻求帮助了。

这是我的代码:

Configuration conf = new Configuration();           
conf.addResource(new Path("/HADOOP_HOME/conf/core-site.xml"));
conf.addResource(new Path("/HADOOP_HOME/conf/hdfs-site.xml"));
FileSystem hdfs = FileSystem.get(conf);

boolean success = hdfs.mkdirs(new Path("/user/cloudera/testdirectory"));
System.out.println(success);
        

我从herehere 获得此代码。 不幸的是,hdfs 对象只是一个“LocalFileSystem”对象,所以一定有问题。看起来这正是Rejeev在他的网站上写的:

[...] 如果您不将配置分配给 conf 对象(使用 hadoop xml 文件),您的 HDFS 操作将在本地文件系统上执行,而不是在 HDFS 上。 [...]

使用绝对路径我得到相同的结果。

conf.addResource(new Path("/etc/hadoop/conf/core-site.xml"))

这是我目前正在使用的库:

hadoop-core-2.0.0-mr1-cdh4.4.0.jar

听说 hadoop-core 被拆分成多个库,所以我也尝试了以下库:

hadoop-common-2.0.0-alpha.jar

hadoop-mapreduce-client-core-2.0.2-alpha.jar

我正在使用 Cloudera-CDH4.4.0,所以已经安装了 hadoop。通过控制台一切正常。 例如:

hadoop fs -mkdir testdirectory

所以一切都应该按照默认设置正确。

我希望你们能帮助我……这东西快把我逼疯了!这么简单的任务就失败了,真是令人沮丧。

非常感谢您的任何帮助。

【问题讨论】:

    标签: java hadoop configuration hdfs cloudera-cdh


    【解决方案1】:

    试试这个:

    conf.set("fs.defaultFS", "file:///"); conf.set("mapreduce.framework.name", "local");

    【讨论】:

    • 这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时评论自己的帖子,一旦您有足够的reputation,您就可以comment on any post
    • Ben 为什么这不是答案?
    • 问题明确指出他想访问 HDFS 文件系统,但您的建议是将默认实现设置为本地。你看到问题了吗?
    【解决方案2】:

    1) 除非您覆盖任何配置变量,否则您不需要 conf.addResource。

    2) 希望您正在创建一个 Jar 文件并在命令窗口中而不是在 Eclipse 中运行该 jar 文件。 如果在 eclipse 中执行,它将在本地文件系统上执行。

    3) 我运行了下面的代码并且它有效。

    public class Hmkdirs {
    public static void main(String[] args) 
            throws IOException 
            { 
    Configuration conf = new Configuration();  
    FileSystem fs = FileSystem.get(conf); 
    boolean success = fs.mkdirs(new Path("/user/cloudera/testdirectory1"));
    System.out.println(success);
            }
    

    }

    4) 要执行,您需要创建一个 jar 文件,您可以在 eclipse 或命令提示符下执行此操作 并执行jar文件。

    命令提示jar文件示例:

    javac -classpath /usr/local/hadoop/hadoop-core-1.2.1.jar:/usr/local/hadoop/lib/commons-cli-1.2.jar -d classes WordCount.java && jar -cvf WordCount .jar -C 类/ .

    在命令提示符下通过 hadoop 执行 jar 文件。

    hadoop jar hadoopfile.jar hadoop.sample.fileaccess.Hmkdirs

    hadoop.sample.fileaccess 是我的类 Hmkdirs 所在的包。如果你的类存在于默认包中,你不必指定它,类就可以了。


    更新:您可以从 eclipse 执行并仍然访问 hdfs,请检查以下代码。

    public class HmkdirsFromEclipse {
    
    public static void main(String[] args) 
    
            throws IOException 
            { 
    Configuration conf = new Configuration();  
    conf.addResource("/etc/hadoop/conf/core-site.xml");
    conf.addResource("/etc/hadoop/conf/hdfs-site.xml");
    conf.set("fs.defaultFS", "hdfs://quickstart.cloudera:8020/");
    conf.set("hadoop.job.ugi", "cloudera");
    conf.set("fs.hdfs.impl", org.apache.hadoop.hdfs.DistributedFileSystem.class.getName());
    FileSystem fs = FileSystem.get(conf); 
    boolean success = fs.mkdirs(new Path("/user/cloudera/testdirectory9"));
    System.out.println(success);
            }
    

    }

    【讨论】:

    • 非常感谢您的回复! :) 我按照您的步骤 1-4 并通过控制台使用“hadoop jar hadoopfile.jar hadoop.sample.fileaccess.Hmkdirs”执行了应用程序,然后控制台说“True”并在 HDFS 中创建了新文件夹。我想问题是我没有使用“hadoop jar”。但是,在 Eclipse 中运行代码时,出现以下错误:java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory。你是怎么得到这个工作的?你在使用什么库?再次非常感谢:)
    • 在导入下面添加:import java.io.IOException;导入 org.apache.hadoop.conf.Configuration;导入 org.apache.hadoop.fs.FileSystem;导入 org.apache.hadoop.fs.Path;检查您的构建路径是否有以下 jar 文件:hadoop-hdfs 和 hadoop-common
    【解决方案3】:

    这确实是一个棘手的配置,但这本质上是你需要做的:

        Configuration conf = new Configuration();
        conf.addResource("/etc/hadoop/conf/core-site.xml");
        conf.addResource("/etc/hadoop/conf/hdfs-site.xml");
        conf.set("fs.defaultFS", hdfs://[your namenode]);
        conf.set("hadoop.job.ugi", [your user]
        conf.set("fs.hdfs.impl", org.apache.hadoop.hdfs.DistributedFileSystem.class.getName());
    

    确保你的类路径中也有 hadoop-hdfs。

    【讨论】:

    • 埃里克,谢谢你的回复。当我通过“hadoop jar”从控制台运行它时,该代码对我有用,正如 user1652210 所描述的那样。你能从eclipse运行代码吗? hadoop-hdfs 库是您唯一使用的库吗?从 Eclipse 运行代码时,我得到了几个 NoClassDefFoundErrors。
    • 你至少需要 hadoop-hdfs 和 hadoop-common。请注意,CDH4 和 CDH5 之间的库名称已更改。你还应该使用 maven 或 gradle 来组装你的类路径来获取传递依赖。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    • 2013-04-03
    相关资源
    最近更新 更多