AWS EMR-EC2集群上Apache Beam SparkRunner部署问题求助
解决AWS EMR上Apache Beam SparkRunner的权限与依赖问题
问题背景
在AWS EMR-EC2集群上使用Apache Beam SparkRunner运行Python脚本时,先后遇到依赖包找不到、Docker镜像未拉取、虚拟环境下的权限错误(PermissionError: [Errno 13] Permission denied: '/home/.apache_beam')等问题,其中虚拟环境方案解决了依赖问题,但卡在权限错误上。
核心原因分析
- 依赖包找不到:Spark on YARN cluster模式下,任务以
yarn用户运行,系统级或root安装的包不在yarn用户的PYTHONPATH中,导致无法识别。 - Docker镜像未拉取:配置了Kubernetes镜像参数但使用
--master yarn,两种运行模式不兼容,YARN不会处理Kubernetes镜像配置。 - 权限错误:Beam默认会在
/home/.apache_beam目录缓存JAR包,但yarn用户对/home目录无写入权限。
解决方案
一、修复虚拟环境下的权限错误
针对/home/.apache_beam的权限问题,有两种直接解决方式:
1. 指定Beam缓存目录到可写路径
在提交任务时,通过Spark配置指定Beam的JAR缓存目录为容器临时目录(/tmp,所有用户均有写入权限):
aws emr add-steps \ --cluster-id j-id \ --steps Type=Spark,Name="SparkJob",ActionOnFailure=CONTINUE,Args="[ '--master', 'yarn', '--deploy-mode', 'cluster', '--conf', 'spark.archives=s3://s3bucket/pyspark_venv.tar.gz#environment', '--conf', 'spark.yarn.appMasterEnv.PYSPARK_PYTHON=./environment/bin/python', '--conf', 'spark.executorEnv.PYSPARK_PYTHON=./environment/bin/python', '--conf', 'spark.yarn.appMasterEnv.APACHE_BEAM_JAR_CACHE_DIR=/tmp/.apache_beam', '--conf', 'spark.executorEnv.APACHE_BEAM_JAR_CACHE_DIR=/tmp/.apache_beam', 'pythonfile' ]" \ --region us-east-1
也可以在Python脚本开头直接设置环境变量:
import os os.environ['APACHE_BEAM_JAR_CACHE_DIR'] = '/tmp/.apache_beam'
2. 确保虚拟环境权限全局可读
打包虚拟环境前,修改其权限为所有用户可读可执行,避免yarn用户无法访问:
chmod -R 755 /path/to/your/venv tar -czf pyspark_venv.tar.gz -C /path/to/your venv
再将修改后的压缩包上传到S3。
二、优化依赖安装方案(替代虚拟环境)
如果不想用虚拟环境,可通过引导脚本将Beam安装到hadoop用户(YARN任务默认运行用户)的目录下:
#!/bin/bash sudo -u hadoop pip install --upgrade pip sudo -u hadoop pip install setuptools --upgrade sudo -u hadoop pip install "apache_beam[aws]==2.61.0"
这样安装的包会在hadoop用户的site-packages中,YARN任务可以直接识别。
三、Docker模式的正确配置(可选)
若要使用Docker容器运行任务,需切换到YARN的Docker容器模式,而非Kubernetes参数,示例配置如下:
spark-submit \ --master yarn \ --deploy-mode cluster \ --conf spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_TYPE=docker \ --conf spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=user/image:latest \ --conf spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_DOCKER_PULL_POLICY=Always \ --conf spark.pyspark.python=python3 \ --conf spark.pyspark.driver.python=python3 \ beam_test_local.py \ --input_pattern_list="s3path" \ --runner=SparkRunner \ --spark_master=yarn \ --region=us-east-1
注意:需确保EMR集群已启用YARN容器化功能,且镜像中包含所有依赖。
内容的提问来源于stack exchange,提问作者Shiyi Yin
相关产品推荐
相关产品推荐

