摘要: 當前,不少用戶的業務數據存放在傳統關係型數據庫上,例如阿里雲的RDS,作業務讀寫操做。當數據量很是大的時候,此時傳系關係型數據庫會顯得有些吃力,那麼會常常有將mysql數據庫的數據遷移到[大數據處理平臺-大數據計算服務(Maxcompute,原ODPS)(https://www.aliyun.com/produc...,利用其強大的存儲和計算能力進行各類查詢計算,結果再回流到RDS。html
點此查看原文:http://click.aliyun.com/m/40816/mysql
當前,不少用戶的業務數據存放在傳統關係型數據庫上,例如阿里雲的RDS,作業務讀寫操做。當數據量很是大的時候,此時傳統關係型數據庫會顯得有些吃力,那麼會常常有將mysql數據庫的數據遷移到[大數據處理平臺-大數據計算服務(Maxcompute,原ODPS)(https://www.aliyun.com/produc...,利用其強大的存儲和計算能力進行各類查詢計算,結果再回流到RDS。sql
通常狀況下,業務數據是按日期來區分的,有的靜態數據多是按照區域或者地域來區分,在Maxcompute中數據能夠按照分區來存放,能夠簡單理解爲一份數據放在不一樣的子目錄下,子目錄的名稱以日期來命名。那麼在RDS數據遷移到Maxcompute上的過程當中,不少用戶但願能夠自動的建立分區,動態的將RDS中的數據,好比按日期區分的數據存放到Maxcompute中,這個流程自動化建立。同步的工具是使用Maxcompute的配套產品-[大數據開發套件](https://data.aliyun.com/product/ide?spm=5176.7741945.765261.313.TQqfkK)。下面就舉例說明RDS-Maxcompute自動分區幾種方法的使用。
一,將RDS中的數據定時天天同步到Maxcompute中,自動建立按天日期的分區。數據庫
這裏就要用到大數據開發套件-數據集成的功能,咱們採用界面化的配置。
如圖地方,設置Maxcompute的分區格式
通常配置到這個地方的時候,默認是系統自帶時間參數:${bdp.system.bizdate} 格式是yyyymmdd。也就是說在調度執行這個任務的時候,這個分區會被自動替換爲
任務執行日期的前一天,
相對用戶比較方便的,由於通常用戶業務數據是當前跑前一天的業務數據,這個日期也叫業務日期。
如圖運維
若是用戶想使用當天任務運行的日期做爲分區值,須要自定義這個參數,方法如圖,也能夠參考文檔
https://help.aliyun.com/docum...
自定義的參數,格式很是靈活,日期是當天日期,用戶能夠自由選擇哪一天,以及格式。
可供參考的變量參數配置方式以下:
後N年:$[add_months(yyyymmdd,12*N)]
前N年:$[add_months(yyyymmdd,-12*N)]
後N月:$[add_months(yyyymmdd,N)]
前N月:$[add_months(yyyymmdd,-N)]
後N周:$[yyyymmdd+7*N]
前N周:$[yyyymmdd-7*N]
後N天:$[yyyymmdd+N]
前N天:$[yyyymmdd-N]
後N小時:$[hh24miss+N/24]
前N小時:$[hh24miss-N/24]
後N分鐘:$[hh24miss+N/24/60]
前N分鐘:$[hh24miss-N/24/60]
注意:
請以中括號 [] 編輯自定義變量參數的取值計算公式,例如 key1=$[yyyy-mm-dd]。
默認狀況下,自定義變量參數的計算單位爲天。例如 $[hh24miss-N/24/60] 表示 (yyyymmddhh24miss-(N/24/60 * 1天)) 的計算結果,而後按 hh24miss 的格式取時分秒。
使用 add_months 的計算單位爲月。例如 $[add_months(yyyymmdd,12 N)-M/24/60] 表示 (yyyymmddhh24miss-(12 N 1月))-(M/24/60 1天) 的結果,而後按 yyyymmdd 的格式取年月日。
如圖,配置完成後,咱們來測試運行看下,直接查看日誌
能夠,看到日誌中,Maxcompute(日誌中打印原名ODPS)的信息中
partition分區,date_test=20170829,自動替換成功。
再看下實際的數據過去了沒呢
咱們看到數據是過來了,成功自動建立了一個分區值。那麼這個任務定時調度的時候,就會自動生成一個分區,天天自動的將RDS中的數據同步到Maxcompute中的按照日期建立的分區中。ide
二,若是用戶的數據有不少運行日期以前的歷史數據,怎麼自動同步,自動分區呢。大數據開發套件-運維中心-有個補數據的功能。工具
首先,咱們須要在RDS端把歷史數據按照日期篩選出來,好比歷史數據2017-08-25這天的數據,我要讓他自動同步到Maxcompute的20170825的分區中。
在RDS階段能夠設置where過濾條件,如圖
在Maxcompute頁面,仍是按照以前同樣配置
而後必定要 保存-提交。
提交後到運維中心-任務管理-圖形模式-補數據
選擇日期區間
提交運行,這個時候就會同時生成多個同步的任務實例按順序執行
看下運行的日誌,能夠看到運行過程對RDS數據的抽取,在Maxcompute自動建立的分區
看下運行結果,數據寫入的狀況,自動建立了分區,數據同步過來了。
三,若是用戶數據量比較巨大,第一次全量的數據,或者並非按照日期分區,是按照省份等分區。那麼此時數據集成就不能作到自動分區了。也就是說,想按照RDS中某個字段進行hash,相同的字段值自動放到Maxcompute中以這個字段對應值的分區中。
同步自己是作不了的,是在Maxcompute中經過SQL完成,是Maxcompute的特有功能,實際上也是真正的動態分區,你們能夠參考文章
https://yq.aliyun.com/article...
。那麼就須要咱們先把數據全量同步到Maxcompute的一個臨時表。
流程以下
1,先建立一個SQL腳本節點-用來建立臨時表測試
drop table if exists emp_test_new_temp; CREATE TABLE emp_test_new_temp (date_time STRING, name STRING, age BIGINT, sal DOUBLE);
2,建立同步任務的節點,就是簡單的同步任務,將RDS數據全量同步到Maxcompute,不須要設置分區。
3,使用sql進行動態分區到目的表大數據
drop table if exists emp_test_new; --建立一個ODPS分區表(最終目的表) CREATE TABLE emp_test_new ( date_time STRING, name STRING, age BIGINT, sal DOUBLE ) PARTITIONED BY ( date_test STRING ); --執行動態分區sql,按照臨時表的字段date_time自動分區,date_time字段中相同的數據值,會按照這個數據值自動建立一個分區值 --例如date_time中有些數據是2017-08-25,會自動在ODPS分區表中建立一個分區,date=2017-08-25 --動態分區sql以下 --能夠注意到sql中select的字段多寫了一個date_time,就是指定按照這個字段自動建立分區 insert overwrite table emp_test_new partition(date_test)select date_time,name,age,sal,date_time from emp_test_new_temp --導入完成後,能夠把臨時表刪除,節約存儲成本 drop table if exists emp_test_new_temp;
最後將三個節點配置成一個工做流,按順序執行阿里雲
執行過程,咱們重點觀察,最後一個節點的動態分區過程
最後,看下數據
完成動態分區,自動化分區。是否是很神奇,相同的日期數據,到了同一個分區裏。若是是以省份命名,也是如此,我本身都怕了。
大數據開發套件實際上能夠完成絕大部分的自動化做業,尤爲是數據同步遷移,調度等,界面化操做使得數據集成變得簡單,不用苦逼的加班搞ETL了,你懂的。