Распределенная обработка PySpark на кластере пряжи
У меня есть искра, работающая на Cloudera CDH5.3 кластер, используя YARN в качестве менеджера ресурсов. Я разрабатываю приложения Spark в Python (PySpark).
Я могу отправить задания, и они работают успешно, однако они никогда не работают на более чем одной машине (локальная машина, с которой я отправляю).
Я пробовал различные варианты, такие как настройка --deploy-mode для кластера и --master для yarn-client и yarn-cluster, но он никогда не работает более чем на одном сервер.
Я могу заставить его работать на нескольких ядрах, передавая что-то вроде --master local[8], но это, очевидно, не распределяет обработку по нескольким узлам.
у меня есть очень простой скрипт Python, обрабатывающий данные из HDFS, например:
import simplejson as json
from pyspark import SparkContext
sc = SparkContext("", "Joe Counter")
rrd = sc.textFile("hdfs:///tmp/twitter/json/data/")
data = rrd.map(lambda line: json.loads(line))
joes = data.filter(lambda tweet: "Joe" in tweet.get("text",""))
print joes.count()
и я запускаю команду submit, такую как:
spark-submit atest.py --deploy-mode client --master yarn-client
что я могу сделать, чтобы обеспечить параллельное выполнение задания в кластере?
4 ответов
можете ли вы поменять аргументы для команды? СПАРК-представить-развернуть-режиме клиент-мастер пряжа-клиент atest.py
Если вы видите текст справки для команды:
Искра-представить
Usage: spark-submit [options] <app jar | python file>
Я считаю, что @MrChristine правильно - флаги опции, которые вы указываете, передаются вашему скрипту python, а не spark-submit. Кроме того, вы захотите указать --executor-cores
и --num-executors
так как по умолчанию он будет работать на одном ядре и использовать двух исполнителей.
неверно, что скрипт python не работает в режиме кластера. Я не уверен в предыдущих версиях, но это выполняется в версии spark 2.2 в кластере Hortonworks.
: spark-submit --master yarn --num-исполнители 10 --исполнитель-ядра 1 --драйвер-память 5g /pyspark-example.py
Python-Кода :
from pyspark import SparkConf, SparkContext
from pyspark.sql import SQLContext
conf = (SparkConf()
.setMaster("yarn")
.setAppName("retrieve data"))
sc = SparkContext(conf = conf)
sqlContext = SQLContext(sc)
parquetFile = sqlContext.read.parquet("/<hdfs-path>/*.parquet")
parquetFile.createOrReplaceTempView("temp")
df1 = sqlContext.sql("select * from temp limit 5")
df1.show()
df1.write.save('/<hdfs-path>/test.csv', format='csv', mode='append')
sc.stop()
выход : его большой, поэтому я не вставляю. Но он работает идеально.
кажется, что PySpark не работает в распределенном режиме с помощью Spark/YARN - вам нужно использовать автономную Spark с сервером Spark Master. В этом случае мой скрипт PySpark очень хорошо работал в кластере с процессом Python на ядро/узел.