Amazon EMR 是云上的数据分析平台,通过 Amazon EMR 的图形化或命令行接口,用户可以快速搭建和部署基于 Amazon EC2 实例的数据分析系统,并能动态扩展集群。Amazon EMR 也可以读写其他 AWS 数据存储服务,例如 Amazon S3 和 Amazon DynamoDB。
最新版本的 Amazon EMR 涵盖的服务包括:Hadoop、Zeppelin、Tez、Ganglia、HBase、Pig、Hive、Presto、ZooKeeper、Sqoop、Mahout、Hue、Phoenix、Oozie、Spark、Flink、Hcatalog。利用以上 Amazon EMR 包含的众多服务,用户能够实现日志文件分析、流式数据分析、机器学习、工作流管理等任务。本文就用户最常用的日志文件分析任务,巧用 Amazon EMR 以节省数据分析成本。
三个关键点
第一,使用 Amazon S3 存储待分析数据。使用 Amazon S3 存储数据主要有以下几方面优势。
节约成本:相比使用 HDFS 集群,Amazon S3 是单纯的存储服务,用户在存储数据文件的时候,只需要为使用的存储容量付费,无需为服务器及硬盘付费,而用机器搭建 HDFS 集群,这部分投入是必须的。
数据持久性高:旨在提供 99.999999999%的数据持久性,最大化地降低了数据丢失的可能。
计算和存储分离:使用 Amazon S3 存储数据,实际上是实现了计算和存储的分离,这一点很关键,它使得 Amazon EMR 集群能够随时扩容、缩容、删除,降低了数据丢失的可能。
无需修改程序代码:与 HDFS 存储相比,用户并不需要修改程序的代码。以 Hive 建表语句为例,只需要将 Location 的位置改为 Amazon S3 的目录即可,即 LOCATION‘s3://sampledata/userrecord/’
第二,定时运行 Amazon EMR 集群。
日志文件分析这种批量数据处理的任务,并不是每时每刻都需要运行任务,可以每天定时运行 Amazon EMR 集群进行分析,分析完成后再将集群删除。与用户自己搭建数据分析集群相比,Amazon EMR 让集群的创建非常容易,只需要一条命令即可搭建所需集群,这也让随时删除、随时创建集群具备可行性,如果没有 Amazon EMR,相信用户不会将自己辛苦搭建起来的集群随便地删除。
定时运行集群与云计算的按需计费模式相结合,带来的最大优势就是节省成本。如果某个任务只需要 1 个小时就能得出分析结果,那么,与全天候运行的集群相比,定时运行的集群所节约的成本是非常可观的。
第三,利用外部存储。
元数据:本文所提供的方案中使用的是 Hive 表结构数据,将其存储在外部的数据库中是因为 Amazon EMR 集群是定时运行的,因此,其元数据不要存储在本地,否则 Amazon EMR 集群关闭后,元数据也将被删除。
计算结果:Amazon EMR 定时运行产生的结果需要存储在外部,如 Amazon S3 中,或者存储在数据库中。
系统的架构
图 1 为一个典型架构,这里主要使用了 Amazon EMR 中的 Hive、Presto 及 Sqoop 服务,并利用 Amazon RDS MySQL 存储 Hive 元数据和查询结果数据。
在此架构中,Hive 用来创建表,并维护表结构元数据,这些元数据被存储在 Amazon RDS MySQL 中。Presto 用来执行查询,Presto 利用 Hive 已经定义的表结构。Sqoop 用来将 Presto 产生的结果数据转存到 Amazon RDS 的 MySQL 中。
以上这些步骤需要按照顺序在 Amazon EMR 每次启动的时候执行,实现这个顺序执行的功能,需要用到 Amazon EMR 的 Step。在每一个 Step 中,用户可以自定义需要运行的任务,例如以上提到的 Hive 任务、Presto 查询、数据转存等都可以放在 Step 中运行。
用户可以创建 Amazon EMR 集群,以及 Amazon EMR 集群创建成功后需要执行的 Step,在一条 AWS 命令中事先写好,例如下面是一条简化过的命令,它创建了一个名为 Loganaly 的 Amazon EMR 集群,包含了 Hive、Presto 和 Sqoop 服务。Auto-terminate 参数说明这个集群中所有的 Step 执行完成后,集群自动被删除。Configuration 参数的内容指定了存储 Hive 元数据的数据库信息,例如 IP、用户名等。Steps 参数定义了所需要执行的任务。而在 Instance-groups 中定义了集群中机器的数量和配置。
aws--region cn-north-1 emr create-cluster --name "loganaly" --release-label emr-5.0.0 \
--applications Name=Hive Name=Presto Name=Sqoop \
--auto-terminate \
--configurations s://bucketname/cfgfile \
--steps \
Type=Hive,Name="HiveStep",Args=[……] \
Type=CUSTOM_JAR,Name="Presto2s3",Jar=$CODEDIR/script-runner.jar,Args=[……] \
Type=CUSTOM_JAR,Name="s3tomysql",Jar=$CODEDIR/script-runner.jar,Args=[……] \
--instance-groups \
Name=Master,InstanceGroupType=MASTER,InstanceType=m3.xlarge,InstanceCount=1 \
Name=Core,InstanceGroupType=CORE,InstanceType=r3.xlarge,InstanceCount=2 \
Name=Task,InstanceGroupType=TASK,InstanceType=r3.xlarge,InstanceCount=3
最后,用户需要让这个命令定时执行,那么,可以把这个命令放在/bin/bash 脚本中,然后利用 Linux crontab 实现定期执行。或者利用 Windows 的定时任务实现定期执行。如果是在国外 AWS 区域,还可以利用竞价实例进一步节省成本。方法也很简单,仅需在 Instance-group 的参数中增加竞价的美元数即可。
--instance-groups \
Name=Master,InstanceGroupType=MASTER,InstanceType=m3.xlarge,BidPrice=0.2, InstanceCount=1 \
Name=Core,InstanceGroupType=CORE,InstanceType=r3.xlarge, BidPrice=0.2,InstanceCount=2 \
Name=Task,InstanceGroupType=TASK,InstanceType=r3.xlarge, BidPrice=0.2,InstanceCount=3
使用国外 AWS 区域的某个客户利用该方法分析每天产生的 CDN 日志,采用竞价实例的情况下,每天用于数据分析的投入不足 1 美元。
本文介绍的内容使用了 Hive 和 Presto,实际上 Amazon EMR 中的 Spark、Tez 等服务都可以实现类似的功能,同样可以利用 Amazon EMR 的灵活创建和删除,以及使用 Amazon S3 作为存储的特性。
表 1 中列出了这些主要用到的数据分析型服务现在的特征,供读者参考选用。需要注意的是,随着社区产品的升级,这些特征并不是一成不变的,需要用户关注这些产品的变化,做出正确的选择。
针对本文中描述的方案,以下 blog 中有更详细的操作方法和代码,感兴趣的用户可参考:
https://aws.amazon.com/cn/blogs/china/amazon-emr/
作者介绍
韩小勇,AWS 解决方案架构师,负责基于 AWS 的云计算方案架构咨询和设计,实施和推广,在加入 AWS 之前,从事电信核心网系统上云的方案设计及标准化推广。
本文转载自 AWS 技术博客。
原文链接:
https://amazonaws-china.com/cn/blogs/china/emr-reduce-cost/
评论