E-MapReduce钉钉群
目标
- 了解E-MapReduce创建集群流程;
- 熟悉端口转发访问集群可视化组件zeppelin;
- 完成用zeppelin分析热播数据的示例。
创建集群
集群包括一组ecs实例和运行在实例上的分布式计算框架(Hadoop,Spark等),管控程序,是运行计算任务的资源基础。下面带大家熟悉创建集群的操作步骤。
- 进入E-MapReduce管理控制台:https://emr.console.aliyun.com/#/cluster/region/cn-beijing
- 点击集群列表的华北2(北京),切换到北京region(本教程必须选择北京region)。
- 由于云实例持续热卖,已经帮大家创建好一个集群,点击查看详情可以看到集群详细信息,后面的作业操作会在这个集群上进行,
- 集群详细信息包括集群的地域信息,软件信息,网络信息,节点信息。其中master节点的外网ip信息是后面登陆要用到的,请注意。
- 点击返回集群列表回到列表页,点击右上角“创建集群”按钮,开始创建一个集群;
- 为避免影响后续操作,请在完成zeppelin培训操作后再去创建新的集群。
- 填写集群名,选择按量付费,运行日志点击关掉,设置一个登陆密码
Workshop2016
,点击下一步
- 使用默认的产品版本和配置,点击下一步
- 选择可用区A,经典网络,安全组选择一个已有安全组,节点配置设置为4核8GB,磁盘选择普通云盘,如果没有资源请选择高效云盘,设置数据盘为40GB,点击创建,集群开始创建。
用端口转发访问集群组件的zeppelin
集群创建后,有多种运行作业的方式:可以在控制台创建运行执行计划
,也可以登陆到master节点上命令行提交计算作业,还可以通过集群集成好的可视化工具来操作。zeppelin是spark的可视化操作工具,下面演示如何访问。
默认master节点的公网地址只对外开放了22端口,下面介绍如何通过ssh端口转发的方式访问zeppelin的8080端口。帮助文档:ssh登陆集群
,zeppelin使用说明
端口转发访问zeppelin
Linux/mac系统
打开一个命令行窗口,输入
ssh -N -L 8157:<masterNodeIP>:8080 root@<masterNodeIP>
- 8157是本地一个空闲端口,如已被占用请换一个未被占用的端口
- masterNodeIP是要连接的master节点公网ip
- 8080是master节点上zeppelin的端口号
- 提示输入密码,输入
Workshop2016
打开浏览器,输入http://localhost:8157/
,就可以打开远程zeppelin页面了
Windows系统的SSH方式
在Windows下有很多工具可以模拟ssh操作,例如MinGW,Putty。推荐使用git的win客户端,自带的Git Bash集成了MinGW。
- 下载git客户端
- 如果没有装过这些工具,无需担心,下面教大家临时放开端口限制的方法。
临时放开端口限制
如果windows不方便操作,可以临时放开master节点的8080端口限制,就可以浏览器直接访问了http://<masterip>:8080
。
- 访问安全组控制台
- 对集群所属的安全组点击配置规则
- 点击右上角添加安全组规则,公网,入方向,允许,TCP,8080/8080,点击确认,就可以浏览器直接访问了.
最佳实践:打通本地机器与集群master机器的ssh无密码登录
- ssh登陆master的外网地址,密码是Workshop2016。
ssh root@<masterip>
- su hadoop切换到hadoop账户
- 如果您本地已有ssh公钥私钥,可以忽略这步。否则运行ssh-keygen,一路回车,即可完成本地公私秘钥的生成
- 将您本地机器ssh公钥的(~/.ssh/id_xxx.pub,一般是rsa秘钥)文件中的内容进行拷贝,并追加到master机器hadoop账户的~/.ssh/authorized_keys文件中
以下假设使用的是rsa密钥
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
- 回到您的本地机器,尝试重新登录master机器。
ssh -i 私钥存放路径/id_rsa hadoop@masterip
如果只有一个私钥,并且放在~/.ssh/下,会默认使用这个私钥,就不需要-i 私钥存放路径/id_rsa指定了
zeppelin统计热播视频,用户属性分布
zeppelin可以可视化执行spark,hive作业,生成报表。
spark作业可以直接运行存储在oss的数据,本次培训已经预先把用户信息,视频信息,点播信息示例数据上传到oss上,下面带大家创建数据在oss上的hive表,用spark查询,并生成报表。
导入note
- 第一次使用时,点击创建新的note,可以创建一个操作笔记。
- 也可以导入json格式的note,下面使用导入的方式。下载 示例脚本到本地,
点击导入note,选择下载的文件,会用脚本信息创建好note,点击note名video进入。
创建表
- %hive表示运行hive命令,hive建表后hive和sparksql都可以使用。已提供了创建用户表的语句,只需要在输入框里填写账户信息。
%hive
CREATE EXTERNAL TABLE user_info(id int,sex int,age int, marital_status int) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION 'oss://${accessid}:${accesskey}@${bucket}.oss-cn-beijing-internal.aliyuncs.com/workshop/userinfo'
- accessid,accesskey输入框填写各自账户的acessid,accesskey
- bucketName替换为账户用户名@前面的部分加
-out
,例如train00500-out
,可以在oss控制台查看各自的bucket信息。
点击右上角“运行”,提示update count -1,表示创建成功
- 下一条%sql表示运行spark sql,spark sql运行速度比hive快。通过select语句查询有多少条
%sql
select count(*) from user_info
点击运行
- 下面两个建表语句同样填写accessid,accesskey,bucketName.
- 创建视频表
%hive
CREATE EXTERNAL TABLE video_info(id int,title string,type string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION 'oss://${accessid}:${accesskey}@${bucket}.oss-cn-beijing-internal.aliyuncs.com/workshop/videoinfo'
- 点击运行
- 查询总数
%sql
select count(*) from video_info
- 创建播放表
%hive
CREATE EXTERNAL TABLE play_video(user_id int,video_id int, play_time bigint) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION 'oss://${accessid}:${accesskey}@${bucket}.oss-cn-beijing-internal.aliyuncs.com/workshop/playvideo'
- 点击运行
- 查询总数
%sql
select count(*) from play_video
电视剧,电影等类别一周的总播放次数
统计个类别栏目的播放总数,了解现在那些类别访问量高。
%sql
select video.type, count(video.type) as count from play_video play join video_info video on (play.video_id = video.id) group by video.type order by count desc
点击运行,结果生成后点击饼图图标,查看各类别播放饼图,鼠标移到饼图上可以看到数据细节
播放Top10视频的名称,类别,点击次数
统计最热播的topn视频的信息
%sql
select video.id, video.title, video.type, video_count.count from (select video_id, count(video_id) as count from play_video group by video_id order by count desc limit ${lmt=10}) video_count join video_info video on (video_count.video_id = video.id) order by count desc
- 可以设置lmt的数值查看前top lmt的视频播放信息,默认10
- 点击运行,结果生成后点击柱状图图标,点击settings,拖拽字段到框里,设置key为title,id,group为type,values为count。
Top1视频的性别比例,年龄分布,婚否比例
统计指定热播剧的用户信息分布
%sql
select ${group=age} , count(*) as count from (select distinct(user_id) from play_video where video_id =${id=49} ) play join user_info userinfo on (play.user_id = userinfo.id) group by userinfo.${group=age}
- group填写用户分组的列,age,sex(性别),marital_status,默认age.id填写要查看的视频id,默认49。
一个报表内统计热播视频观看用户的性别,年龄段,婚姻状态分布
%sql
select if(sex=0,'女','男') as title, count(*) as count, '性别' as type from (select distinct(user_id) from play_video where video_id =${id=49} ) play join user_info userinfo on (play.user_id = userinfo.id) group by userinfo.sex
union all
select case when userinfo.age<15 then '小于15' when age<25 then '15-25' when age<35 then '25-35' else '大于35' end , count(*) as count, '年龄段' as type from (select distinct(user_id) from play_video where video_id =${id=49} ) play join user_info userinfo on (play.user_id = userinfo.id) group by case when userinfo.age<15 then '小于15' when age<25 then '15-25' when age<35 then '25-35' else '大于35' end
union all
select if(marital_status=0,'未婚','已婚') as title, count(*) as count, '婚否' as type from (select distinct(user_id) from play_video where video_id =${id=49} ) play join user_info userinfo on (play.user_id = userinfo.id) group by marital_status
- 输入框填写视频id
- 点击运行,结果生成后点击柱状图图标,点击settings,拖拽字段到框里,设置key为title,group为type,values为count。