亚马逊AWS官方博客

巧用Amazon EMR节省数据分析成本

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之前,从事电信核心网系统上云的方案设计及标准化推广。