web-dev-qa-db-ja.com

Apacheエアフロー-自動化-実行方法spark paramを使用してジョブを送信

sparkとairflowを初めて使用し、airflowを使用してジョブを開始する方法と、ジョブに必要なパラメーターを理解しようとしています。以下のspark-submitコマンドを使用して特定のジョブを実行します。以下のようなエッジノードの特定の日付については、

EXECUTORS_MEM=4G
EXECUTORS_NUM=300
STARTDAY=20180401
ENDDAY=20180401
QUEUE=m
jobname=x

/home/spark/spark-2.1.0-bin-hadoop2.6/bin/spark-submit --verbose --master yarn --deploy-mode client $EXECUTORS_NUM  --executor-memory $EXECUTORS_MEM --executor-cores 1 --driver-memory 8G  --queue $QUEUE --class test.core.Driver --jars $JARS2 abc.jar --config=/a/b/c/test.config --appName=abc --sparkMaster=yarnclient --job=$jobname --days=$STARTDAY,$ENDDAY

では、エアフローでジョブを実行するために、以下のコードのような.pyを作成するかどうかを教えてください。これは、ジョブを実行してパラメーターを渡すことになっている方法ですか?

エッジノードでジョブを起動するために行ったように、パラメーターを渡すにはどうすればよいですか?

ジョブを自動化して毎日実行する場合、開始日を「t-7」にします。したがって、今日の日付が2018年4月20日の場合、ジョブの開始日は2018年4月13日である必要があります。どうすればそれを達成できますか?

###############.py file example ##############
**********************************************

    import BashOperator

    import os
    import sys

    os.environ['SPARK_HOME'] = '/path/to/spark/root'
    sys.path.append(os.path.join(os.environ['SPARK_HOME'], 'bin'))

    import os
    import sys


    os.environ['SPARK_HOME'] = '/home/spark/spark-2.1.0-bin-hadoop2.6/bin/'
    sys.path.append(os.path.join(os.environ['SPARK_HOME'], 'bin'))
    and add operator:

    spark_task = BashOperator(
        task_id='spark_Java',
        bash_command='spark-submit --class test.core.Driver abc.jar',
        params={'EXECUTORS_MEM': '4G', 'EXECUTORS_NUM': '300', 'QUEUE' :'m' , 'jobname' : 'x'},
        dag=dag

)

################### EOF ######################
**********************************************

新しい.pyファイル-何か問題がある場合は修正してください

  • 別のパスにあるsparkバージョンを実行するためにパラメータを渡すにはどうすればよいですか?
  • 別のパスにある瓶を渡します
  • 以下に示すようなパラメータを渡すのは正しい方法ですか?
  • ジョブを実行するために特定の開始日と終了日を手動で渡すことは可能ですか?

    from airflow import DAG
    
    from airflow.contrib.operators.spark_submit_operator import SparkSubmitOperator
    from airflow.utils import timezone
    
    
    DEFAULT_DATE = timezone.datetime(2017, 1, 1)
    
    args = {
        'owner': 'airflow',
        'start_date': DEFAULT_DATE
    }
    dag = DAG('test_dag_id', default_args=args)
    
    _config = {
        'config' : '/a/b/c/d/prod.config' 
        'master' : 'yarn'
        'deploy-mode' : 'client'
        'sparkMaster' : 'yarnclient'
        'class' : 'core.Driver' 
        'driver_classpath': 'parquet.jar',
        'jars': '/a/b/c/d/test.jar',
        'total_executor_cores': 4,
        'executor_cores': 1,
        'EXECUTORS_MEM': '8G',
        'EXECUTORS_NUM': 500,
        'executor-cores' : '1',
        'driver-memory' : '8G',
        'JOB_NAME' : ' ',
        'QUEUE' : ' ',
        'verbose' : ' '
        'start_date' : ' '
        'end_date' : ' '
        ]
    }
    
    operator = SparkSubmitOperator(
        task_id='spark_submit_job',
        dag=dag,
        **_config
    )
    
5
Nick

開始日は一度設定したもので、当日を基準にせず、絶対に設定することを目的としています。

このような:

_from airflow import DAG

dag = DAG(
    ...
    start_date=datetime.datetime(2018, 4, 13),
)
_

開始日をdatetime.timedelta(days=7)のようにデルタとして設定することは可能ですが、DAG(DAG実行、タスクインスタンスなどのすべての参照を含む)を削除すると開始日が変更されるため、これはお勧めしません。など)、別の日に最初からやり直します。ベストプラクティスは、DAGがべき等であることです。

Sparkにジョブを送信するために、_spark-submit_シェルコマンドをラップする SparkSubmitOperator があります。それが好ましいオプションです。とは言うものの、基本的にはBashOperatorで何でもできるので、それも実行可能な代替手段です。

SparkSubmitOperatorのリンクされたコードは、受け入れる引数ごとに十分に文書化されています。 application kwarg、pass Spark config with conf。 。_application_args_を使用して、任意の引数のリストをSparkアプリケーションに渡すことができます。

これは、Airflowでのユニットテストからコピーして少し簡略化したSparkSubmitOperatorの使用例です。 _**_を使用してdictからkwargsを分解し、Spark演算子を初期化しますが、これがテストの構造です。各構成値を渡すのと同じくらい簡単に渡すことができます。クワーグ。

_from airflow import DAG

from airflow.contrib.operators.spark_submit_operator import SparkSubmitOperator
from airflow.utils import timezone


DEFAULT_DATE = timezone.datetime(2017, 1, 1)

args = {
    'owner': 'airflow',
    'start_date': DEFAULT_DATE
}
dag = DAG('test_dag_id', default_args=args)

_config = {
    'conf': {
        'parquet.compression': 'SNAPPY'
    },
    'files': 'Hive-site.xml',
    'py_files': 'sample_library.py',
    'driver_classpath': 'parquet.jar',
    'jars': 'parquet.jar',
    'packages': 'com.databricks:spark-avro_2.11:3.2.0',
    'exclude_packages': 'org.bad.dependency:1.0.0',
    'repositories': 'http://myrepo.org',
    'total_executor_cores': 4,
    'executor_cores': 4,
    'executor_memory': '22g',
    'keytab': 'privileged_user.keytab',
    'principal': 'user/[email protected]',
    'name': '{{ task_instance.task_id }}',
    'num_executors': 10,
    'verbose': True,
    'application': 'test_application.py',
    'driver_memory': '3g',
    'Java_class': 'com.foo.bar.AppMain',
    'application_args': [
        '-f', 'foo',
        '--bar', 'bar',
        '--start', '{{ macros.ds_add(ds, -1)}}',
        '--end', '{{ ds }}',
        '--with-spaces', 'args should keep embdedded spaces',
    ]
}

operator = SparkSubmitOperator(
    task_id='spark_submit_job',
    dag=dag,
    **_config
)
_

ソース: https://github.com/Apache/incubator-airflow/blob/f520990fe0b7a70f80bec68cb5c3f0d41e3e984d/tests/contrib/operators/test_spark_submit_operator.py

4
Taylor Edmiston