2015-01-06 25 views
2

我试图访问我的HDFS使用Java代码,但我无法得到它的工作......经过两天的挣扎我认为是时候请求帮忙。无法通过Java API访问HDFS(Cloudera-CDH4.4.0)

这是我的代码:

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在他的网站上写道:

[...] If you do not assign the configurations to conf object (using hadoop xml file) your HDFS operation will be performed on the local file system and not on the HDFS. [...]

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

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

这是我目前使用的libary:

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 

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

我希望你们能帮助我...这东西让我疯狂!以这么简单的任务失败是非常令人沮丧的。

非常感谢您的任何帮助。

回答

0

1),除非你将覆盖任何配置变量,你并不需要conf.addResource。

2)希望你正在创建一个jar文件,并在命令窗口中运行jar文件,而不是在eclipse中。 如果你在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文件,你可以做到这一点无论是从月食或命令提示符 和执行的jar文件。

命令提示jar文件样品:

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

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

Hadoop的罐子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); 
     } 

}

+0

非常感谢您的回复! :)我跟着你的步骤1-4,通过控制台用“hadoop jar hadoopfile.jar hadoop.sample.fileaccess.Hmkdirs”执行应用程序,然后控制台显示“True”,并创建HDFS中的新文件夹。我想问题是我没有使用“哈托普罐”。但是,在eclipse中运行代码时,我得到以下错误:java.lang.NoClassDefFoundError:org/apache/commons/logging/LogFactory。你是如何得到这个工作的?你在用什么库?再次感谢:) – Tim

+0

加入以下进口: import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; 检查你的构建路径下面有jar文件: hadoop-hdfs和hadoop-common – user1652210

1

试试这个:

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

+0

这不提供问题的答案。要批评或要求作者澄清,在他们的帖子下留下评论 - 你总是可以评论你自己的帖子,一旦你有足够的[声誉](http://stackoverflow.com/help/whats-reputation),你会能够[评论任何帖子](http://stackoverflow.com/help/privileges/comment)。 – Ben

+0

Ben为什么这不是答案? – Hajmola

+0

这没有奏效。 – Tim

0

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

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()); 

确保你在classpath有Hadoop的HDFS,太。

+0

Erik,谢谢你的回复。当我通过“hadoop jar”从控制台运行它时,该代码适用于我,正如user1652210所描述的那样。你可以从eclipse运行代码吗?您使用的是唯一一个hadoop-hdfs库吗?从eclipse运行代码时,我得到了几个NoClassDefFoundErrors。 – Tim

+0

您至少需要hadoop-hdfs和hadoop-common。请注意,CDH4和CDH5之间的库名称已更改。你也应该使用Maven或Gradle来组装你的类路径以获取传递依赖关系。 –