本篇主要是楼主工作的一些心得和总结,更完整的介绍和使用还需要参考阿里云官方文档。另开发者们可以申请DataWorks开发者版本免费体验。
- DataWorks
DataWorks是一个一站式大数据工场,助力开发者快速完成数据集成、开发、治理、服务、质量和安全等全套数据研发工作。其基于MaxCompute作为核心的计算、存储引擎,为开发者提供海量数据的离线加工分析、数据挖掘等功能。 - MaxCompute
原名ODPS,是一种快速、完全托管的EB级数据仓库解决方案,也就是大数据计算服务。
再通俗一点可以把MaxCompute理解为一个集存储和计算于一身的数据仓库。
MaxCompute支持的计算模型
MaxCompute支持多种计算模型,有SQL【Odps SQL】、MapReduce【Odps MR】、UDF(Java/Python)、Graph、基于DAG的处理、交互式、内存计算、机器学习等。
- -SQL
MaxCompute以表的形式存储数据,支持多种数据类型,并对外提供SQL查询功能。您可以将MaxCompute作为传统的数据库软件操作,但其却能处理TB、PB级别的海量数据。
- -MapReduce
MaxCompute MapReduce是MaxCompute提供的Java MapReduce编程模型,它可以简化开发流程,更为高效。您若使用MaxCompute MapReduce,需要对分布式计算概念有基本了解,并有相对应的编程经验。MaxCompute MapReduce为您提供Java编程接口。
使用心得
这里再着重分享一下楼主了解和使用这两种计算模型之后的心得,首先SQL型完全兼容Hive语法,和标准的SQL差别不大,容器上手,学习门槛低,MR型则需要对Map Reduce有一定基础,毕竟是要根据阿里云提供的SDK写Java程序,然后打包上传到Data Works的资源上,所以从操作上来说有点繁琐,最明显的是没有SQL型直观。尤其是排错的时候需要不断改代码发包【资源】,而反观SQL型只要运行后不符合预期直接改再运行就完事了。所以综合对比,SQL型无疑将会更受欢迎,毕竟MR型比SQL型的推出的早,后期的总是弥补了前者的不足之处。
如下以一个需求案例的方式从0到1来展示一个DataWorks的完整工作流程【只是DataWorks的一种应用】。
需求:将一台数据库服务中的【student表】数据导入到DataWorks中进行离线计算,然后将计算后的数据再导入到提供Mysql服务的库中的【lunch_log表】中
创建工作空间
登录Data Works控制台,创建一个工作空间
数据集成
数据集成UI界面
数据集成模块支持多种数据源,数据源信息填写完毕之后,就可以在数据开发模块写数据同步任务了。
新增一个MySQL的数据源
JDBC URL格式
jdbc:mysql://ServerIP:Port/Database
添加完毕
在MySQL数据库内创建如下表备用,稍后将此表的数据通过写数据同步任务从MySQL中导入到MaxCompute中。
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`command` varchar(30) NOT NULL,
`spend` double(11,0) DEFAULT NULL,
`stu_id` varchar(32) DEFAULT NULL,
`name` varchar(100) DEFAULT NULL,
`log_date` datetime DEFAULT NULL,
`cmd_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
数据开发
数据开发UI界面
可以从左侧的数据开发类型中看到上边列出的计算模型类型等
表管理
就是离线计算的源数据和计算后的数据存储的地方,就是个数据仓库,类似于MySQL或者Hive仓库,可以在这里创建很多表。
创建如下表【创建的是一个分区表,分区字段是partitioned_date,格式是yyyymmdd】
CREATE TABLE `student` (
`id` string COMMENT '主键id',
`stu_id` string COMMENT '学号',
`command` string COMMENT '早餐,午餐,晚餐',
`spend` double COMMENT '花销',
`name` string COMMENT '姓名',
`log_date` datetime COMMENT '日期',
`cmd_time` timestamp COMMENT '吃饭时间'
)
PARTITIONED BY (partitioned_date string COMMENT '分区字段');
提交表到生产环境即可
编写数据同步任务
需要将MaxCompute的ODPS数据源也添加到数据集成中。
编写同步任务
开始编写从Mysql到MaxCompute的数据同步任务,同步student表的数据。
字段映射如下
注意:此处的映射一定要留意,默认的映射有可能是不对的!!!【博主在这里没少踩坑】
因无工作流,无父节点,所以在调度任务中父节点选中项目根目录即可
先在Mysql数据库中造一些数据
INSERT INTO `dataworks`.`student` (`id`, `command`, `spend`, `stu_id`, `name`, `log_date`, `cmd_time`) VALUES ('1', '早餐', '9', '1001', '山治', '2019-11-03 21:16:02', '2019-11-03 13:18:11');
INSERT INTO `dataworks`.`student` (`id`, `command`, `spend`, `stu_id`, `name`, `log_date`, `cmd_time`) VALUES ('2', '午餐', '12', '1001', '山治', '2019-11-03 21:16:44', '2019-11-03 13:18:13');
INSERT INTO `dataworks`.`student` (`id`, `command`, `spend`, `stu_id`, `name`, `log_date`, `cmd_time`) VALUES ('3', '晚餐', '18', '1001', '山治', '2019-11-03 21:17:08', '2019-11-03 13:18:14');
INSERT INTO `dataworks`.`student` (`id`, `command`, `spend`, `stu_id`, `name`, `log_date`, `cmd_time`) VALUES ('4', '午餐', '13', '1002', '路飞', '2019-11-03 21:17:36', '2019-11-03 13:18:52');
INSERT INTO `dataworks`.`student` (`id`, `command`, `spend`, `stu_id`, `name`, `log_date`, `cmd_time`) VALUES ('5', '午餐', '17', '1003', '索大', '2019-11-03 21:18:28', '2019-11-03 21:18:31');
在MaxCompute上先查询数据
可以看到,此时是没有数据的,接下来开始执行数据同步任务
运行同步任务
在次查询临时任务,可以看到有了数据,并且还能看到每次执行任务的花费。。。
随便插入几条数据后,便可以开始写离线计算任务了,如果创建的是ODPS SQL计算任务,现在就可以开始编写了。
编写离线计算任务
创建一个ODPS SQL任务,编写如下代码
-- 统计每天吃了午餐且花费大于13元的人数
CREATE TABLE lunch_log AS
SELECT partitioned_date AS log_date ,COUNT(DISTINCT s.stu_id) AS number
FROM student s
WHERE s.command='午餐' and s.spend>=13
and s.partitioned_date=${bdp.system.bizdate}
GROUP BY s.partitioned_date
编写完毕后,设置调度日期,可以看到用了${bdp.system.bizdate}。
因为该任务是单独写的,没有建立工作流,所以直接使用根节点做父节点
运行离线计算任务
查看计算后的中间表数据
如果需要将中间表导出到MySQL中,再写同步任务即可。
如果运行失败,可以直接查看错误信息,进行修改,但是通常在工作中,这些任务都是一个工作流中,定时执行,这个错误可以在运维界面进行查看。
运维UI界面
在这里可以定向到错误任务,然后通过查看错误日志来进行错误的排查。