无法通过Java API (Cloudera-CDH4.4.0) 访问 HDFS



我正在尝试使用 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);
        

我从这里和这里得到了这段代码。不幸的是,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核心被分成了多个库,所以我也尝试了以下库:

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

因此,默认情况下应正确设置所有内容。

希望你们能帮到我...这东西快把我逼疯了!在如此简单的任务中失败是非常令人沮丧的。

提前非常感谢任何帮助。

试试这个:

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

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

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 classes/.

在命令提示符下通过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);
        }

}

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

    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。

相关内容

  • 没有找到相关文章

最新更新