当前位置: 首页 > 知识库问答 >
问题:

从本地spark-submit检查远程HDFS上是否存在文件

严峰
2023-03-14

我正在开发一个专门用于在HDFS文件系统(位于hdfs_ip)上使用Spark的Java程序。我的目标之一是检查HDFS上是否存在路径HDFS:/hdfs_ip:hdfs_port/path/to/file.json的文件。在本地调试程序时,我发现无法使用以下代码访问此远程文件

private boolean existsOnHDFS(String path) {
     Configuration conf = new Configuration();
     FileSystem fs;
     Boolean fileDoesExist = false ;
     try {
         fs = FileSystem.get(conf);
         fileDoesExist = fs.exists(new Path(path)) ;
     } catch (IOException e) {
            e.printStackTrace();
     }
     return fileDoesExist ;
 }

实际上,FS.exists尝试在本地FS中而不是在HDFS上查找文件hdfs:/hdfs_ip:hdfs_port/path/to/file.json。顺便说一句,让hdfs:/hdfs_ip:hdfs_port前缀使fs.exists崩溃,而取消它将回答false,因为/path/to/file.json本地不存在。

fs的适当配置是什么,以使事情在本地和从Hadoop集群执行Java程序时正常工作?

编辑:我最后放弃了,把这个错误补丁传给了我团队中的其他人。感谢那些试图帮助我的人!

共有1个答案

幸越泽
2023-03-14

问题是您向FileSystem传递了一个空的conf文件。

您应该像这样创建您的文件系统

FileSystem.get(spark.sparkContext().hadoopConfiguration());

当spark是SparkSession对象时。

正如您在FileSystem的代码中所看到的:

 /**
   * Returns the configured filesystem implementation.
   * @param conf the configuration to use
   */
  public static FileSystem get(Configuration conf) throws IOException {
    return get(getDefaultUri(conf), conf);
  }

  /** Get the default filesystem URI from a configuration.
   * @param conf the configuration to use
   * @return the uri of the default filesystem
   */
  public static URI getDefaultUri(Configuration conf) {
    return URI.create(fixName(conf.get(FS_DEFAULT_NAME_KEY, DEFAULT_FS)));
  }

它根据作为参数传递的配置创建URI,当DEFAULT_FS为:时,它查找键FS_DEFAULT_NAME_KEY(fs.defaultfs)

  public static final String  FS_DEFAULT_NAME_DEFAULT = "file:///";
 类似资料:
  • 问题内容: 如何在Java中检查Java文件是否存在于具有URL的远程服务器上(由HTTP服务)?我不想下载该文件,只需检查其存在。 问题答案: import java.net.; import java.io. ; 如果与URL的连接(使用HttpURLConnection)以HTTP状态代码200返回,则该文件存在。 编辑: 请注意,由于我们只关心它的存在与否,所以不需要请求整个文档。我们可以

  • 问题内容: 尝试检查我要读取的文件是否存在。 问题答案: 这是另一种方法: 包装的用途和功能: p_DirName in varchar2, – schema object name p_FileName in varchar2 ) return number is l_file_loc bfile; begin l_file_loc := bfilename(upper(p_DirName),

  • 我在AWS上有一个Hadoop/Yarn集群设置,我有一个主服务器和三个从服务器。我已经验证有3个活动节点在端口50070和8088上运行。我在客户机部署模式下测试了一个spark工作,一切都很好。 当我尝试使用。我得到以下错误。

  • 问题内容: 我需要检查远程服务器上是否存在特定文件。使用和不起作用。有什么想法如何快速轻松地做到这一点? 问题答案: 您必须使用CURL

  • 问题内容: 如果我具有流程的PID,则os.FindProcess是否足以测试该流程的存在?我的意思是,如果返回,我是否可以认为它已终止(或被杀死)? 编辑: 我刚刚写了一个包装函数(旧式bash流程测试)。这可以正常工作,但是如果有其他解决方案(使用go库完成),我仍然很高兴。 问题答案: 这是查看进程是否处于活动状态的传统的Unix方式-向其发送0信号(就像您对bash示例所做的一样)。 来自

  • 问题内容: 如何检查 文件 的存在? 在模块的文档中,有方法的说明。但是,据我了解,它只检查目录的存在。而且我需要检查 文件 ! 如何才能做到这一点? 问题答案: 为什么不尝试打开文件? 无论如何,经过一分钟的搜索,请尝试以下操作: 对于Node.js v0.12.x及更高版本 双方并已弃用 *编辑: 已更改: 至: 林特抱怨双重等于不是三次等于。 使用fs.stat: