You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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')等问题,其中虚拟环境方案解决了依赖问题,但卡在权限错误上。

核心原因分析

  1. 依赖包找不到:Spark on YARN cluster模式下,任务以yarn用户运行,系统级或root安装的包不在yarn用户的PYTHONPATH中,导致无法识别。
  2. Docker镜像未拉取:配置了Kubernetes镜像参数但使用--master yarn,两种运行模式不兼容,YARN不会处理Kubernetes镜像配置。
  3. 权限错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 19:29:51