2016-03-08 2 views
1

Я пытаюсь немного поиграть в режиме кластера apache-spark. Итак, мой кластер состоит из драйвера на моей машине и рабочего и менеджера на главной машине (отдельная машина).Apache Spark FileNotFoundException

я отправить текстовый файл, используя sparkContext.addFile(filepath) где путь_к_файлу это путь моего текстового файла в локальной машине, для которой я получаю следующий результат:

INFO Utils: Copying /home/files/data.txt to /tmp/spark-b2e2bb22-487b-412b-831d-19d7aa96f275/userFiles-147c9552-1a77-427e-9b17-cb0845807860/data.txt 

INFO SparkContext: Added file /home/files/data.txt at http://192.XX.XX.164:58143/files/data.txt with timestamp 1457432207649 

Но когда я пытаюсь получить доступ к одному файлу с помощью SparkFiles.get("data.txt"), Я получаю путь к файлу в моем драйвере вместо рабочего. Я настраиваю мой файл как этот

SparkConf conf = new SparkConf().setAppName("spark-play").setMaster("spark://192.XX.XX.172:7077"); 
    conf.setJars(new String[]{"jars/SparkWorker.jar"}); 
    JavaSparkContext sparkContext = new JavaSparkContext(conf); 
    sparkContext.addFile("/home/files/data.txt"); 
    List<String> file =sparkContext.textFile(SparkFiles.get("data.txt")).collect(); 

Я получаю FileNotFoundException здесь.

+0

Не могли бы вы написать, что такое вывод 'SparkFiles.get (« data.txt »)' is? – mgaido

+0

Эй, отметьте вывод: /tmp/spark-b2e2bb22-412b-831d-19d7aa96f275/userFiles-147c9552-1a77-427e-9b17-cb0845807860/data.txt –

ответ

0

Я думаю, что основная проблема заключается в том, что вы пытаетесь прочитать файл с помощью метода textFile. То, что находится внутри скобок метода textFile, выполняется в программе драйвера. В рабочем узле выполняется только код, выполняемый против RDD. Когда вы вводите textFile, происходит то, что в вашей программе драйверов создается объект RDD с тривиальной ассоциированной DAG. Но ничего не происходит в рабочем узле.

Таким образом, когда вы пытаетесь собрать данные, работника просят прочитать файл по URL-адресу, который вы передали textFile, о чем говорит драйвер. Поскольку ваш файл находится в локальной файловой системе драйвера, а рабочий узел не имеет к нему доступа, вы получаете FileNotFoundException.

Решение состоит в том, чтобы сделать файл доступным для рабочего узла, поместив его в распределенную файловую систему в формате HDFS или через ftp или вам необходимо передать файл в рабочий узел перед запуском задания Spark, а затем вы необходимо указать в качестве аргумента textFile путь файла в рабочей файловой системе.

+0

Я указал схему файла и попробовал. Но путь, возвращаемый SparkFiles.getRootDirectory(), - это путь файла в драйвере, а не рабочий. FYI рабочий находится в отдельной главной машине. Я просто пытаюсь сделать это без hdfs. API addFile() успешно отправляет файл на рабочий узел и файл находится в рабочем пути узла. –

+0

Извините, я не понял, что вы имели в виду. Я знаю, что ваш рабочий узел отличается от вашего драйвера. Вы видите путь в драйвере, потому что вы смотрите на вход в драйвер. Если вы посмотрите на выход журнала в своем рабочем месте, вы увидите путь к файлу в рабочем месте. Как вы указали схему в своем коде? – mgaido

+0

Я попытался использовать «файл: /» + SparkFiles.get() –