Я пытаюсь запустить spark-submit
с машины, которая запускает мастер-искры, в то время как у меня есть работник на другой машине:
- Машина A: мастер-мастер
- МашинаB: ведомый искры
Но всегда выдается исключение: java.io.FileNotFoundException
19/10/30 18:19:00 WARN TaskSetManager: Lost task 1.0 in stage 0.0 (TID 1, 130.229.129.193, executor 0): java.io.FileNotFoundException: File file:/private/var/folders/mf/hvtcpzmx6s39n7xc9182fxvc0000gp/T/spark-2237692a-95c1-4355-90fe-ed4524040879/userFiles-c1150981-0e3b-4b6f-a951-5783c1d14db8/data.csv does not exist
Исключение не выдается, когда я запускаю мастера и работника на одной машине,Я понимаю, что проблема связана с расположением файла, но я использую комбинацию :
- sparkContext.addFile (fileName)
- и SparkFile.get(fileName)
Итак, добавленный файл должен быть загружен с этим заданием Spark на каждом узле №?
Я не хочу пробовать альтернативное решение (S3, HDFS,...), я просто хочу выяснить, что я делаю не так. Спасибо.
Ява-код, который я использую:
public class Main {
public static void main(String[] args) throws IOException {
String fileName = "data.csv";
//Count words and lines
countWordsAndLines(fileName);
}
public static void countWordsAndLines(String fileName) throws IOException {
// SparkConf object for describing the application configuration.
SparkConf sparkConf = new SparkConf()
.setAppName("Count file words and lines");
//.setMaster("local[*]"); // Delete this line when submitting to a cluster
// A SparkContext object is the main entry point for Spark.
JavaSparkContext sparkContext = new JavaSparkContext(sparkConf);
//Add a file to be downloaded with this Spark job on every node.
sparkContext.addFile("https://sda6.s3.eu-central-1.amazonaws.com/test/" + fileName);
// Get the absolute path of a file added through SparkContext.addFile().
// SparkContext is used to read a text file in memory as a JavaRDD object.
JavaRDD<String> csvFile = sparkContext.textFile("file://" + SparkFiles.get(fileName));
// Count no of lines
System.out.println("Number of lines in file = " + csvFile.count());
sparkContext.stop();
}
}
Чтобы запустить мое приложение в кластере, я делаю следующее:
- Создайте новыйфайл
spark-env.sh
, внутри папки apache spark conf, где я установил SPARK_MASTER_HOST='machine-A-IP'
. Я делаю это на машинах A и B.
(в командной строке):
Мастер запуска (станок A)
/usr/local/Cellar/apache-spark/2.4.4/libexec/sbin/start-master.sh
Запуск ведомого (машина B) (и я вижу, как рабочий появляется на главной странице мастера в машине A)
/usr/local/Cellar/apache-spark/2.4.4/libexec/sbin/start-slave.sh spark://machine-A-IP:7077
Запустить spark-submit (станок A)
/usr/local/bin/spark-submit --master spark://machine-A-IP:7077 --class Main build/libs/spark-exercise-1.0-SNAPSHOT.jar