【问题标题】:Hadoop configuration object not pointing to hdfs file systemHadoop 配置对象未指向 hdfs 文件系统
【发布时间】:2022-04-17 16:37:24
【问题描述】:

我正在尝试用 Java 创建小型 Spark 程序。我正在创建一个 Hadoop 配置对象,如下所示:

Configuration conf = new Configuration(false);
conf.addResource(new Path("/dir/core-site.xml"));
conf.addResource(new Path("/dir/hdfs-site.xml"));
conf.addResource(new Path("/dir/yarn-site.xml"));

当我调用以下命令时,我得到了文件系统,但它指向本地文件系统而不是 hdfs 文件系统

FileSystem fs = FileSystem.get(conf);

我是 Hadoop 新手。

【问题讨论】:

    标签: java hadoop hdfs


    【解决方案1】:

    我通常将core-site.xml(连同其他文件)保留在类路径中,并获取如下配置:

    Configuration conf = new Configuration();
    FileSystem localfs = FileSystem.getLocal(conf);
    FileSystem hdfs = FileSystem.get(conf);
    

    这是我core-site.xml的内容:

    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    <configuration>
      <property>
        <name>fs.default.name</name>
        <value>hdfs://{hadoop-server-addr}</value>
      </property>
    </configuration>
    

    【讨论】:

    • 嗨,即使我没有指定 conf.set("fs.defaultFS") 它仍然返回给我本地文件系统对象
    • 在我的情况下,我生成了一个胖 jar,在你的情况下,conf 文件可能不在节点的类路径中。
    【解决方案2】:

    将您的 hdfs-site.xml 和 core-site.xml 添加到类路径。并使用以下代码。

    Configuration conf = new Configuration();
    FileSystem hdfs = FileSystem.newInstance(conf);
    

    它将选择 xmls 中提到的配置。

    【讨论】:

      【解决方案3】:

      为了更好地调试问题,请在创建新的配置实例后添加此行。这会给你一个更好的主意。

      Configuration conf = new Configuration(false);
      conf.setQuietMode(false);
      

      在大多数情况下,当Configuration 无法加载由路径字符串指定的资源时,会默认使用本地文件系统而不是 hdfs。在这种情况下,Configuration 的默认行为是安静地失败并返回null 以获取请求的密钥。在这种情况下,请求的密钥是 fs.defaultFS,namenode 主机。然后FileSystem 实例默认为file:/// 方案,即本地文件系统。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-27
        • 1970-01-01
        • 1970-01-01
        • 2013-08-15
        • 1970-01-01
        • 2015-03-28
        • 2020-10-10
        相关资源
        最近更新 更多