Je suis nouveau sur Airflow et Spark et je me bats avec le SparkSubmitOperator .
Notre planificateur de flux d'air et notre cluster hadoop ne sont pas installés sur la même machine ( première question: est-ce une bonne pratique? ).
Nous avons de nombreuses procédures automatiques qui doivent appeler des scripts pyspark. Ces scripts pyspark sont stockés dans le cluster hadoop (10.70.1.35). Les creux de flux d'air sont stockés dans la machine à flux d'air (10.70.1.22).
Actuellement, lorsque nous voulons lancer un script pyspark avec airflow, nous utilisons un simple BashOperator comme suit:
cmd = "ssh [email protected] spark-submit \
--master yarn \
--deploy-mode cluster \
--executor-memory 2g \
--executor-cores 2 \
/home/hadoop/pyspark_script/script.py"
t = BashOperator(task_id='Spark_datamodel',bash_command=cmd,dag=dag)
Cela fonctionne parfaitement bien. Mais nous aimerions commencer à utiliser SparkSubmitOperator pour spark soumettre nos scripts pyspark ).
J'ai essayé ceci:
from airflow import DAG
from datetime import timedelta, datetime
from airflow.contrib.operators.spark_submit_operator import
SparkSubmitOperator
from airflow.operators.bash_operator import BashOperator
from airflow.models import Variable
dag = DAG('SPARK_SUBMIT_TEST',start_date=datetime(2018,12,10),
schedule_interval='@daily')
sleep = BashOperator(task_id='sleep', bash_command='sleep 10',dag=dag)
_config ={'application':'[email protected]:/home/hadoop/pyspark_script/test_spark_submit.py',
'master' : 'yarn',
'deploy-mode' : 'cluster',
'executor_cores': 1,
'EXECUTORS_MEM': '2G'
}
spark_submit_operator = SparkSubmitOperator(
task_id='spark_submit_job',
dag=dag,
**_config)
sleep.set_downstream(spark_submit_operator)
La syntaxe doit être correcte car le dag n'apparaît pas comme cassé. Mais quand il s'exécute, il me donne l'erreur suivante:
[2018-12-14 03:26:42,600] {logging_mixin.py:95} INFO - [2018-12-14
03:26:42,600] {base_hook.py:83} INFO - Using connection to: yarn
[2018-12-14 03:26:42,974] {logging_mixin.py:95} INFO - [2018-12-14
03:26:42,973] {spark_submit_hook.py:283} INFO - Spark-Submit cmd:
['spark-submit', '--master', 'yarn', '--executor-cores', '1', '--name',
'airflow-spark', '--queue', 'root.default',
'[email protected]:/home/hadoop/pyspark_script/test_spark_submit.py']
[2018-12-14 03:26:42,977] {models.py:1760} ERROR - [Errno 2] No such
file or directory: 'spark-submit'
Traceback (most recent call last):
File "/home/dataetl/anaconda3/lib/python3.6/site-
packages/airflow/models.py", line 1659, in _run_raw_task
result = task_copy.execute(context=context)
File "/home/dataetl/anaconda3/lib/python3.6/site-
packages/airflow/contrib/operators/spark_submit_operator.py", line
168,
in execute
self._hook.submit(self._application)
File "/home/dataetl/anaconda3/lib/python3.6/site-
packages/airflow/contrib/hooks/spark_submit_hook.py", line 330, in
submit
**kwargs)
File "/home/dataetl/anaconda3/lib/python3.6/subprocess.py", line
707,
in __init__
restore_signals, start_new_session)
File "/home/dataetl/anaconda3/lib/python3.6/subprocess.py", line
1326, in _execute_child
raise child_exception_type(errno_num, err_msg)
FileNotFoundError: [Errno 2] No such file or directory: 'spark-submit'
Voici mes questions:
Dois-je installer spark hadoop sur ma machine à circulation d'air? Je demande parce que dans ce sujet J'ai lu que je dois copier hdfs-site.xml
et Hive-site.xml
. Mais comme vous pouvez l'imaginer, je n'ai ni /etc/hadoop/
ni /etc/Hive/
répertoires sur ma machine airflow.
a) Si non , où dois-je exactement copier hdfs-site.xml
et Hive-site.xml
sur ma machine à circulation d'air?
b) Si oui , cela signifie-t-il que je dois configurer ma machine à flux d'air en tant que client? Une sorte de nœud Edge qui ne participe pas aux travaux mais peut être utilisé pour soumettre des actions?
Puis-je pouvoir spark-submit
depuis ma machine airflow? Si oui, je n'ai pas besoin de créer une connexion sur Airflow comme je le fais pour une base de données mysql par exemple, non?
Oh et la cerise sur le gâteau: vais-je pouvoir stocker mes scripts pyspark dans ma machine à airflow et spark-submit
les à partir de cette même machine à circulation d'air. Ce serait super!
Tout commentaire serait très utile, même si vous n'êtes pas en mesure de répondre à toutes mes questions ...
Merci d'avance quand même! :)
Pour répondre à votre première question, oui c'est une bonne pratique.
Pour savoir comment utiliser SparkSubmitOperator
, veuillez vous référer à ma réponse sur https://stackoverflow.com/a/53344713/5691525