Проверьте, существует ли файл на удаленной HDFS из локальной спарк-отправки - PullRequest
2 голосов
/ 14 апреля 2020

Я работаю над программой Java, предназначенной для работы со Spark в файловой системе HDFS (расположена по адресу HDFS_IP). Одна из моих целей - проверить, существует ли файл в 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 пытается найти файл hdfs://HDFS_IP:HDFS_PORT/path/to/file.json в моей локальной FS а не на HDFS. Кстати, разрешение префикса hdfs://HDFS_IP:HDFS_PORT делает fs.exists cra sh и подавление его отвечает false, потому что /path/to/file.json не существует локально.

Какая будет подходящая конфигурация fs для получения вещей правильно работать в локальном режиме и при запуске программы Java из кластера Had oop?

РЕДАКТИРОВАТЬ: я наконец сдался и передал исправление кому-то еще в моей команде. Спасибо людям, которые пытались мне помочь, хотя!

1 Ответ

1 голос
/ 14 апреля 2020

Проблема в том, что вы передаете в FileSystem пустой файл conf.

Вы должны создать свою файловую систему следующим образом:

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

, когда искра является объектом 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 для конфигурации, переданной в качестве параметра, ищет ключ FS_DEFAULT_NAME_KEY (fs.defaultFS), когда DEFAULT_FS:

  public static final String  FS_DEFAULT_NAME_DEFAULT = "file:///";
...