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

使用Terraform在AWS EMR 5.13.X集群引导安装Spark失败求助

解决EMR 5.13.X + Terraform安装Spark的问题

首先得提醒你:EMR 5.13.x版本默认已经预装了Spark(对应Spark 2.3.0版本),如果你只是需要使用Spark,完全不需要额外的引导操作来安装。直接在Terraform的EMR集群配置中指定Spark作为应用程序,反而更简单可靠。

方案1:直接使用EMR自带的Spark(推荐)

在Terraform的emr_cluster资源里,通过applications字段指定Spark即可,省去引导操作的麻烦:

resource "aws_emr_cluster" "my_emr_cluster" {
  name          = "my-emr-cluster-5.13"
  release_label = "emr-5.13.0"
  instances {
    master_instance_type = "m4.large"
    core_instance_type   = "m4.large"
    core_instance_count  = 2

    ec2_key_name = "your-key-pair"
  }

  # 指定预装Spark
  applications {
    name = "Spark"
  }

  # 其他必要配置(服务角色、实例角色需提前创建好)
  service_role = "EMR_DefaultRole"
  job_flow_role = "EMR_EC2_DefaultRole"
}

方案2:自定义安装特定版本的Spark(如果需要非默认版本)

如果你确实需要安装自定义版本的Spark(比如比EMR自带的更新/旧的版本),那你之前用的官方s3://support.elasticmapreduce/spark/install-spark脚本已经过时,不适配EMR 5.x。这里给你一个适配EMR 5.x的引导脚本示例,你可以把它上传到自己的S3桶后再引用:

适配EMR 5.x的Spark安装引导脚本(示例)

#!/bin/bash
set -e

# 可修改为你需要的版本
SPARK_VERSION="2.4.8"
HADOOP_VERSION="2.8.5"

# 下载Spark二进制包
wget https://archive.apache.org/dist/spark/spark-${SPARK_VERSION}/spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}.tgz -P /tmp/

# 解压到系统目录并创建软链接
sudo tar -xzf /tmp/spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}.tgz -C /usr/lib/
sudo ln -s /usr/lib/spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION} /usr/lib/spark

# 配置全局环境变量
echo "export SPARK_HOME=/usr/lib/spark" | sudo tee -a /etc/profile.d/spark.sh
echo "export PATH=\$PATH:\$SPARK_HOME/bin" | sudo tee -a /etc/profile.d/spark.sh

# 让Spark适配EMR的Hadoop配置
sudo cp /etc/hadoop/conf/* /usr/lib/spark/conf/

# 仅在主节点配置Spark History Server(可选)
if grep -q "isMaster=true" /mnt/var/lib/info/instance.json; then
  sudo mkdir -p /mnt/spark-history
  echo "spark.eventLog.enabled true" | sudo tee -a /usr/lib/spark/conf/spark-defaults.conf
  echo "spark.eventLog.dir hdfs:///user/spark/applicationHistory" | sudo tee -a /usr/lib/spark/conf/spark-defaults.conf
  echo "spark.history.fs.logDirectory hdfs:///user/spark/applicationHistory" | sudo tee -a /usr/lib/spark/conf/spark-defaults.conf
  
  # 创建HDFS存储目录并设置权限
  hdfs dfs -mkdir -p /user/spark/applicationHistory
  hdfs dfs -chown spark:hadoop /user/spark/applicationHistory
fi

Terraform中引用自定义引导脚本的配置

把上面的脚本保存为install-spark-emr5.sh,上传到你的S3桶(比如s3://your-bucket/scripts/install-spark-emr5.sh),然后在Terraform中配置引导操作:

resource "aws_emr_cluster" "my_emr_cluster" {
  name          = "my-emr-cluster-custom-spark"
  release_label = "emr-5.13.0"
  instances {
    master_instance_type = "m4.large"
    core_instance_type   = "m4.large"
    core_instance_count  = 2

    ec2_key_name = "your-key-pair"
  }

  # 配置自定义引导操作
  bootstrap_action {
    name = "Install Custom Spark"
    path = "s3://your-bucket/scripts/install-spark-emr5.sh"
    # 如果需要动态传递版本参数,可以取消下面的注释
    # args = ["2.4.8", "2.8.5"]
  }

  # 其他必要配置
  service_role = "EMR_DefaultRole"
  job_flow_role = "EMR_EC2_DefaultRole"
}

关于你原来的引导操作的问题

你之前用的s3://support.elasticmapreduce/spark/install-spark是EMR 4.x时代的脚本,在EMR 5.x上会因为依赖变更、系统路径变化等原因失败。另外,你传递的args = ["instance.isMaster=true", "echo running on master node"]格式也不符合该脚本的参数要求,这也是导致安装失败的原因之一。

希望上面的方案能帮你顺利解决问题!

内容的提问来源于stack exchange,提问作者R. Patel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:07:59