Как загрузить локальный файл в драйвер приложения с помощью кластера spark?

#scala #apache-spark

Вопрос:

Я запустил кластер spark(автономный режим кластера) и программу scala. Программа scala может принять какой csv -либо файл и загрузить csv в dataset него . Мой код выглядит следующим образом:

     val sparkSession = SparkSession.builder
      .appName("app")
      .master("spark://172.17.0.2:7077")
      .config("spark.scheduler.mode", "FIFO")
      .config("spark.memory.fraction", 0.3)
      .config("spark.sql.shuffle.partitions", 1)
      .config("spark.sql.debug.maxToStringFields", 600)
      .config("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
      .getOrCreate
    sparkSession.sparkContext.addFile("file:///home/liusf/i1.csv")
    val ds = sparkSession.read.csv(SparkFiles.get("i1.csv"))
    ds.show(1)
 

но он выдает FileNotFoundException сообщение об ошибке ниже

 18:17:32  WARN [task-result-getter-0] [o.a.spark.scheduler.TaskSetManager:69] 
Lost task 0.0 in stage 0.0 (TID 0) (172.17.0.3 executor 1): 
java.io.FileNotFoundException: File file:/tmp/spark-647c0146-5ba5-433f-9555-6b64a16231a7/userFiles-61074e0d-9edf-4c75-9857-cb9db63b3925/i1.csv does not exist
 

в то время как в локальной модели( master задано как local[1] ), она работает так, как ожидалось.
Я поискал в Google и нашел две сессии sugession, одна из которых — «копирование локальных файлов на все рабочие узлы», а другая — «использование nfs или hdfs для обмена файлами».
Есть ли простой способ заставить программу работать без внедрения дополнительных технологий?

Ответ №1:

По характеру кластеров задание может быть выполнено на любом из рабочих узлов. Если вы не скопируете файл или не сохраните его в месте, доступном для всех сотрудников, spark не сможет найти файл.

Простой способ заставить программу работать-это перенести scp файл в нужное место на всех рабочих узлах.

Комментарии:

1. Statemetn sparkSession.sparkContext.addFile("file:///home/liusf/i1.csv") может копировать локальный файл всем работникам, но расположение кажется случайным. Есть ли способ установить определенное местоположение? Или есть способ прочитать случайный путь на драйвере ?

2. После запуска сеанса spark вы не сможете добавлять больше файлов. Если вы используете spark-submit , есть --files опция, которая позволяет размещать файлы на рабочих и извлекать расположение этих файлов с помощью SparkFiles.get(<filename>)