如何在AWS CDK glue-alpha作业的extraPythonFiles中导入模块?
如何在AWS Glue Job中直接导入通过extraPythonFiles传入的自定义模块?
问题背景
使用AWS CDK的@aws-cdk/aws-glue-alpha库创建Glue Job时,通过extraPythonFiles参数传入自定义模块my_module.py,CDK定义代码如下:
new glueAlpha.Job(this, id + '-aggregate', { jobName: id + '-aggregate', executionClass: glueAlpha.ExecutionClass.FLEX, sparkUI: { enabled: true }, role: iam.Role.fromRoleName(this, id, 'service-role/AWSGlueServiceRole'), workerCount: 2, workerType: glueAlpha.WorkerType.G_1X, defaultArguments: { '--environment_tag': env_tag, '--s3_bucket': dataBucket.bucketName }, executable: glueAlpha.JobExecutable.pythonEtl({ glueVersion: glueAlpha.GlueVersion.V3_0, pythonVersion: glueAlpha.PythonVersion.THREE, script: glueAlpha.Code.fromAsset(glueSourceCode + '/data_quality.py'), extraPythonFiles: [glueAlpha.Code.fromAsset(sourceCode + '/my_module.py')], }), });
部署后,该模块文件会以随机哈希命名的形式存放在Glue临时文件系统中(如/tmp/localPyFiles-xxx/xxxxxxx.py),无法直接通过import my_module导入,需要解决无需依赖临时路径直接导入的问题。
解决方案
方法1:将模块打包为标准Python包结构(推荐)
把自定义模块整理成标准包结构后打包为zip,让Glue自动识别模块名称:
- 创建一个目录(例如
my_package),将my_module.py放入该目录 - 将目录打包为
my_package.zip(确保zip内直接包含my_package目录,避免多层嵌套) - 修改CDK代码中的
extraPythonFiles配置,指向这个zip文件:
extraPythonFiles: [glueAlpha.Code.fromAsset(sourceCode + '/my_package.zip')],
- 在Glue作业脚本
data_quality.py中,直接执行导入:
from my_package import my_module
方法2:在作业脚本中动态重命名临时文件
在作业脚本开头添加代码,定位临时路径中的随机命名文件并重命名为模块名,之后即可正常导入:
import os import sys import shutil # 定位临时文件目录 try: local_py_dir = next(d for d in sys.path if d.startswith('/tmp/localPyFiles')) except StopIteration: raise RuntimeError("找不到localPyFiles临时目录") # 获取目录中的Python文件 py_files = [f for f in os.listdir(local_py_dir) if f.endswith('.py')] if len(py_files) != 1: raise RuntimeError("临时目录中Python文件数量异常") # 重命名为my_module.py src_path = os.path.join(local_py_dir, py_files[0]) dst_path = os.path.join(local_py_dir, 'my_module.py') shutil.move(src_path, dst_path) # 现在可以正常导入模块 import my_module
方法3:直接指定S3路径并配合包结构
如果不想通过CDK的Code.fromAsset上传文件,可以手动将打包好的zip文件上传到S3,然后在Glue Job的defaultArguments中添加--extra-py-files参数:
defaultArguments: { '--environment_tag': env_tag, '--s3_bucket': dataBucket.bucketName, '--extra-py-files': 's3://your-bucket/path/to/my_package.zip' },
之后同样可以在作业脚本中直接导入模块。
内容的提问来源于stack exchange,提问作者Gabriele
相关产品推荐
相关产品推荐

