如何在EMR Studio工作区实现Python脚本导入S3或EMR目录数据?
直接从S3导入Python模块到EMR Studio的方案
核心思路
Python默认无法直接识别S3路径作为模块导入源,需要借助s3fs库实现S3文件系统的挂载,再将S3上的模块目录添加到Python路径;或是直接读取S3上的模块文件内容并动态加载。
方法1:通过s3fs添加S3路径到Python路径
- 先安装依赖包(EMR Studio环境默认未预装)
pip install s3fs
- 在Python脚本中配置S3密钥并导入模块
import sys import s3fs # 方式1:硬编码密钥(不推荐,建议用环境变量) fs = s3fs.S3FileSystem( key='你的Access Key', secret='你的Secret Access Key' ) # 方式2:通过环境变量读取密钥(推荐) # 先在EMR Studio终端执行:export AWS_ACCESS_KEY_ID=你的Access Key && export AWS_SECRET_ACCESS_KEY=你的Secret Access Key # fs = s3fs.S3FileSystem() # 将S3上存放mysource目录的父路径添加到Python路径 # 示例:若mysource在s3://your-bucket/path/to/modules/下,就添加这个父路径 sys.path.append('s3://your-bucket/path/to/modules/') # 现在可以直接导入模块 from mysource.settings import *
方法2:动态加载S3上的模块文件
如果不想修改Python路径,可以直接读取S3上的模块文件内容并动态加载:
import importlib.util import s3fs # 初始化S3文件系统(同样推荐用环境变量配置密钥) fs = s3fs.S3FileSystem( key='你的Access Key', secret='你的Secret Access Key' ) # 读取S3上的settings.py文件 with fs.open('s3://your-bucket/path/to/mysource/settings.py', 'r') as f: module_content = f.read() # 创建模块对象并执行内容 spec = importlib.util.spec_from_loader('mysource.settings', loader=None) settings_module = importlib.util.module_from_spec(spec) exec(module_content, settings_module.__dict__) # 调用模块中的变量/方法,比如 # print(settings_module.YOUR_VARIABLE)
为什么EMR控制台能成功导入?
之前在EMR控制台将S3文件复制到EMR本地/home/mysource/settings,该目录默认会被Python识别为模块路径;但EMR Studio工作区的环境不会自动关联S3路径,且原生Python不支持直接从S3导入模块,因此需要借助s3fs实现桥接。
内容的提问来源于stack exchange,提问作者Gaurav Singhal
相关产品推荐
相关产品推荐

