华为云大数据分析7天训练营(七)使用DGC实现每日动态发布电影排行榜
根据《使用DGC实现每日动态发布电影排行榜》操作指导内容完成项目实践;
操作类作业若未领取到免费资源或未领取到代金券请勿操作,创建服务作业或实例的区域需与领取套餐区域保持一致;
建议操作时间1-2小时,结束后立即删除有关服务实例、作业、资源,避免扣费!!!
如:
a.删除OBS相关资源;
b.删除DLI作业与队列、数据库资源;
c.删除消息通知服务;
d.删除DGC作业与脚本资源等;
本实践通过数据开发和数据湖探索(DLI)服务对电影评分原始数据进行分析,输出评分最高和最活跃Top20电影。用户可以学习到数据开发模块脚本编辑、作业编辑、作业调度等功能,以及DLI的SQL基本语法。
操作流程如下:
- 准备工作,包括环境准备、数据源准备、数据湖准备和认证数据准备。
- 创建数据迁移作业,OBS数据迁移到DLI。
- 创建DLI SQL脚本,用于计算评分最高的Top20电影和最活跃的Top20电影。
- 开发并调度作业,通过编排作业和配置作业调度策略,定期执行迁移作业和DLI SQL脚本,使得用户可以每天获取到最新的Top20电影结果。
环境准备:
- 已开通DGC实例,并已具备CDM集群。
- 已开通对象存储服务(OBS),区域和DGC实例相同。
- 已开通数据湖探索服务(DLI),区域和DGC实例相同。
数据源准备:
在OBS中新建OBS桶“dgc-dli”,将movies.csv、ratings.csv两个原始数据上传至桶中,后续通过数据集成模块将数据集成到DLI中进行处理。
原始数据说明如下:
服务列表找到存储obs
打开obs 在obs中新建dgc-dli桶
确定新建信息后点击确认进行创建
等待创建成功
创建成功后将movies.csv、ratings.csv两个原始数据上传至桶中
数据湖准备:
在本示例中,选择数据湖探索(DLI)服务作为数据湖。
首先您需要在DLI中新建SQL队列。在数据迁移作业中需要用到DLI队列,而DLI的default队列无法在迁移作业中使用。
其次您需要准备数据库,后续的数据集成与开发操作均针对数据库和数据表进行。您可以通过DLF或DLI的编辑器执行SQL来创建数据表,本文以使用DLF编辑器为例。
操作步骤如下:
步骤1 进入DGC数据开发主页面,选择“连接管理 -> 新建数据连接”。
步骤2 创建一个到DLI的连接,数据连接名称为“dli”。
步骤3 在DLI连接上右键单击,创建一个数据库用于存放数据表,数据库名称为“movies”。
步骤4 创建一个DLI SQL脚本,通过SQL语句来创建数据表。
其中,movies_item、rating_item为OBS迁移到DLI的表,两张表用于存放原始数据。top_rating_movie、top_active_movie为DLI表,两张表用于存放分析结果。
在脚本开发页面下,新建DLI SQL脚本create_dli_table。输入参数与SQL语句后,点击“保存并提交版本”,最后运行脚本。
关键参数说明:
● 数据连接:步骤2中创建的DLI数据连接。
● 数据库:步骤3中创建的数据库。
● 资源队列:使用DLI提供的默认资源队列“default”。
● SQL语句:如下所示。
DROP TABLE IF EXISTS `movies_item`;
DROP TABLE IF EXISTS `ratings_item`;
DROP TABLE IF EXISTS `top_rating_movie`;
DROP TABLE IF EXISTS `top_active_movie`;
CREATE TABLE IF NOT EXISTS movies_item(
`movieId` INT COMMENT '',
`movieTitle` STRING COMMENT '',
`videoReleaseDate` STRING COMMENT '',
`IMDbURL` STRING COMMENT '',
`unknown` INT COMMENT '',
`Action` INT COMMENT '',
`Adventure` INT COMMENT '',
`Animation` INT COMMENT '',
`Childrens` INT COMMENT '',
`Comedy` INT COMMENT '',
`Crime` INT COMMENT '',
`Documentary` INT COMMENT '',
`Drama` INT COMMENT '',
`Fantasy` INT COMMENT '',
`Film-Noir` INT COMMENT '',
`Horror` INT COMMENT '',
`Musical` INT COMMENT '',
`Mystery` INT COMMENT '',
`Romance` INT COMMENT '',
`Sci-Fi` INT COMMENT '',
`Thriller` INT COMMENT '',
`War` INT COMMENT '',
`Western` INT COMMENT ''
);
CREATE TABLE IF NOT EXISTS ratings_item(
`userId` INT COMMENT '',
`movieId` STRING COMMENT '',
`rating` INT COMMENT '',
`timestamp` STRING COMMENT ''
);
CREATE TABLE IF NOT EXISTS top_rating_movie(
`movieTitle` STRING COMMENT '',
`avg_rating` float COMMENT '',
`rating_user_number` int COMMENT ''
);
CREATE TABLE IF NOT EXISTS top_active_movie(
`movieTitle` STRING COMMENT '',
`avg_rating` float COMMENT '',
`rating_user_number` int COMMENT ''
);
认证数据准备:
创建访问密钥(AK和SK)。
- Access Key Id(AK):访问密钥ID。与私有访问密钥关联的唯一标识符;访问密钥ID和私有访问密钥一起使用,对请求进行加密签名。
- Secret Access Key(SK):与访问密钥ID结合使用的密钥,对请求进行加密签名,可标识发送方,并防止请求被修改。
在创建访问密钥前,请确保登录控制台的帐号已通过实名认证。创建访问密钥(AK和SK)操作步骤如下:
- 登录华为云控制台,鼠标移动至右上角用户名,在弹出菜单中单击“我的凭证”。
- 在左侧导航树单击“访问密钥”。在访问密钥列表中,可以查看已有的访问密钥ID(即Access Key ID),但是,Secret Access Key只有在新增访问密钥时所下载的密钥文件中才可以获取到。
- 单击“新增访问密钥”,然后单击“确定”保存密钥文件。每个用户最多可创建两个有效的访问密钥,如果当前已存在2个访问密钥,只能先删除现有的访问密钥,然后再重新创建。
4.打开下载下来的“credentials.csv”文件即可获取到访问密钥(Access Key ID和Secret Access Key)。
OBS数据迁移到DLI
- 进入DGC数据集成主页面,选择“作业管理”。
2.新建CDM到OBS的连接,数据连接名称为“obs_link”。
名称 |
连接的名称,根据连接的数据源类型,用户可自定义便于记忆、区分的连接名。 |
obs_link |
OBS终端节点 |
Endpoint可从终端节点及区域说明获取。 这里支持用户输入桶级别的域名,则在查询OBS桶的时候,只能查询到这个桶。 |
obs.cn-north-1.myhuaweicloud.com |
端口 |
数据传输协议端口,https是443,http是80。 |
443 |
OBS桶类型 |
用户下拉选择即可。 |
- |
访问标识(AK) |
登录OBS服务器的访问标识。 您需要先创建当前账号的访问密钥,并获得对应的AK和SK。 具体操作请参见(可选)获取认证信息进行创建。 |
- |
密钥(SK) |
登录OBS服务器的密钥。 您需要先创建当前账号的访问密钥,并获得对应的AK和SK。 具体操作请参见(可选)获取认证信息进行创建。 |
- |
3.新建CDM到DLI的连接,数据连接名称为“dli_link”。
参数名 |
说明 |
取值样例 |
---|---|---|
名称 |
连接的名称,根据连接的数据源类型,用户可自定义便于记忆、区分的连接名。 |
dli_link |
访问标识(AK) |
访问DLI数据库时鉴权所需的AK。 您需要先创建当前账号的访问密钥,并获得对应的AK和SK。如果尚未创建创建访问密钥,请参见(可选)获取认证信息进行创建。 |
- |
密钥(SK) |
访问DLI数据库时鉴权所需的SK。关于如何获取SK,请参见参数“访问标识(AK)”的描述。 |
- |
项目ID |
DLI服务所在区域的项目ID。 |
- |
4.CDM到OBS和DLI的连接创建成功后,单击“表/文件迁移”,再单击“新建作业”。
5.按照如下步骤完成作业参数的配置。
- 1.配置作业名为movies_obs2dli,配置源端作业参数,然后配置目的端作业参数
- 2.在源端作业配置区域,单击“显示高级属性”,在“高级属性”中,系统提供了默认值,请根据实际业务数据的格式设置各项参数。
- 字段分隔符:默认值为逗号,本示例需要保留默认值。
- 使用包围符:由于IMDbURL有的原始数据中包含“,”,需要修改默认值为“是”。
- 首行为标题行:默认值为“否”,本示例首行是标题行,修改默认值为“是”。
- 编码类型:默认值为UTF-8,本示例保留默认值即可。
- 3.单击“下一步”后,请参考以下说明配置字段映射,所示,配置完成后,单击“下一步”。
字段映射:在本示例中,由于数据迁移的目标表字段顺序和原始数据的字段顺序是一样的,因此这里不需要调整字段映射的顺序。
如果目标表字段顺序和原始数据不一致,请一一将源字段指向含义相同的目的字段。请将鼠标移至某一个字段的箭头起点,当光标显示为“+”的形状时,按住鼠标,将箭头指向相同含义的目的字段,然后松开鼠标。
- 4.根据需要配置任务的重试和定时执行。在本示例中保持默认即可。
- 5.单击“显示高级属性”,可配置“抽取并发数”以及“是否写入脏数据”,所示。
- 抽取并发数:您可以根据业务量进行配置。数据源端如果是文件类型,当有多个文件时,增大并发数可以提升抽取速率。
- 是否写入脏数据:建议配置为“是”,然后参考配置相关参数。脏数据是指与目的端字段不匹的数据,该数据可以被记录到指定的OBS桶中。用户配置脏数据归档后,正常数据可以写入目的端,迁移作业不会因脏数据中断。在本示例中,“OBS桶”配置为在数据源准备中创建的桶“dgc-dli”,您需要前往OBS控制台,在桶中创建一个目录,例如err_data,然后再将中的“脏数据目录”配置为该目录。
- 6.单击“保存并运行”完成作业的创建。返回“表/文件迁移”页面后,可在作业列表中查看到新建的作业。
- 7.再新建名为ratings_obs2dli的迁移作业,将ratings.csv数据迁移到DLI的ratings_item表中。待作业运行成功后,数据迁移结束。
开发DLI SQL脚本
- 创建DLI SQL脚本top_rating_movie,用于存放评分最高的Top20电影。
评分最高Top20电影的计算方法是:先计算出每部电影的总评分和参与评分的用户数,过滤掉参与评分的用户数小于100的记录,返回电影名称、平均评分和参与评分用户数。
在数据开发-脚本开发页面下,新建DLI SQL脚本top_rating_movie。从movies_item和ratings_item表中计算出评分最高的Top20电影,将结果存放到top_rating_movie表。
输入参数与SQL语句后,点击“保存并提交版本”,最后运行脚本。
关键参数说明:
insert overwrite table top_rating_movie
select
a.movieTitle,
b.ratings / b.rating_user_number as avg_rating,
b.rating_user_number
from
movies_item a,
(
select
movieId,
sum(rating) ratings,
count(1) as rating_user_number
from
ratings_item
group by
movieId
) b
where
rating_user_number > 100
and a.movieId = b.movieId
order by
avg_rating desc
limit
20
2.创建DLI SQL脚本top_active_movie,用于存放最活跃的Top20电影。
最活跃Top20电影的计算方法是:平均评分大于3.5中用户评分数最多的20部电影。
输入参数与SQL语句后,点击“保存并提交版本”,最后运行脚本(该脚本由于数据较多,运行时间稍长)。
关键参数说明:
insert overwrite table top_active_movie
select * from
(
select
a.movieTitle,
b.ratingSum / b.rating_user_number as avg_rating,
b.rating_user_number
from
movies_item a,
(
select
movieId,
sum(rating) ratingSum,
count(1) as rating_user_number
from
ratings_item
group by
movieId
) b
where
a.movieId = b.movieId
) t
where
t.avg_rating > 3.5
order by
rating_user_number desc
limit
20
开发并调度作业
假设“movie”和“rating”csv表是每天变动的,我们希望每天更新Top20电影,那么这里可以使用DLF作业编排和作业调度功能。
- 在数据开发-作业开发页面下,新建批处理作业,名称为“topmovie”。
2.在作业开发页面,拖动两个CDM Job节点、两个Dummy节点和两个DLI SQL节点到画布中,选中连线图标并拖动
关键说明:
- movies_obs2dli(CDM Job节点):在节点属性中,关联CDM作业“movies_obs2dli”。
- ratings_obs2dli(CDM Job节点):在节点属性中,关联CDM作业“ratings_obs2dli”。
- 等待(Dummy节点):不执行任何操作,作为等待CDM作业结束的标识。
- top_rating_movie(DLI SQL节点):在节点属性中,关联DLI SQL脚本“top_rating_movie”。
- top_active_movie(DLI SQL节点):在节点属性中,关联DLI SQL脚本“top_active_movie”。
- 结束(Dummy节点):不执行任何操作,作为作业结束的标识。
4.如果作业运行正常,单击画布空白处,在右侧的“调度配置”页面,配置作业的调度策略。
说明:
- 2021/07/24至2021/07/31,每天0点30分执行一次作业。
- 跨周期依赖为不依赖,即上一次运行失败不影响下一次调度。
5.最后保存并提交版本(单击),执行调度作业(单击)。实现作业每天自动运行,Top20电影的结果自动保存到“top_active_movie”和“top_rating_movie”表。
6.您如果需要及时了解作业的执行结果是成功还是失败,可以通过数据开发的运维调度界面进行查看。数据开发还支持配置通知管理,可以选择配置当作业运行异常/失败后,进行短信、邮件、控制台等多种方式提醒,此处不再展开描述。介绍如何进入监控界面查看执行结果。
作业完成
a.删除OBS相关资源;
b.删除DLI作业与队列、数据库资源;
c.删除消息通知服务;
d.删除DGC作业与脚本资源等;
- 点赞
- 收藏
- 关注作者
评论(0)