本篇主要是樓主工作的一些心得和總結,更完整的介紹和使用還需要參考阿里雲官方文檔。另開發者們可以申請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界面
在這裏可以定向到錯誤任務,然後通過查看錯誤日誌來進行錯誤的排查。