dd.*_*dd. 5 etl aws-lambda aws-glue
当前,我正在使用AWS Glue作业将数据加载到RedShift,但是在加载之后,我可能需要使用AWS Lambda函数运行一些数据清除任务。有什么方法可以在胶水作业结束时触发Lambda函数?可以使用SNS消息触发Lambda函数,但是我找不到在Glue作业结束时发送SNS的方法。
小智 11
@oreoluwa是正确的,这可以使用Cloudwatch Events完成。
从Cloudwatch仪表板:
您将在Lambda中获得的事件将采用以下格式:
{
'version': '0',
'id': 'a9bc90be-xx00-03e0-9bc5-a0a0a0a0a0a0',
'detail-type': 'GlueJobStateChange',
'source': 'aws.glue',
'account': 'xxxxxxxxxx',
'time': '2018-05-10T16: 17: 03Z',
'region': 'us-east-2',
'resources': [],
'detail': {
'jobName': 'xxxx_myjobname_yyyy',
'severity': 'INFO',
'state': 'SUCCEEDED',
'jobRunId': 'jr_565465465446788dfdsdf546545454654546546465454654',
'message': 'Jobrunsucceeded'
}
}
Run Code Online (Sandbox Code Playgroud)
由于 AWS Glue 已开始支持 python,您可以按照以下路径来实现您想要的。下面的示例脚本展示了如何做到这一点 -
import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job
import boto3 ## Step-2
## @params: [JOB_NAME]
args = getResolvedOptions(sys.argv, ['JOB_NAME'])
sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)
## Do all ETL stuff here
## Once the ETL completes
lambda_client = boto3.client('lambda') ## Step-3
response = lambda_client.invoke(FunctionName='string') ## Step-4
Run Code Online (Sandbox Code Playgroud)
请确保您在创建 Glue 作业时使用的角色有权调用 lambda 函数。
请参阅此处有关 lambda 的 Boto3 文档。
不可以。目前您无法在 Glue 作业结束时触发 lambda 函数。这样做的原因是 AWS 尚未在 Lambda 中提供此触发器。如果您在创建 lambda 函数后查看 AWS lambda 触发器列表,您会发现它具有大多数 AWS 服务作为触发器,但没有 AWS Glue。所以,目前,这是不可能的,但也许在未来。
但我想提一下,您实际上可以使用 lambda python 脚本来控制胶水脚本的流程。(我是用 python 做的,我确定可能有其他语言支持这个)。我的用例是,每当我在 S3 存储桶中上传任何对象时,它都会获取 lambda 函数触发器,我从中读取对象文件并开始我的粘合作业。一旦 Glue 作业的状态完成,我会将我的文件写回链接到此 Lambda 函数的 S3 存储桶。
| 归档时间: |
|
| 查看次数: |
4826 次 |
| 最近记录: |