AWS Spark镜像不支持HDFS,EKS上ETL作业失败求助
解决EMR迁移EKS后HDFS依赖作业失败问题
问题根源
- AWS官方EMR on EKS的Spark镜像(如
895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-5.32.0)未预装HDFS客户端组件,执行hdfs命令会提示文件不存在。 - 作业日志中的
Incomplete HDFS URI错误,是因为URI格式错误(hdfs:/缺少一个斜杠),且EKS环境默认没有可用的HDFS集群。
推荐解决方案:迁移存储至S3
EMR on EKS原生适配S3作为主要存储,无需在EKS集群内搭建HDFS,步骤如下:
- 修改作业路径:将所有
hdfs:/xxx格式的路径替换为s3://bucket-name/xxx(例如s3://bucket-name/process-store/checkpoints/086461cd-df44-4ab4-a2ee-da2c5671f9b4)。 - 配置IAM权限:通过IRSA(IAM Roles for Service Accounts)为EKS Pod绑定具备S3读写权限的IAM角色,避免硬编码密钥。
- 验证作业:使用官方镜像重新提交作业,确认S3路径读写正常。
备选方案一:自定义镜像添加HDFS客户端
若无法修改作业存储逻辑,可基于官方镜像构建包含HDFS客户端的自定义镜像:
- 创建Dockerfile:
FROM 895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-5.32.0 RUN yum install -y hadoop-hdfs hadoop-client && yum clean all - 构建镜像并推送到ECR(或私有镜像仓库):
docker build -t custom-emr-spark:5.32.0 . aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin 895885662937.dkr.ecr.us-west-2.amazonaws.com docker tag custom-emr-spark:5.32.0 <your-ecr-repo-uri>:5.32.0 docker push <your-ecr-repo-uri>:5.32.0 - 配置作业使用自定义镜像,并确保Pod能访问外部HDFS集群(打通网络,挂载HDFS配置文件
core-site.xml、hdfs-site.xml到Pod的/etc/hadoop/conf目录)。
备选方案二:修复HDFS URI并连接外部HDFS集群
若有可用的外部HDFS集群(如原EMR集群的HDFS),需:
- 修正URI格式:将
hdfs:/xxx改为hdfs://<namenode-host>:<port>/xxx(例如hdfs://emr-namenode:8020/process-store/checkpoints/...)。 - 配置Spark参数:提交作业时添加HDFS集群配置:
spark-submit \ --conf spark.hadoop.fs.defaultFS=hdfs://<namenode-host>:8020 \ --conf spark.hadoop.dfs.nameservices=hdfs-cluster \ # 其他作业参数 - 网络打通:确保EKS集群与外部HDFS集群的网络连通(如通过VPC peering、安全组开放端口)。
内容的提问来源于stack exchange,提问作者rahuls_
相关产品推荐
相关产品推荐

