【问题标题】:AWS Glue automatic job creationAWS Glue 自动创建作业
【发布时间】:2019-01-15 06:18:55
【问题描述】:

我有可以在 AWS GLUE 中运行的 pyspark 脚本。但是每次我从 UI 创建作业并将我的代码复制到作业时。无论如何我可以从 s3 存储桶中的文件自动创建作业。 (我拥有运行时将使用的所有库和粘合上下文)

【问题讨论】:

  • 如果您在文件到达时使用 S3EventNotification 触发 Lambda,然后创建特定的 Glue 作业。
  • 是 AWS 提供 AWS cli 命令和 boto3 客户端,可以动态创建、执行和删除 Glue 作业。 AWS 上有足够的文档和示例

标签: amazon-web-services amazon-ec2 pyspark aws-glue aws-glue-data-catalog


【解决方案1】:

另一种选择是使用AWS CloudFormation。您可以在模板文件中定义要创建的所有 AWS 资源(不仅是 Glue 作业),然后在需要时从 AWS Console 或 using cli 更新堆栈。

Glue job 的模板如下所示:

  MyJob:
    Type: AWS::Glue::Job
    Properties:
      Command:
        Name: glueetl
        ScriptLocation: "s3://aws-glue-scripts//your-script-file.py"
      DefaultArguments:
        "--job-bookmark-option": "job-bookmark-enable"
      ExecutionProperty:
        MaxConcurrentRuns: 2
      MaxRetries: 0
      Name: cf-job1
      Role: !Ref MyJobRole # reference to a Role resource which is not presented here

【讨论】:

  • 很棒的信息。我试图搜索 CloudFormation 模板以一次创建多个 GlueJobs。即 your-script-file1.py 和 your-script-file2.py。是否可以通过 CloudFormation 实现?
  • @RaxitSolanki 绝对。只需定义另一个具有不同逻辑名称的AWS::Glue::Job 类型资源(即MyJob1)
  • 谢谢!这意味着,每次我们创建一个新的 GlueJob 脚本时,我们都需要更新 CloudFormation 模板。使用 CodePipeline / CloudFormation 集成 GlueJob(测试、部署)的最佳实践是什么?假设我创建了一个新的 GlueJob 脚本并在我的 GitRepo 中编辑了一个现有的 GlueJob(a.py 和 b.py)。现在,我只想部署新创建/编辑的作业(即在先前提交中编辑/​​创建的作业)。我目前正在使用 CloudFormation,“Git-source”-> CodeBuild 测试并将工件保存在 S3 存储桶中。但我不清楚我将如何部署(多个作业)。
  • @YuriyBondaruk 这里的逻辑名称是哪一个?属性中的“名称”,或命令中的“名称”。
  • @abhijitcaps 也没有。它是资源的名称。在我的示例中,它是名为“MyJob”的根元素
【解决方案2】:
【解决方案3】:

我编写了以下脚本:

  1. 我们有 (glue)_dependency.txt 文件,脚本获取所有依赖文件的路径并创建 zip 文件。
  2. 它使用 s3 同步在 S3 中上传胶水文件和 zip 文件
  3. (可选)如果作业设置发生任何变化,将重新部署 cloudformation 模板

你可以写一个shell脚本来做。

【讨论】:

    【解决方案4】:

    我创建了一个名为datajob 的开源库来部署和编排粘合作业。你可以在 github https://github.com/vincentclaes/datajob 和 pypi 上找到它

    pip install datajob
    npm install -g aws-cdk@1.87.1
    

    您创建一个文件datajob_stack.py 来描述您的粘合作业以及它们是如何编排的:

    from datajob.datajob_stack import DataJobStack
    from datajob.glue.glue_job import GlueJob
    from datajob.stepfunctions.stepfunctions_workflow import StepfunctionsWorkflow
    
    
    with DataJobStack(stack_name="data-pipeline-simple") as datajob_stack:
    
        # here we define 3 glue jobs with a relative path to the source code.
        task1 = GlueJob(
            datajob_stack=datajob_stack,
            name="task1",
            job_path="data_pipeline_simple/task1.py",
        )
        task2 = GlueJob(
            datajob_stack=datajob_stack,
            name="task2",
            job_path="data_pipeline_simple/task2.py",
        )
        task3 = GlueJob(
            datajob_stack=datajob_stack,
            name="task3",
            job_path="data_pipeline_simple/task3.py",
        )
    
        # we instantiate a step functions workflow and add the sources
        # we want to orchestrate. 
        with StepfunctionsWorkflow(
            datajob_stack=datajob_stack, name="data-pipeline-simple"
        ) as sfn:
            [task1, task2] >> task3
    

    部署您的代码以粘合执行:

    export AWS_PROFILE=my-profile    
    datajob deploy --config datajob_stack.py
    

    任何feedback 都非常感谢!

    【讨论】:

      猜你喜欢
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      • 2019-11-19
      • 2018-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多