无法通过java api访问hdfs(cloudera-cdh4.4.0)

mwngjboj  于 2021-05-30  发布在  Hadoop
关注(0)|答案(3)|浏览(353)

我正在尝试使用java代码访问我的hdfs,但我无法让它工作。。。经过两天的挣扎,我想是时候寻求帮助了。
这是我的密码:

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”对象,所以肯定出了问题。看起来这正是雷耶夫在他的网站上写的:
[…]如果您没有将配置分配给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被拆分为多个lib,所以我也尝试了以下lib:
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

所以一切都应该按照默认设置正确。
我希望你们能帮我。。。这东西快把我逼疯了!这么简单的任务失败了,真让人沮丧。
非常感谢您的帮助。

o0lyfsai

o0lyfsai1#

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

q8l4jmvw

q8l4jmvw2#

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

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。

pbgvytdp

pbgvytdp3#

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

}

相关问题