#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>)