基于 DataLakeAnalytics 做跨地域的数据分析
在阿里云上,很多客戶的應(yīng)用都是多地域部署的, 比如在北京(cn-beijing)的地域部署一個(gè)應(yīng)用讓北方的客戶訪問(wèn)快一點(diǎn),同時(shí)在杭州(cn-hangzhou)地域部署一份讓南方的客戶訪問(wèn)快一點(diǎn)。多地域部署之后,業(yè)務(wù)數(shù)據(jù)被拆成了多份,而各個(gè)地域的數(shù)據(jù)庫(kù)都是獨(dú)立的,網(wǎng)絡(luò)又不通,給總體業(yè)務(wù)數(shù)據(jù)的分析造成了困難。今天我給大家介紹一套基于 DataLakeAnalytics, OSS, DataX 等幾個(gè)阿里云產(chǎn)品的跨地域數(shù)據(jù)分析的解決方案。
其實(shí)云產(chǎn)品本身(比如我們 DataLakeAnalytics 自己)也有跨地域數(shù)據(jù)分析的需求,這個(gè)方案也同樣適用。這個(gè)方案本來(lái)就是為了分析 DataLakeAnalytics 自己的業(yè)務(wù)數(shù)據(jù)而探索出來(lái)的。
方案概覽
我們知道各個(gè)地域的RDS是不通的,除非你開(kāi)公網(wǎng)訪問(wèn)權(quán)限(有很大的安全風(fēng)險(xiǎn),不推薦), 而且即使你開(kāi)公網(wǎng),要對(duì)多個(gè)數(shù)據(jù)庫(kù)里面的數(shù)據(jù)進(jìn)行聯(lián)合分析也不是一件容易的事情;而且這種數(shù)據(jù)分析的需求我們不希望它占用太多的預(yù)算。
我們的方案是把各個(gè)地域的數(shù)據(jù)都同步到同一個(gè)地域的OSS上面去,然后用 DataLakeAnalytics 進(jìn)行聯(lián)合分析。這個(gè)方案的優(yōu)點(diǎn)在于 OSS 存儲(chǔ)收費(fèi)非常便宜, DataLakeAnalytics 也是按查詢(xún)量收費(fèi)的,你平時(shí)不查詢(xún)的時(shí)候一分錢(qián)都不用花。總體方案如下圖:
匯聚各個(gè)地域的數(shù)據(jù)
我們方案的第一步是把各個(gè)地域的RDS數(shù)據(jù)同步到同一個(gè)地域的OSS里面去。阿里巴巴集團(tuán)開(kāi)源了一個(gè)很棒的數(shù)據(jù)搬運(yùn)的工具: DataX, 可以把數(shù)據(jù)在各種不同的數(shù)據(jù)源之間進(jìn)行搬運(yùn),它支持的數(shù)據(jù)源類(lèi)型非常豐富: 從關(guān)系型的 MySQL, SQLServer, 到各種文件系統(tǒng)如 HDFS, OSS等等,其中我們需要的是從 MySQL 讀數(shù)據(jù)的 mysqlreader 插件以及往 OSS 寫(xiě)數(shù)據(jù)的 osswriter 插件。
假定我們有下面這么一個(gè)記錄人員信息的表 person 需要同步:
create table person (
id int primary key auto_increment,name varchar(1023),age int);
我們寫(xiě)一個(gè)類(lèi)似下面這樣的DataX任務(wù)描述文件 person.json :
{
"job": {
"setting": {
},
"content": [
]
}
}
這里 MySQL 相關(guān)的信息填你的業(yè)務(wù)庫(kù)的信息,而 OSS 相關(guān)的信息選擇一個(gè)我們同步到的OSS的地址。注意 OSS 配置部分的 object 字段,mydb 保存你所有的數(shù)據(jù), person 這個(gè)目錄保存你的 person 表的數(shù)據(jù),region=cn-hangzhou 這個(gè)目錄就有意思了,它保存的是你的應(yīng)用在 cn-hangzhou 這個(gè)region里面的數(shù)據(jù),同樣的,你可能還會(huì)有 cn-beijing, cn-shangahi 的數(shù)據(jù)等等。
然后執(zhí)行如下命令:
// 執(zhí)行前確保你已經(jīng)下載并正確配置好 DataX 了。
python datax/bin/datax.py person.json
正確執(zhí)行的話你會(huì)看到下面的輸出:
.....省略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 -
任務(wù)啟動(dòng)時(shí)刻 : 2018-09-06 19:53:09
任務(wù)結(jié)束時(shí)刻 : 2018-09-06 19:53:19
任務(wù)總計(jì)耗時(shí) : 10s
任務(wù)平均流量 : 5.28KB/s
記錄寫(xiě)入速度 : 25rec/s
讀出記錄總數(shù) : 251
讀寫(xiě)失敗總數(shù) : 0
這樣數(shù)據(jù)就自動(dòng)同步到 OSS 上去了,你可以下載一個(gè) oss-browser 去查看oss上面的數(shù)據(jù):
文件里面數(shù)據(jù)大概是這樣的:
9|ethan|10
10|julian|20
11|train|30
12|wally|40
完成了一個(gè)地域的數(shù)據(jù)搬運(yùn)之后,其它地域都可以照葫蘆畫(huà)瓢,唯一需要注意的地方是,雖然 MySQL 數(shù)據(jù)是各個(gè) 地域 的數(shù)據(jù),但是 OSS 要用同一個(gè)根目錄 person ,因?yàn)槲覀円鰯?shù)據(jù)匯集嘛,把幾個(gè)地域的數(shù)據(jù)匯集完成之后,person 目錄的結(jié)構(gòu)大概是這樣的:
使用 DataLakeAnalytics 分析匯聚后的OSS數(shù)據(jù)
下面的分析就可以交給 DataLakeAnalytics 了,分析OSS上的數(shù)據(jù)是 DataLakeAnalytics 的拿手好戲,在開(kāi)始之前我們要有一個(gè) DataLakeAnalytics 的賬號(hào),目前 DataLakeAnalytics 正在公測(cè),直接申請(qǐng)?jiān)囉镁秃昧恕T囉脤徟晒χ?#xff0c;你會(huì)獲得一個(gè)用戶名和密碼, 然后在控制臺(tái)登錄就可以使用:
或者如果你是極客,更偏愛(ài)命令行,你也可以使用普通的 MySQL 客戶端就可以連接 DLA 了:
mysql -hservice.cn-shanghai.datalakeanalytics.aliyuncs.com
-P10000-u<your-user-name>-p<your-password>在這篇文章里面,我會(huì)使用 MySQL 命令行給大家演示 DLA 的功能。
首先我們來(lái)建一個(gè) DataLakeAnalytics 的數(shù)據(jù)庫(kù):
CREATE DATABASE mydb WITH DBPROPERTIES (
catalog = oss, location = 'oss://your-bucket/mydb/');
這里的 oss://mydb-bucket/mydb/ 就是前面我們數(shù)據(jù)匯聚的 person 目錄的父目錄。
建好庫(kù)之后,我們?cè)俳ㄒ粋€(gè)表:
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';
注意這是一個(gè)分區(qū)表,分區(qū)的key是我們的region,這樣的好處一是各個(gè)地域在同步數(shù)據(jù)的時(shí)候比較簡(jiǎn)單,不用擔(dān)心把別的地域的數(shù)據(jù)沖掉了;另外利用地域分區(qū)也使得我們?cè)诜治鰡蝹€(gè)地域的時(shí)候掃描數(shù)據(jù)量會(huì)比較小,查詢(xún)速度更快。
建好表之后,我們運(yùn)行如下命令讓 DataLakeAnalytics 去對(duì)OSS上的文件列表進(jìn)行掃描以找到所有的 region 分區(qū):
| 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 |
現(xiàn)在我們就可以開(kāi)心的對(duì)所有地域的數(shù)據(jù)進(jìn)行聯(lián)合查詢(xún)了 :)
| 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)
| region | cnt |
| cn-beijing | 4 |
| cn-hangzhou | 4 |
| cn-shanghai | 4 |
3 rows in set (0.18 sec)
總結(jié)
在這篇文章里面,我們介紹了一種通過(guò) DataLakeAnalytics, OSS, DataX 進(jìn)行跨地域數(shù)據(jù)分析的方法。限于篇幅的原因方案的很多細(xì)節(jié)沒(méi)有進(jìn)一步優(yōu)化,比如我們其實(shí)可以對(duì)數(shù)據(jù)進(jìn)行進(jìn)一步按天分區(qū),這樣每天同步的數(shù)據(jù)可以更少,效率更高;再比如我們沒(méi)有介紹如何周期性的進(jìn)行數(shù)據(jù)同步,用crontab? 還是什么調(diào)度系統(tǒng)?這些就留給讀者自己去探索了。
總結(jié)
以上是生活随笔為你收集整理的基于 DataLakeAnalytics 做跨地域的数据分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: YYCache 源码学习(二):YYDi
- 下一篇: 0301 - 一个比价的小项目