玩转阿里云EMR三部曲-高级篇 交互式查询及统一数据源
作者:邓力,entobit技术总监,八年大数据从业经历,由一代HADOOP入坑,深耕云计算应用领域,由从事亚马逊EMR和阿里云EMR应用开发逐步转入大数据架构领域,对大数据生态及框架应用有深刻理解。
引言
笔者近几年工作以架构为主,本系列文章旨在从系统架构层面提供一定参考和帮助。
本文默认阅读文章的小伙伴们有MR/SPARK等基础,文中不再重复介绍相关知识。
本文为玩转阿里云EMR系列最终篇,第一篇文章为基础介绍和样例实战,可以查看玩转阿里云EMR三部曲-入门篇,第二篇文章为集成自有服务于EMR,可以查看玩转阿里云EMR三部曲-集成篇
多样化的数据需求
随着数据越来越多,商务和运营同学们需求更多的数据开发和维护,但是研发同学忙于产品线,没有足够的资源可以持续满足日益增多的数据开发。
宝贵的硬盘空间
之前数据结果集中存放于自有的FTP服务器,磁盘空间越来越紧张,需要不停的增加硬盘,也会受到单节点磁盘性能的影响。
不统一的数据源
不同的业务线使用了不同的数据库,有一些类日志行为使用MONGODB,事务类使用了MYSQL,还有搜索服务等,不同的数据源极大增加了开发/维护的难度
寻找解决方案
目标
- 统一数据源
- 释放单点硬盘瓶颈
- 引入交互式类SQL查询
方案选型
- 阿里云数据湖
- 基于EMR定制
- 自建加定制混合云
三种方案成熟,最终都能达到效果。不同的公司/组织架构会有差异化,以下是三种方案的侧重点
- 阿里云数据湖
完美兼容阿里云生态下的各种服务,比如OSS,阿里云MYSQL版,阿里云MONGODB版,图形化界面 - 基于EMR定制
完美兼容OSS,兼容自有MYSQL,MONGODB等,图形化界面(hue) - 混合云
自有IDC与阿里云结合
其中阿里云数据湖也可以兼容自有MYSQL/MONGODB服务等,只不过可能会因为版本不同有异常问题。
一点点建议:
- 首选阿里云数据湖
- 次选EMR定制
- 忽略成本问题可以参考混合云
团队控制成本非常严格,所以这次只能选用的是方案2-基于EMR定制
实现细节
- 创建EMR包月集群,可以参考玩转阿里云EMR三部曲-入门篇
- 等待集群创建成功,在EMR控制台界面修改HIVE参数 hive.execution.engine=tez,重启HIVE服务
-
登陆MASTER并查看HUE服务是否正常,不正常重新启动HUE进程 参考命令(默认端口为8888)
su hue /usr/lib/hue-current/build/env/bin/supervisor >/dev/null 2>&1 &
- 绑定域名至阿里云ECSIP
-
利用域名绑定ECS NGINX跳转MASTER端口开启公网HUE服务
# nginx核心部分 upstream hue { server ip:8888 max_fails=3 fail_timeout=20s; } server { listen 80; server_name HOSTNAME; location / { proxy_pass http://hue; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Scheme $scheme; proxy_set_header X-SSL-Protocol $ssl_protocol; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-HTTPS-Protocol $ssl_protocol; proxy_set_header X-Forwarded-Proto $scheme; proxy_send_timeout 300; proxy_read_timeout 300; } } 重启或者重载NGINX服务 备注: - 这里可以设置IP黑白名单 - 开启公网TEZUI可以类似设置 - 如果实在没有域名可以在EMR安全组设置打开公网端口访问,不推荐
- 登陆公网域名并访问HUE,其中域名为NGINX内配置加域名后缀,比如:hue.abcd.com。默认账号和密码可以在EMR控制台查看,这里涉及安全问题不予描述
-
进入notebook工作台页面,在IDE内可以建表并查询如下:
// 建测试表 create external table a ( c0 bigint, day string, name string, channel string ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE location 'oss://xxx:yyy@bucket.oss-cn-beijing-internal.aliyuncs.com/daily/test/' // 查询 select * from a limit 10 // 结果 2018-04-19 2018-07-04 一代倾城逐浪花 youku 2018-04-22 2018-09-02 丧尸屠城2 iqiyi 2018-08-07 2018-08-08 前任攻略 letv 2018-08-07 2018-08-08 复仇者联盟2:奥创纪元 letv 2018-04-18 2018-09-02 外八门之雪域魔窟 iqiyi
-
引入更多支持格式,统一数据源,添加JSON格式JAR包,MONGDODB驱动等等
// 引入JSON文件支持,推荐JSONX // 下载JAR包 wget "http://www.congiu.net/hive-json-serde/1.3.8/cdh5/json-serde-1.3.8-jar-with-dependencies.jar" // 拷贝至hive jar路径 cp json-serde-1.3.8-jar-with-dependencies.jar /usr/lib/hive-current/lib/ // 利用EMR控制台重启HIVE服务 // 建立json表,注意key大小写映射 CREATE EXTERNAL TABLE default.json_test (isOriginal BOOLEAN,`@timestamp` STRING,official_account STRING,down BIGINT,duration BIGINT) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' with serdeproperties ("mapping.isOriginal"="isOriginal") location 'oss://xxx:yyy@bucket.oss-cn-beijing-internal.aliyuncs.com/json/test/'
- 查看正在执行的任务可以查看链接 http://hue.abcd.com/jobbrowser/ 或者通过TEZUI页面查看
更多思考
- 包月集群任务优先级或者资源如何隔离:使用队列
- 包月集群在某个时间段负载过高如何解决: 使用EMR弹性伸缩,可以更具CPU负载或者时间设定增加/缩减节点数量
- 统计结果查询过慢如何解决:可以使用HUE打开IMPALA/PRESTO查询接口,使用新引擎接口可以更快查询
- 运营报表维度太多,每次HIVE计算过慢,IMPALA有内存限制:可以采用预计算机制,提前计算中间表,更好的方案是SparkSQL,3.22版本支持RelationalCache,除此之外还有阿里云DRUID,但更适用于通用报表统计,adhoc需求推荐使用SparkSQL实现
- 包月集群磁盘空间已满:善用OSS作为备份存储或者开启JINDOFS文件系统(强烈推荐)
- 使用OSS作为存储,请使用external建立外表,否则drop会删除OSS数据
总结
利用阿里云EMR生态定制化集群,实现数据仓库满足商业/运营的查询需求,并提供横向扩展提升性能的空间,结合多样服务达到数据交互查询及统一数据源下的最佳成本控制。
欢迎对EMR及相关技术感兴趣的同学进钉钉群一起讨论 :)