“榨干”EMR开销!AWS EMR在搭建大数据平台ETL的应用实践

原标题:“榨干”EMR开销!AWSEMR在搭建大数据平台ETL的应用实践
作者|彭康
策划|蔡芳芳
AWSElasticMapReduce(EMR)是Amazon提供的托管集群平台 , 用户可以非常方便的使用EMR搭建起一套集群 , 用来支撑大数据框架的应用 , 如ApacheSpark、Hive、Flink、Presto等等 。 因为EMR具有很好的可配置性和伸缩性 , 使用者可以灵活的根据自己的需求进行定制 , 在满足生产需求的同时 , 减低对基础设施的运维成本 。
FreeWheel大数据团队在搭建数据仓库的过程中 , 在EMR的使用上积累了大量的实践和运维经验 , 本文将从EMR实践的角度出发 , 讲述FreeWheelTransformer团队在搭建ETLpipeline的过程中是如何玩转EMR的 , 以期抛砖引玉 。
1一个典型的SparkonEMR上集群架构概览
我们先来了解一下一个典型的AWSEMR集群是什么样子的 。 EMR默认使用了Yarn来管理集群资源 。 EMR将node分为了Master , Core和Worker三个组(通过Yarnlabel实现) 。

“榨干”EMR开销!AWS EMR在搭建大数据平台ETL的应用实践
文章图片
主节点(Masternode)
EMR的Masternode用来管理整个集群 , 集群至少要有一个Masternode(从EMR-5.23开始 , 如果需要MasternodeHA , 可以选择实例计数为3 , 此时根据不同的应用 , 会有不同的HA方案) 。
以运行HadoopHDFS和Yarn为例 , Master上会运行YarnResourceManger和HDFSNameNode 。 在高可用方案下 , YarnResourceManager会在所有三个主节点上运行 , 并采用Active/Standby模式进行工作 。 如果ResourceManager的主节点发生故障 , EMR将启动自动故障转移过程 , 具有StandbyResourceManager的Masternode将接管所有操作 , 可以通过yarnrmadmin-getAllServiceState来获取当前服务状态 。 关于YarnResourceMangerHA的具体细节 , 可以参考ResourceManagerHA 。
与ResourceManager类似 , NodeManager会在三个主节点中的两个节点上运行 , 分别处于Active和Standby状态 。 如果ActiveNameNode的主节点发生故障 , EMR会将启动HDFS故障转移过程 。 此时Standby状态的NameNode将变为Active并接管集群中的所有对HDFS的操作 。 我们可以通过hdfshaadmin-getAllServiceState命令来获取当前NameNode状态 。 关于HDFSHA的具体细节 , 可以参考HDFSHA 。
核心节点(Corenode)
Corenode为可选组 , 其上运行了HDFSDataNode 。 当Corenode个数少于4时 , EMR默认会将HDFS的replica设置为1 , Corenode少于10个时replica为2 , 其余情况为3 。 如果需要进行自定义设置 , 可以修改启动EMR对hdfs-site.xml中dfs.replication的配置;这里要注意一点 , 如果我们在一个已经启动的EMR中 , 在对Corenode进行伸缩的时候 , 会影响到HDFS数据的re-balance , 这是一个耗时的操作 , 不建议频繁做Corenode的scaling 。 而且对于replica是3的集群 , 如果将corenode的个数缩减为少于3个的话 , 也将无法成功 。
工作节点(Workernode)
Workernode为普通的工作节点 。 非常适合作为单纯的工作节点应对工作负载需要频繁伸缩的场景 , 其上运行了NodeManager , 在其启动之后 , 会加入到Yarn的集群管理之中 。 对于需要频繁scale的场景 , 仅仅scaleWorkernode是一个比较实际的方案 , 效率比较高 。
任务队列(InstanceFleet)
Corenode和Workernode都可以配置实例队列 , 实例队列是一个非常实用的功能 , 尤其是在Spot实例的场景 , 在一些热门事件发生时 , 一些热门机型的中断率会变得很高 , 如果选择单一类型实例的话 , 很容易出现无法满足需求 , 我们可以在spotadvisor上查看当前的实例中断情况 。 后面章节我会详细描述我们是如何使用实例队列的 。
EMR版本
在创建EMR时 , 需要额外注意EMR的release版本 , 不同版本支持的应用版本也不同 。 从EMR-6.1.0版本起 , 已经开始支持Spark3.0.0+Hadoop3.2.1的组合了 , 目前最新的EMR-6.2.0版本 , 已经可以支持稳定版本的Spark3.0.1了 。 如果需要运行Spark2.x版本 , 可以选择EMR-5.x版本或者EMR-6.0.0 。
除应用版本区别 , 从EMR-6.0.0起 , 系统基于AmazonLinux2和CorrettoJDK8构建 , 相对于以往的AmazonLinux1最大的区别是提供了新的系统工具 , 如Systemctl , 以及优化的AmazonlinuxLTS内核 。 另外AmazonCorrettoJDK8提供经过JavaSE认证的兼容JDK , 包括长期支持、性能增强和安全修复程序 。 关于emr-6.x的releasenote , 可以参考EMRreleasenote 。
另外 , AWS最新已经支持EMRonEKS , 我们可以更灵活的将EMR创建在EKS中 , 以期更灵活使用和更低的费用 , 目前这一块我们团队正在调研和adoption , 我会在和后续的文章中专门来聊这一块 。
2EMR在FreeWheel批处理ETLpipeline中的实践