本文用于修改已创建好的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节点EBS卷大小_EMR_02

操作说明

场景需求:只是扩展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


EMR修改Core节点EBS卷大小_AWS_03

修改集群现有Core节点配置

修改Bootstrap引导脚本无法影响现有集群配置,只有新添加的Core节点实例可以通过Bootstrap引导脚本扩展,现有的Core节点实例需通过手动方式进行扩展,扩展方法可参考AWS的EBS磁盘扩展方法:

https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/recognize-expanded-volume-linux.html