web-dev-qa-db-ja.com

boto3(またはその他)を使用してemrでpysparkジョブを自動化するにはどうすればよいですか?

大量のサーバーデータを解析し、それをRedshiftデータベースにアップロードするジョブを作成しています。

私の仕事の流れは次のとおりです。

  • S3からログデータを取得します
  • spark dataframesまたはspark sqlを使用してデータを解析し、S​​3に書き戻す
  • S3からRedshiftにデータをアップロードします。

しかし、これを自動化する方法に夢中になっているので、プロセスはEMRクラスターを起動し、インストール用の正しいプログラムをブートストラップし、解析用のコードを含むpythonスクリプトを実行します。と書き込み。

これを行う方法を学ぶのに役立つ例、チュートリアル、または経験を私と共有できる人はいますか?

11
flybonzai

Boto3 [〜#〜] emr [〜#〜] docsを見てクラスターを作成します。基本的に run_job_flow を呼び出して、必要なプログラムを実行するステップを作成する必要があります。

import boto3    

client = boto3.client('emr', region_name='us-east-1')

S3_BUCKET = 'MyS3Bucket'
S3_KEY = 'spark/main.py'
S3_URI = 's3://{bucket}/{key}'.format(bucket=S3_BUCKET, key=S3_KEY)

# upload file to an S3 bucket
s3 = boto3.resource('s3')
s3.meta.client.upload_file("myfile.py", S3_BUCKET, S3_KEY)

response = client.run_job_flow(
    Name="My Spark Cluster",
    ReleaseLabel='emr-4.6.0',
    Instances={
        'MasterInstanceType': 'm4.xlarge',
        'SlaveInstanceType': 'm4.xlarge',
        'InstanceCount': 4,
        'KeepJobFlowAliveWhenNoSteps': True,
        'TerminationProtected': False,
    },
    Applications=[
        {
            'Name': 'Spark'
        }
    ],
    BootstrapActions=[
        {
            'Name': 'Maximize Spark Default Config',
            'ScriptBootstrapAction': {
                'Path': 's3://support.elasticmapreduce/spark/maximize-spark-default-config',
            }
        },
    ],
    Steps=[
    {
        'Name': 'Setup Debugging',
        'ActionOnFailure': 'TERMINATE_CLUSTER',
        'HadoopJarStep': {
            'Jar': 'command-runner.jar',
            'Args': ['state-pusher-script']
        }
    },
    {
        'Name': 'setup - copy files',
        'ActionOnFailure': 'CANCEL_AND_WAIT',
        'HadoopJarStep': {
            'Jar': 'command-runner.jar',
            'Args': ['aws', 's3', 'cp', S3_URI, '/home/hadoop/']
        }
    },
    {
        'Name': 'Run Spark',
        'ActionOnFailure': 'CANCEL_AND_WAIT',
        'HadoopJarStep': {
            'Jar': 'command-runner.jar',
            'Args': ['spark-submit', '/home/hadoop/main.py']
        }
    }
    ],
    VisibleToAllUsers=True,
    JobFlowRole='EMR_EC2_DefaultRole',
    ServiceRole='EMR_DefaultRole'
)

ジョブフローIDがわかっている場合は、実行中のクラスターにステップを追加することもできます。

job_flow_id = response['JobFlowId']
print("Job flow ID:", job_flow_id)

step_response = client.add_job_flow_steps(JobFlowId=job_flow_id, Steps=SomeMoreSteps)

step_ids = step_response['StepIds']

print("Step IDs:", step_ids)

その他の構成については、 sparksteps を確認してください。

26
Kamil Sindi

実際、私はLambda関数のステートマシンラッパーであるAWSのStep Functionsを使用しているので、boto3を使用してEMR Sparkジョブを使用して run_job_flow そして describe_cluaster を使用してクラスターのステータスを取得できます。最後に choice を使用します。SOステップ関数の外観このようなもの(括弧内のステップ関数タイプ:

ジョブの実行(タスク)-> X分待機(待機)->ステータスの確認(タスク)->分岐(選択)[=>待機に戻る、または=>完了]

1
CpILL

AWS Data Pipeline を使用してこれを行うだけです。新しいファイルがバケット内に配置されるたびにラムダ関数をトリガーするようにS3バケットを設定できます https://docs.aws.Amazon.com/lambda/latest/dg/with-s3-example.html 。次に、Lambda関数がデータパイプラインをアクティブにします https://aws.Amazon.com/blogs/big-data/using-aws-lambda-for-event-driven-data-processing-pipelines/ 次に、データパイプラインがEmrClusterを使用して新しいEMRクラスターを起動し、bootstrapオプションを指定し、EmrActivityを使用してEMRコマンドを実行できます。すべて完了すると、 EMRクラスターを作成し、データパイプラインを非アクティブ化します。

1