写点什么

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

2019 年 11 月 18 日

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


本文转载自 AWS 技术博客。


原文链接:


https://amazonaws-china.com/cn/blogs/china/emr-reduce-cost/


2019 年 11 月 18 日 08:00320

欲了解 AWS 的更多信息,请访问【AWS 技术专区】

评论

发布
暂无评论
发现更多内容

架构师训练营 - 大作业1

阿甘

架构大作业二

Geek_michael

极客大学架构师训练营

重磅盘点!2020年区块链行业十件大事

CECBC区块链专委会

区块链

架构师训练营 1 期第 10 周:模块分解 - 作业

灵霄

极客大学架构师训练营

架构师训练营 1 期第 11 周:安全稳定 - 作业

灵霄

极客大学架构师训练营

面试官:Android事件分发机制及设计思路,跳槽薪资翻倍

欢喜学安卓

android 程序员 面试 移动开发

突破2.8万美元关口,比特币为何“疯涨”? ​

CECBC区块链专委会

比特币 比特币数字货币

自研ARM芯片,亲手拆掉Wintel联盟,微软这次是认真的吗?

脑极体

专家:区块链底层技术创新是关键

CECBC区块链专委会

区块链

架构师训练营第五周”技术选型一“总结

随秋

极客大学架构师训练营

像用户一样测试:不妨犯傻

QualityFocus

软件测试 体验 可用性 用户体验

【Java并发编程】面试必备之线程池

java金融

线程池

LeetCode题解:剑指 Offer 40. 最小的k个数,快速排序,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

扫地阿姨看完都学会了!万字长文总结Android多进程,满满干货指导

欢喜学安卓

android 程序员 面试 移动开发

甲方日常 76

句子

工作 随笔杂谈 日常

重学JS | 找出数组中出现次数最多元素的4种算法

梁龙先森

前端 编程语言

工具词典:Inner Peace

lidaobing

随机漫步的傻瓜 28天写作

如何给团队制定合理的季度绩效?

Alan

团队管理 绩效 七日更 28天写作

面试官:我问的是Java内存模型,你回答堆栈方法区干嘛?

Java鱼仔

Java 程序员 JMM 多线程 并发

为移动应用产业开辟出海新航路,华为应用市场是如何“破冰”的?

脑极体

架构师训练营 1 期第 8 周:性能优化(二)- 作业

灵霄

极客大学架构师训练营

【Java并发编程】阿里最喜欢问的几道线程池的面试题?

java金融

Java 面试题 线程池

手把手教你写!2021年Android工作或更难找,最全的BAT大厂面试题整理

欢喜学安卓

android 程序员 面试 移动开发

架构师训练营 1 期第 9 周:性能优化(三)

灵霄

极客大学架构师训练营

JAVA并发编程原理与实战

Geek_53983e

原理 java 并发 实战

与前端训练营的日子 --Week09

SamGo

学习

冰河又一MySQL力作出版(文末送书)!!

冰河

MySQL 高可用 高并发 高性能 MySQL架构

架构师训练营 - 大作业 2

阿甘

架构师训练营第五周”技术选型一“作业

随秋

极客大学架构师训练营

重学JS | 数组去重的7种算法

梁龙先森

前端 编程语言

架构师训练营 1 期第 12 周:数据应用(一) - 作业

灵霄

极客大学架构师训练营

2021年全国大学生计算机系统能力大赛操作系统设计赛 技术报告会

2021年全国大学生计算机系统能力大赛操作系统设计赛 技术报告会

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