创建可用于读取/写入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的属性?
答案 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.xml
,hdfs-site.xml
,mapred-site.xml
和hbase-site.xml
的目录。