Amazon web services 用于AWS EMR自动群集创建和pyspark部署的Airflow/Luigi
我是气流自动化的新手,我现在不知道是否可以用apache气流(或luigi等)来实现这一点,或者我应该制作一个长的bash文件来实现这一点 我想为此建立dagAmazon web services 用于AWS EMR自动群集创建和pyspark部署的Airflow/Luigi,amazon-web-services,apache-spark,pyspark,airflow,luigi,Amazon Web Services,Apache Spark,Pyspark,Airflow,Luigi,我是气流自动化的新手,我现在不知道是否可以用apache气流(或luigi等)来实现这一点,或者我应该制作一个长的bash文件来实现这一点 我想为此建立dag 在AWS EMR上创建/克隆群集 安装python要求 安装pyspark相关库 从github获取最新代码 提交星火作业 结束时终止群集 对于单个步骤,我可以创建如下所示的.sh文件(不确定这样做是否好),但不知道如何在气流中执行 1) 使用cluster.sh创建群集 aws emr create-cluster \ --n
cluster.sh创建群集
aws emr create-cluster \
--name "1-node dummy cluster" \
--instance-type m3.xlarge \
--release-label emr-4.1.0 \
--instance-count 1 \
--use-default-roles \
--applications Name=Spark \
--auto-terminate
2&3&4)克隆git并安装要求codesetup.sh
git clone some-repo.git
pip install -r requirements.txt
mv xyz.jar /usr/lib/spark/xyz.jar
aws emr add-steps --cluster-id <Your EMR cluster id> --steps Type=spark,Name=TestJob,Args=[--deploy-mode,cluster,--master,yarn,--conf,spark.yarn.submit.waitAppCompletion=true,pythonjob.py,s3a://your-source-bucket/data/data.csv,s3a://your-destination-bucket/test-output/],ActionOnFailure=CONTINUE
5) 运行spark作业sparkjob.sh
git clone some-repo.git
pip install -r requirements.txt
mv xyz.jar /usr/lib/spark/xyz.jar
aws emr add-steps --cluster-id <Your EMR cluster id> --steps Type=spark,Name=TestJob,Args=[--deploy-mode,cluster,--master,yarn,--conf,spark.yarn.submit.waitAppCompletion=true,pythonjob.py,s3a://your-source-bucket/data/data.csv,s3a://your-destination-bucket/test-output/],ActionOnFailure=CONTINUE
aws emr添加步骤--cluster id--steps Type=spark,Name=TestJob,Args=[--deploy mode,cluster,-master,warn,--conf,spark.warn.submit.waitAppCompletion=true,pythonjob.py,s3a://源bucket/data/data.csv,s3a://目标bucket/test output/],actionfailure=CONTINUE
6) 不确定,可能是这样
terminate-clusters
--cluster-ids <value> [<value>...]
终止集群
--群集ID[…]
最后,所有这些都可以作为一个.sh文件执行。我需要知道气流/luigi的好方法
我发现:
我发现这篇文章很接近,但它已经过时(2016年),并且错过了剧本的连接和代码
气流有操作员负责此操作 我发现,有两种方法可以做到这一点
1)我们可以借助emr创建集群和addstep
制作一个bash脚本,然后使用气流bash操作符
进行调度
或者,在这两个方面有一个包装器,称为
他们文档中的一个例子
sparksteps examples/episodes.py \
--s3-bucket $AWS_S3_BUCKET \
--aws-region us-east-1 \
--release-label emr-4.7.0 \
--uploads examples/lib examples/episodes.avro \
--submit-args="--deploy-mode client --jars /home/hadoop/lib/spark-avro_2.10-2.0.2-custom.jar" \
--app-args="--input /home/hadoop/episodes.avro" \
--tags Application="Spark Steps" \
--debug
您可以使用自己选择的默认选项创建.sh脚本
。在准备好这个脚本之后,您可以从下面的操作符调用它
create_command = "sparkstep_custom.sh "
t1 = BashOperator(
task_id= 'create_file',
bash_command=create_command,
dag=dag
)
2)您可以使用aws的气流操作员来完成此操作
EmrCreateJobFlowOperator
(用于启动群集)EmrAddStepsOperator
(用于提交spark作业)
EmrStepSensor
(跟踪步骤完成的时间)
EmrTerminateJobFlowOperator
(在步骤完成时终止clluster)
创建集群和提交步骤的基本示例
my_step=[
{
'Name': 'setup - copy files',
'ActionOnFailure': 'CANCEL_AND_WAIT',
'HadoopJarStep': {
'Jar': 'command-runner.jar',
'Args': ['aws', 's3', 'cp', S3_URI + 'test.py', '/home/hadoop/']
}
},
{
'Name': 'setup - copy files 3',
'ActionOnFailure': 'CANCEL_AND_WAIT',
'HadoopJarStep': {
'Jar': 'command-runner.jar',
'Args': ['aws', 's3', 'cp', S3_URI + 'myfiledependecy.py', '/home/hadoop/']
}
},
{
'Name': 'Run Spark',
'ActionOnFailure': 'CANCEL_AND_WAIT',
'HadoopJarStep': {
'Jar': 'command-runner.jar',
'Args': ['spark-submit','--jars', "jar1.jar,jar2.jar", '--py-files','/home/hadoop/myfiledependecy.py','/home/hadoop/test.py']
}
}
]
cluster_creator = EmrCreateJobFlowOperator(
task_id='create_job_flow2',
job_flow_overrides=JOB_FLOW_OVERRIDES,
aws_conn_id='aws_default',
emr_conn_id='emr_default',
dag=dag
)
step_adder_pre_step = EmrAddStepsOperator(
task_id='pre_step',
job_flow_id="{{ task_instance.xcom_pull('create_job_flow2', key='return_value') }}",
aws_conn_id='aws_default',
steps=my_steps,
dag=dag
)
step_checker = EmrStepSensor(
task_id='watch_step',
job_flow_id="{{ task_instance.xcom_pull('create_job_flow2', key='return_value') }}",
step_id="{{ task_instance.xcom_pull('pre_step', key='return_value')[0] }}",
aws_conn_id='aws_default',
dag=dag
)
cluster_remover = EmrTerminateJobFlowOperator(
task_id='remove_cluster',
job_flow_id="{{ task_instance.xcom_pull('create_job_flow2', key='return_value') }}",
aws_conn_id='aws_default',
dag=dag
)
另外,要将代码上传到s3(我很想从github获得最新的代码)。可以使用s3
、boto3
和Pythonoperator
简单例子
S3_BUCKET = 'you_bucket_name'
S3_URI = 's3://{bucket}/'.format(bucket=S3_BUCKET)
def upload_file_to_S3(filename, key, bucket_name):
s3.Bucket(bucket_name).upload_file(filename, key)
upload_to_S3_task = PythonOperator(
task_id='upload_to_S3',
python_callable=upload_file_to_S3,
op_kwargs={
'filename': configdata['project_path']+'test.py',
'key': 'test.py',
'bucket_name': 'dep-buck',
},
dag=dag)