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 ######################
**********************************************
ジョブを実行するために特定の開始日と終了日を手動で渡すことは可能ですか?
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
)
開始日は一度設定したもので、当日を基準にせず、絶対に設定することを目的としています。
このような:
_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
)
_