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