使用Terraform在AWS EMR 5.13.X集群引导安装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

