在阿里雲上,不少客戶的應用都是多地域部署的, 好比在北京(cn-beijing)的地域部署一個應用讓北方的客戶訪問快一點,同時在杭州(cn-hangzhou)地域部署一份讓南方的客戶訪問快一點。多地域部署以後,業務數據被拆成了多份,而各個地域的數據庫都是獨立的,網絡又不通,給整體業務數據的分析形成了困難。今天我給你們介紹一套基於 DataLakeAnalytics, OSS, DataX 等幾個阿里雲產品的跨地域數據分析的解決方案。python
其實雲產品自己(好比咱們 DataLakeAnalytics 本身)也有跨地域數據分析的需求,這個方案也一樣適用。這個方案原本就是爲了分析 DataLakeAnalytics 本身的業務數據而探索出來的。mysql
咱們知道各個地域的RDS是不通的,除非你開公網訪問權限(有很大的安全風險,不推薦), 並且即便你開公網,要對多個數據庫裏面的數據進行聯合分析也不是一件容易的事情;並且這種數據分析的需求咱們不但願它佔用太多的預算。git
咱們的方案是把各個地域的數據都同步到同一個地域的OSS上面去,而後用 DataLakeAnalytics 進行聯合分析。這個方案的優勢在於 OSS 存儲收費很是便宜, DataLakeAnalytics 也是按查詢量收費的,你平時不查詢的時候一分錢都不用花。整體方案以下圖:github
![(https://upload-images.jianshu.io/upload_images/19049-145d5777e3568f50.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 "整體方案")sql
咱們方案的第一步是把各個地域的RDS數據同步到同一個地域的OSS裏面去。阿里巴巴集團開源了一個很棒的數據搬運的工具: DataX, 能夠把數據在各類不一樣的數據源之間進行搬運,它支持的數據源類型很是豐富: 從關係型的 MySQL, SQLServer, 到各類文件系統如 HDFS, OSS等等,其中咱們須要的是從 MySQL 讀數據的 mysqlreader
插件以及往 OSS 寫數據的 osswriter
插件。數據庫
假定咱們有下面這麼一個記錄人員信息的表 person
須要同步:json
create table person ( id int primary key auto_increment, name varchar(1023), age int );
咱們寫一個相似下面這樣的DataX任務描述文件 person.json
:安全
{ "job": { "setting": { "speed": { "channel": 1, "byte": 104857600 }, "errorLimit": { "record": 10 } }, "content": [ { "reader": { "name": "mysqlreader", "parameter": { "username": "your-user-name", "password": "your-password", "column": [ "id", "name", "age", ], "connection": [ { "table": [ "person" ], "jdbcUrl": [ "jdbc:mysql://your-rds.mysql.rds.aliyuncs.com:3306/dbname" ] } ] } }, "writer": { "name": "osswriter", "parameter": { "endpoint": "http://oss.aliyuncs.com", "accessId": "your-access-id", "accessKey": "your-access-secret", "bucket": "mydb-bucket", "object": "mydb/person/region=cn-hangzhou/person.csv", "encoding": "UTF-8", "fieldDelimiter": "|", "writeMode": "truncate" } } } ] } }
這裏 MySQL 相關的信息填你的業務庫的信息,而 OSS 相關的信息選擇一個咱們同步到的OSS的地址。注意 OSS 配置部分的 object
字段,mydb
保存你全部的數據, person
這個目錄保存你的 person
表的數據,region=cn-hangzhou
這個目錄就有意思了,它保存的是你的應用在 cn-hangzhou
這個region裏面的數據,一樣的,你可能還會有 cn-beijing
, cn-shangahi
的數據等等。微信
而後執行以下命令:網絡
// 執行前確保你已經下載並正確配置好 DataX 了。 python datax/bin/datax.py person.json
正確執行的話你會看到下面的輸出:
.....省略N行...... 2018-09-06 19:53:19.900 [job-0] INFO JobContainer - PerfTrace not enable! 2018-09-06 19:53:19.901 [job-0] INFO StandAloneJobContainerCommunicator - Total 251 records, 54067 bytes | Speed 5.28KB/s, 25 records/s | Error 0 records, 0 bytes | All Task WaitWriterTime 0.001s | All Task WaitReaderTime 0.026s | Percentage 100.00% 2018-09-06 19:53:19.902 [job-0] INFO JobContainer - 任務啓動時刻 : 2018-09-06 19:53:09 任務結束時刻 : 2018-09-06 19:53:19 任務總計耗時 : 10s 任務平均流量 : 5.28KB/s 記錄寫入速度 : 25rec/s 讀出記錄總數 : 251 讀寫失敗總數 : 0
這樣數據就自動同步到 OSS 上去了,你能夠下載一個 oss-browser 去查看oss上面的數據:
文件裏面數據大概是這樣的:
9|ethan|10 10|julian|20 11|train|30 12|wally|40
完成了一個地域的數據搬運以後,其它地域均可以照葫蘆畫瓢,惟一須要注意的地方是,雖然 MySQL 數據是各個 地域 的數據,可是 OSS 要用同一個根目錄 person
,由於咱們要作數據聚集嘛,把幾個地域的數據聚集完成以後,person
目錄的結構大概是這樣的:
下面的分析就能夠交給 DataLakeAnalytics 了,分析OSS上的數據是 DataLakeAnalytics 的拿手好戲,在開始以前咱們要有一個 DataLakeAnalytics 的帳號,目前 DataLakeAnalytics 正在公測,直接申請試用就行了。試用審批成功以後,你會得到一個用戶名和密碼, 而後在控制檯登陸就可使用:
或者若是你是極客,更偏心命令行,你也可使用普通的 MySQL 客戶端就能夠鏈接 DLA 了:
mysql -hservice.cn-shanghai.datalakeanalytics.aliyuncs.com -P10000 -u<your-user-name> -p<your-password>
在這篇文章裏面,我會使用 MySQL 命令行給你們演示 DLA 的功能。
首先咱們來建一個 DataLakeAnalytics 的數據庫:
CREATE DATABASE `mydb` WITH DBPROPERTIES ( catalog = oss, location = 'oss://your-bucket/mydb/' );
這裏的 oss://mydb-bucket/mydb/
就是前面咱們數據匯聚的 person
目錄的父目錄。
建好庫以後,咱們再建一個表:
CREATE EXTERNAL TABLE IF NOT EXISTS `person` ( `id` bigint, `name` varchar(128), `age` int ) PARTITIONED BY (region varchar(63)) ROW FORMAT DELIMITED FIELDS TERMINATED BY '|' STORED AS TEXTFILE LOCATION 'oss://mydb-bucket/mydb/person';
注意這是一個分區表,分區的key是咱們的region,這樣的好處一是各個地域在同步數據的時候比較簡單,不用擔憂把別的地域的數據沖掉了;另外利用地域分區也使得咱們在分析單個地域的時候掃描數據量會比較小,查詢速度更快。
建好表以後,咱們運行以下命令讓 DataLakeAnalytics 去對OSS上的文件列表進行掃描以找到全部的region
分區:
mysql> msck repair table person; +-----------------------------------------------------------------------------------------------------------+ | Result | +-----------------------------------------------------------------------------------------------------------+ | Partitions not in metastore: person:region=cn-beijing person:region=cn-hangzhou person:region=cn-shanghai | | Repair: Added partition to metastore mydb.person:region=cn-beijing | | Repair: Added partition to metastore mydb.person:region=cn-hangzhou | | Repair: Added partition to metastore mydb.person:region=cn-shanghai | +-----------------------------------------------------------------------------------------------------------+
如今咱們就能夠開心的對全部地域的數據進行聯合查詢了 :)
mysql> select * from person limit 5; +------+-------+------+-------------+ | id | name | age | region | +------+-------+------+-------------+ | 1 | james | 10 | cn-beijing | | 2 | bond | 20 | cn-beijing | | 3 | lucy | 30 | cn-beijing | | 4 | lily | 40 | cn-beijing | | 5 | trump | 10 | cn-hangzhou | +------+-------+------+-------------+ 5 rows in set (0.43 sec) mysql> select region, count(*) cnt from person group by region; +-------------+------+ | region | cnt | +-------------+------+ | cn-beijing | 4 | | cn-hangzhou | 4 | | cn-shanghai | 4 | +-------------+------+ 3 rows in set (0.18 sec)
在這篇文章裏面,咱們介紹了一種經過 DataLakeAnalytics, OSS, DataX 進行跨地域數據分析的方法。限於篇幅的緣由方案的不少細節沒有進一步優化,好比咱們其實能夠對數據進行進一步按天分區,這樣天天同步的數據能夠更少,效率更高;再好比咱們沒有介紹如何週期性的進行數據同步,用crontab? 仍是什麼調度系統?這些就留給讀者本身去探索了。
原文連接 更多技術乾貨 請關注阿里云云棲社區微信號 :yunqiinsight