У меня есть настройка Spark-кластера с одним мастером и тремя рабочими. У меня также есть Spark, установленный на виртуальной машине CentOS. Я пытаюсь запустить оболочку Spark из моей локальной виртуальной машины, которая будет подключаться к ведущему, и разрешить мне выполнить простой код Scala. Итак, вот команда, которую я запускаю на своей локальной виртуальной машине:
bin/spark-shell --master spark://spark01:7077
Среда запускается до точки, где я могу ввести код Scala. В нем говорится, что исполнители были предоставлены (x3 - по одному для каждого работника). Если я заглядываю в главный пользовательский интерфейс, я могу увидеть одно запущенное приложение, оболочку Spark. Все работники ALIVE, имеют 2/2 ядра, и выделили 512 МБ (из 5 ГБ) для приложения. Итак, я пытаюсь выполнить следующий Scala код:
sc.parallelize(1 to 100).count
К сожалению, команда не работает. Оболочка будет печатать одно и то же предупреждение бесконечно:
INFO SparkContext: Starting job: count at <console>:13
INFO DAGScheduler: Got job 0 (count at <console>:13) with 2 output partitions (allowLocal=false)
INFO DAGScheduler: Final stage: Stage 0(count at <console>:13) with 2 output partitions (allowLocal=false)
INFO DAGScheduler: Parents of final stage: List()
INFO DAGScheduler: Missing parents: List()
INFO DAGScheduler: Submitting Stage 0 (Parallel CollectionRDD[0] at parallelize at <console>:13), which has no missing parents
INFO DAGScheduler: Submitting 2 missing tasts from Stage 0 (ParallelCollectionRDD[0] at parallelize at <console>:13)
INFO TaskSchedulerImpl: Adding task set 0.0 with 2 tasks
WARN TaskSchedulerImpl: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient memory
WARN TaskSchedulerImpl: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient memory
WARN TaskSchedulerImpl: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient memory
После моего исследования проблемы я подтвердил, что основной URL-адрес, который я использую, идентичен тому, который находится в веб-интерфейсе. Я могу ping и ssh в обоих направлениях (кластер для локальной виртуальной машины и наоборот). Более того, я играл с параметром памяти исполнителя (как с увеличением, так и с уменьшением памяти) безрезультатно. Наконец, я попытался отключить брандмауэр (iptables) с обеих сторон, но я все равно получаю ту же ошибку. Я использую Spark 1.0.2.
TL; DR Можно ли удаленно запускать оболочку Apache Spark (и по сути отправлять приложения удаленно)? Если да, то что мне не хватает?
EDIT: я взглянул на рабочие журналы и обнаружил, что у рабочих возникли проблемы с поиском Spark:
ERROR org.apache.spark.deploy.worker.ExecutorRunner: Error running executor
java.io.IOException: Cannot run program "/usr/bin/spark-1.0.2/bin/compute-classpath.sh" (in directory "."): error=2, No such file or directory
...
Spark установлен в другом каталоге на моей локальной виртуальной машине, чем в кластере. Путь, который пытается найти рабочий, находится на моей локальной виртуальной машине. Есть ли способ указать этот путь? Или они должны быть одинаковыми во всем мире?
На данный момент я скорректировал свои каталоги, чтобы обойти эту ошибку. Теперь моя Spark Shell потерпит неудачу, прежде чем я получу возможность ввести команду count (Master removed our application: FAILED
). Все рабочие имеют ту же ошибку:
ERROR akka.remote.EndpointWriter: AssociationError [akka.tcp://[email protected]:7078] -> [akka.tcp://[email protected]:53633]:
Error [Association failed with [akka.tcp://[email protected]:53633]]
[akka.remote.EndpointAssociationException: Association failed with [akka.tcp://[email protected]:53633]
Caused by: akka.remote.transport.netty.NettyTransport$$anonfun$associate$1$$annon2: Connection refused: spark02/192.168.64.2:53633
Как я уже подозревал, у меня проблемы с сетью. На что я должен смотреть сейчас?