获取可用于读取/写入HDFS的Hadoop FileSystem对象的正确方法是什么?

时间:2014-10-23 20:31:25

标签: java hadoop hdfs

创建可用于读取/写入HDFS的FileSystem对象的正确方法是什么?在我发现的一些例子中,他们做了这样的事情:

final Configuration conf = new Configuration();
conf.addResource(new Path("/usr/local/hadoop/etc/hadoop/core-site.xml"));
conf.addResource(new Path("/usr/local/hadoop/etc/hadoop/hdfs-site.xml"));

final FileSystem fs = FileSystem.get(conf);

从查看Configuration类的文档看,如果该文件位于类路径上,则创建对象时会自动加载core-site.xml中的属性,因此无需再次设置它。

我还没有找到任何说明为什么要添加hdfs-site.xml的原因,如果没有它,它似乎工作正常。

将core-site.xml放在类路径上并跳过hdfs-site.xml是否安全,或者我应该像我在示例中看到的那样设置两者?在什么情况下需要来自hdfs-site.xml的属性?

3 个答案:

答案 0 :(得分:4)

FileSystem只需要一个配置密钥即可成功连接到HDFS。以前是fs.default.name。从yarn开始,它已更改为fs.defaultFS。因此,以下代码段足以进行连接。

Configuration conf = new Configuration();
conf.set(key, "hdfs://host:port");  // where key="fs.default.name"|"fs.defaultFS"

FileSystem fs = FileSystem.get(conf);       

提示:检查core-site.xml哪个密钥存在。在conf中设置与其关联的相同值。如果运行代码的机器没有主机名映射,请输入其IP。在mapR群集中,值的前缀为maprfs://

答案 1 :(得分:1)

问题:

  

将core-site.xml放在类路径上并跳过hdfs-site.xml是安全的,还是应该像在示例中看到的那样设置两者?在什么情况下需要hdfs-site.xml的属性?

我做一个实验:如果您使用的是 CDH (Cloudera的发行版包括Apache Hadoop,我的版本是Hadoop 2.6.0-cdh5.11.1),则使用 core-仅site.xml 。它将引发异常:

Request processing failed; nested exception is java.lang.IllegalArgumentException: java.net.UnknownHostException

如果您添加 hdfs-site.xml ,它会起作用。

答案 2 :(得分:0)

这是我的一个项目的代码块,用于构建可用于HBase,HDFS和map-reduce的Configuration。请注意,addResource将在活动类路径中搜索您命名的资源条目。

HBaseConfiguration.addHbaseResources(config);
config.addResource("mapred-default.xml");
config.addResource("mapred-site.xml");

我的类路径肯定包含core-site.xmlhdfs-site.xmlmapred-site.xmlhbase-site.xml的目录。