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

AWS Spark镜像不支持HDFS,EKS上ETL作业失败求助

解决EMR迁移EKS后HDFS依赖作业失败问题

问题根源

  1. AWS官方EMR on EKS的Spark镜像(如895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-5.32.0)未预装HDFS客户端组件,执行hdfs命令会提示文件不存在。
  2. 作业日志中的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客户端的自定义镜像:

  1. 创建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
    
  2. 构建镜像并推送到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
    
  3. 配置作业使用自定义镜像,并确保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_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 02:26:19