tonglin0325的个人主页

Amazon EMR使用指南

Amazon EMR是Amazon提供的托管大数据套件,可选的组件包括Hadoop,Hive,Hue,Hbase,Presto,Spark等

使用Amazon EMR的好处是快速伸缩,版本升级也较为方便,如果配合S3存储,可以做到计算和存储分离,这样对于运维的压力会小一些,存储的稳定性交给S3,计算集群即使故障也可以很方便的进行重建,很适合小团队。缺点是界面友好程度远不如CDH和HDP。

如果使用Amazon EMR,最好阅读一下官方的2个文档:

1.Amazon EMR最佳实践

1
2
https://d0.awsstatic.com/whitepapers/aws-amazon-emr-best-practices.pdf

2.Amazon EMR迁移指南

1
https://d1.awsstatic.com/whitepapers/amazon_emr_migration_guide.pdf

1.创建EMR集群#

在创建Amazon EMR集群的时候可以选择快速模式,界面如下

也可以选择高级模式

集群启动了之后,EMR大数据组件的安装目录在/usr/lib

1
2
3
4
5
6
7
8
[hadoop@ip-xxxxxxxx lib]$ ls
bigtop-groovy dracut hadoop hadoop-yarn java jvm ld-linux-aarch64.so.1 modules-load.d rpm systemd
bigtop-utils fontconfig hadoop-hdfs hbase java-1.5.0 jvm-commmon livy oozie sendmail tez
binfmt.d games hadoop-httpfs hive java-1.6.0 jvm-exports locale presto sendmail.postfix tmpfiles.d
cpp gcc hadoop-kms hive-hcatalog java-1.7.0 jvm-private lsb python2.7 spark udev
cups gems hadoop-lzo hudi java-1.8.0 kbd modprobe.d python3.7 sse2 yum-plugins
debug grub hadoop-mapreduce hue java-ext kernel modules ranger-kms sysctl.d zookeeper

EMR管理组件的安装目录在/usr/share/aws/emr

1
2
3
4
[hadoop@ip-xxxxxxxxxx emr]$ ls
cloudwatch-sink ddb emr-log-analytics-metrics goodies instance-controller node-provisioner s3select
command-runner emrfs emr-metrics-collector hadoop-state-pusher kinesis s3-dist-cp scripts

2.EMR CLI使用#

查看集群的cluster id,参考:https://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-manage-view-clusters.html

1
2
aws emr list-clusters

根据cluster id查看集群配置

1
2
aws emr describe-cluster --cluster-id j-xxxxxx

3.EMR角色分布#

 amazon EMR的节点分成3类:主节点,核心节点和任务节点

参考:了解节点类型:主节点、核心节点和任务节点 和 部署高可用的EMR集群,为您的业务连续性保驾护航

主节点:

  • HDFS Name Node运行在三个主节点中的其中两个。一个为active状态,另一个为 standby状态。当active的Name Node出现故障时,standby的Name Node会变为active并接管所有客户端的操作。EMR会启用一个新的主节点将故障的Name Node替换,并设为standby状态。
  • Yarn ResourceManager(RM)运行在所有的三个主节点上。其中,一个RM是active状态,另外两个是standby状态。当active的RM出现故障时,EMR会进行自动故障转移,将其中一个standby节点变为新的active来接管所有操作。之后EMR会将出现故障的master 节点替换,并设为standby状态。

