Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 用于AWS EMR自动群集创建和pyspark部署的Airflow/Luigi_Amazon Web Services_Apache Spark_Pyspark_Airflow_Luigi - Fatal编程技术网

Amazon web services 用于AWS EMR自动群集创建和pyspark部署的Airflow/Luigi

Amazon 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

我是气流自动化的新手,我现在不知道是否可以用apache气流(或luigi等)来实现这一点,或者我应该制作一个长的bash文件来实现这一点

我想为此建立dag

  • 在AWS EMR上创建/克隆群集
  • 安装python要求
  • 安装pyspark相关库
  • 从github获取最新代码
  • 提交星火作业
  • 结束时终止群集
  • 对于单个步骤,我可以创建如下所示的.sh文件(不确定这样做是否好),但不知道如何在气流中执行

    1) 使用
    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)