本文用于修改已创建好的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": "*"
}
]
}
点击下一步后填写policy Name后完成policy创建
6.
将以上创建的policy添加到EMR_EC2_DefaultRole角色,本文EMRCore节点使用默认EMR_EC2_DefaultRole,请根据实际情况修改。
操作说明
场景需求:只是扩展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