本文用于修改已创建好的EMR集群Core节点EBS磁盘容量,由于业务场景、成本等多方面考虑,需要周期性的调整Core节点的磁盘容量,但是通过人工调整EBS卷大小非常耗时,本文通过Bootstrap引导脚本扩展新添加Core节点EBS卷大小。
Core节点EBS扩展配置
通过Bootstrap引导脚本修改Core节点EBS磁盘容量,提升整理HDFS空间。以下为Core节点一块50GB的EBS卷,目标通过配置引导脚本来使新拉起的Core节点EBS卷扩容至100GB的配置流程。改过程通过使用cli修改EBS卷大小的命令,而EMR默认的role是没有该权限的,需要先配置权限。
创建权限策略
需要创建相应权限才可完成EBS磁盘的扩展,权限配置流程如下:
1. 打开 Amazon IAM控制台:
2. 在导航窗格上选择Policies
3. 选择Create policy
4. 选择JSON填写如下策略
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "ec2:ModifyVolume",
"Resource": "*"
}
]
}
5. 点击下一步后填写policy Name后完成policy创建
6. 将以上创建的policy添加到EMR_EC2_DefaultRole角色,本文EMRCore节点使用默认EMR_EC2_DefaultRole,请根据实际情况修改。
2.2、脚本说明
场景需求:只是扩展EMR集群Core节点的一块磁盘,对应的设备名是:/dev/sdb,对应的挂载目录是:/mnt。
本文Bootstrap引导脚本有两个脚本,FirstStageScript.sh作为入口,SecondStageScript.sh作为具体配置脚本,实际配置需修改现有EMR集群引导脚本,如未配置引导脚本则无法实现本文的配置。本文主要通过两个引导脚本完成配置。
FirstStageScript.sh脚本具体内容是:
#!/bin/bash -x
aws s3 cp s3://***/SecondStageScript.sh /home/hadoop/secondstage.sh && bash /home/hadoop/secondstage.sh & exit 0
注:标红部分需要用户配置为自己的S3桶路径。
主体的逻辑在SecondStageScript.sh脚本,扩展逻辑为:初始化环境(定义变量、安装jq工具)→判断集群状态→判断节点角色→获取机器元数据(对应的EBS-ID)→通过使用AWS Cli修改卷大小→扩展分区大小→扩展文件系统大小,SecondStageScript.sh脚本具体内容如下:
#!/bin/bash
sudo yum -y install jq
#定义可用区
region=cn-north-1
#定义目标卷大小
targetcapacity=100
#判断集群状态
while true; do
NODEPROVISIONSTATE=` sed -n '/localInstance [{]/,/[}]/{
/nodeProvisionCheckinRecord [{]/,/[}]/ {
/status: / { p }
/[}]/a
}
/[}]/a
}' /emr/instance-controller/lib/info/job-flow-state.txt | awk ' { print $2 }'`
INSTANCE_ROLE=$(jq .instanceRole /emr/instance-controller/lib/info/extraInstanceData.json)
if [ "$NODEPROVISIONSTATE" == "SUCCESSFUL" ]; then
sleep 5;
echo "Running my post provision bootstrap"
#判断节点角色
if [ ${INSTANCE_ROLE,,} == '"core"' ]; then
echo "Running my bootstrap on core"
#获取当前节点
instanceId=$(/usr/bin/curl -s http://xxxxx/latest/meta-data/instance-id)
#获取EBS-ID
volumeId=$(aws ec2 describe-instances --region cn-north-1 --instance-ids $instanceId|jq .Reservations[].Instances[].BlockDeviceMappings| jq '.[] | select(.DeviceName=="/dev/sdb") | .Ebs.VolumeId'|sed 's/\"//g')
echo $volumeId
#扩容EBS到100G
aws ec2 modify-volume --region cn-north-1 --volume-id $volumeId --size $targetcapacity
#扩展分区
sleep 10;
sudo growpart /dev/sdb 2
#扩展文件系统
sudo xfs_growfs -d /mnt
fi
exit;
fi
sleep 5;
done
将引导脚本上传至S3
权限配置完成后开始更新上传S3的Bootstrap引导脚本,修改部分如下:
1. 打开 Amazon S3控制台:
2. 在导航窗格上选择Buckets
3. 点击EMR中Bootstrap引导脚本所在存储桶
4. 上传2.2部分的Bootstrap引导脚本上传到该S3
修改集群现有Core节点配置
修改Bootstrap引导脚本无法影响现有集群配置,只有新添加的Core节点实例可以通过Bootstrap引导脚本扩展,现有的Core节点实例需通过手动方式进行扩展,扩展方法可参考AWS的EBS磁盘扩展方法:
https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/recognize-expanded-volume-linux.html