web-dev-qa-db-ja.com

Airflow SparkSubmitOperator-別のサーバーでスパーク送信する方法

私はAirflowを初めて使用し、Sparkであり、SparkSubmitOperatorと苦労しています。

エアフロースケジューラとhadoopクラスターは同じマシンにセットアップされていません(最初の質問:それは良い方法ですか?)。

Pysparkスクリプトを呼び出す必要がある多くの自動手順があります。これらのpysparkスクリプトは、hadoopクラスター(10.70.1.35)に保存されます。エアフローダグはエアフローマシン(10.70.1.22)に保存されます。

現在、エアフローを使用してpysparkスクリプトをスパーク送信する場合、次のように単純なBashOperatorを使用します。

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)

完璧に機能します。ただし、SparkSubmitOperatorを使用してspark pysparkスクリプトを送信する)を開始します。

私はこれを試しました:

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) 

Dagが壊れていると表示されないので、構文は問題ないはずです。しかし、実行すると次のエラーが表示されます。

[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'

私の質問は次のとおりです。

  1. spark hadoopにhadoopをインストールする必要がありますか?これは トピックhdfs-site.xmlおよびHive-site.xmlをコピーする必要があることを読みましたが、ご想像のとおり、エアフローマシンには/etc/hadoop//etc/Hive/ディレクトリもありません。

  2. a)いいえの場合、エアフローマシンのhdfs-site.xmlHive-site.xmlを正確にどこにコピーすればよいですか?

  3. b)yesの場合、エアフローマシンをクライアントとして構成する必要があるということですか?ジョブには参加しませんが、アクションの送信に使用できる一種のエッジノードですか?

  4. 次に、エアフローマシンからspark-submitを実行できますか?はいの場合、Airflowで接続を作成する必要はありません。たとえば、mysqlデータベースの場合のように、正しいですか?

  5. ああ、ケーキの桜:pysparkスクリプトをエアフローマシンに保存し、同じエアフローマシンからspark-submitできるようになります。それはすごいでしょう!

あなたが私のすべての質問に答えることができないとしても、どんなコメントでも非常に役に立ちます...

とにかく事前に感謝します! :)

6
V. Foy

最初の質問に答えるために、はい、それは良い習慣です。

SparkSubmitOperatorの使用方法については、 https://stackoverflow.com/a/53344713/5691525 の回答を参照してください。

  1. はい、エアフローマシンにはスパークバイナリが必要です。
  2. -
  3. はい
  4. No->それでも、Airflowにsparkバイナリファイルをインストールした場所を伝えるための接続が必要です。 https://stackoverflow.com/a/50541640/5691525
  5. 動作するはずです
7
kaxil