Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';t通过Java API访问HDFS(Cloudera-CDH4.4.0)_Java_Hadoop_Configuration_Hdfs_Cloudera Cdh - Fatal编程技术网

Can';t通过Java API访问HDFS(Cloudera-CDH4.4.0)

Can';t通过Java API访问HDFS(Cloudera-CDH4.4.0),java,hadoop,configuration,hdfs,cloudera-cdh,Java,Hadoop,Configuration,Hdfs,Cloudera Cdh,我正在尝试使用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&

我正在尝试使用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
因此,应该按照默认设置正确设置所有内容

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

非常感谢您的帮助。

试试以下方法:

conf.set(“fs.defaultFS”,“文件://”);
conf.set(“mapreduce.framework.name”,“local”)

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

}

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

    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

这并不能回答这个问题。要评论或要求作者澄清,请在他们的帖子下方留下评论-你可以随时对自己的帖子发表评论,一旦你有足够的评论,你就可以发表评论了。Ben,为什么这不是答案?问题明确说明他想访问HDFS文件系统,然而,您的建议是将默认实现设置为本地。你看到问题了吗?非常感谢你的回复!:)我按照您的步骤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 commonErik,谢谢您的回复。当我从控制台通过“hadoop jar”运行它时,代码对我来说是有效的,正如下面描述的user1652210所述。您可以从eclipse运行代码吗?hadoop hdfs库是您唯一使用的库吗?从eclipse运行代码时,我发现了几个NoClassDefFoundErrors。您至少需要hadoop hdfs和hadoop common。请注意,库名称在CDH4和CDH5之间已更改。您还应该使用maven或gradle来组装类路径,以获取可传递的依赖项。