核心节点:

  • 为确保核心节点实例组也具有高可用性,建议您至少启动四个核心节点。如果您决定启动具有三个或更少核心节点的较小集群,请通过将 dfs.replication parameter 设置为至少 2 来配置具有足够 DFS 复制的 HDFS。有关更多信息,请参阅 [HDFS 配置](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-hdfs-config.html)。
  • 节点类型/组件名称HDFS NamenodeHDFS SecondaryNamenodeHDFS DatanodeJournalNodesZookeeper ServerYARN ResourceManagerYARN NodeManagerYARN JobHistoryServerpresto coordinatorpresto workerHiveServer2HiveMetastoreHive GatewaySpark GatewaySpark HistoryServerHUE Server
    主节点(高可用部署的时候节点数据为3个)分配任务,不需要 Amazon EC2 实例和很高的处理能力   ✅  ✅ ✅✅  ✅ ✅✅ 
    核心节点(处理任务并将数据存储在 HDFS 中)需要处理能力和存储容量             
    任务节点(不存储数据)只需要处理能力              

    如果在YARN上运行的是flink任务的话,job manager只能运行在core节点上,不能运行在task节点,因为task节点并不会去/var/lib/flink路径下初始化flink相关组件,而task manager可以运行在task节点上

    4.EMR配置文件#

    在EMR中对配置进行了修改,比如hive-metastore.xml, hive-server2.xml,core-site.xml,对应如何配置以及需要重启的组件可以参考如下表格:https://docs.aws.amazon.com/zh_cn/emr/latest/ReleaseGuide/emr-630-release.html

    5.EMR启动步骤#

    参考:Amazon EMR实战心得浅谈

     

    如果EMR集群启动失败的话,可以去Log URI查看日志,Terminated with errors后面会告诉你是哪台实例在哪个步骤的时候报错

     

    6.EMR集群的动态伸缩#

    在创建AWS EMR集群的时候,可以选择开启cluster scaling,auto scaling有2种伸缩策略,一种是EMR-manager scaling,另一种是用户自行配置scaling策略来进行扩缩容

    注意在只有core节点和task节点是可以进行扩缩容的,master主节点在EMR集群创建后就无法进行变更

    1.EMR-manager scaling配置#

    这里需要配置的参数主要控制的是core和task节点的扩缩容实例数量,参考:Using managed scaling in Amazon EMR

    1
    2
    3
    4
    Minimum 3 (core + task 最小为3台机器)
    Maximum 15 (core + task 最大为15台机器)
    On-demand limit (非必须参数,假设Min为2台机器,max为100台机器,On-demand limit为10台,则扩容的时候会有10台机器的购买方式是按需购买,剩余的机器是竞价购买)
    Maximum Core Node (非必须参数,core 节点最多为3台)

    在使用了EMR-manager scaling之后,EMR集群的扩容主要由集群容量指标控制,比如 TaskNodesRequested,CoreNodesRequested等,``参考:了解托管扩展指标

    这里我们手动将task节点的数量从0点resizing成5个,或者可以往YARN上提交需要较大资源的任务,参考:实验9: EMR AUTO SCALING

    可以在cloud watch中的EMR相关指标中看到,TaskNodesRequested从0上升到5个

    如果实际任务不需要这么多资源,过一小段时间后就会自动缩容 

    但是实际测试下来,EMR-manager scaling有时候会出现无法扩容的问题,例如我创建了如下扩容策略的EMR集群

    这时即使在创建集群时指定了task的instance group,但是因为其中task节点的数量初始为0,所以集群创建后不会有task的instance group,之后也不能进行扩容

    然后我使用如下命令创建了一个flink session cluster

    1
    2
    /usr/lib/flink/bin/yarn-session.sh -s 1 -jm 10240 -tm 10240 --detached

    但是该flink集群缺无法正常启动,一直提示获取不到足够的资源

    在cloudwatch和EMR监控上也看不到任何扩容的请求

    所以这里推荐使用用户自行配置scaling策略

    参考:Amazon EMR Managed Scaling 介绍——自动调整集群大小,高效节约运营成本

    同时EMR托管的扩容只支持YARN应用程序,如 Spark、Hadoop、Hive、Flink;不支持不基于YARN的应用程序,例如 Presto 或 HBase。如果想要对Presto进行扩缩容,只能使用指标来自定义自动扩展,比如查询延迟,CPU使用率,内存使用率以及磁盘I/O等

    参考:https://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-scale-on-demand.html

    2.用户自行配置scaling策略#

    这里配置的扩缩容的节点是Task节点,Core节点由于有HDFS,所以不进行扩缩容

    自行编辑扩容策略,这里设置的扩容策略是当AppsPending这个指标大于等于1的时候,扩容2台机器

    扩缩容可以支持的指标有很多,如下

    指标分成3类,Cluster Status,Node Status以及IO

    含义参考:https://docs.aws.amazon.com/emr/latest/ManagementGuide/UsingEMR_ViewingMetrics.html#UsingEMR_ViewingMetrics_MetricsReported