基于 DataLakeAnalytics 做跨地域的数据分析

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
对象存储 OSS,20GB 3个月
简介:

在阿里云上,很多客户的应用都是多地域部署的, 比如在北京(cn-beijing)的地域部署一个应用让北方的客户访问快一点,同时在杭州(cn-hangzhou)地域部署一份让南方的客户访问快一点。多地域部署之后,业务数据被拆成了多份,而各个地域的数据库都是独立的,网络又不通,给总体业务数据的分析造成了困难。今天我给大家介绍一套基于 DataLakeAnalytics, OSS, DataX 等几个阿里云产品的跨地域数据分析的解决方案。

其实云产品本身(比如我们 DataLakeAnalytics 自己)也有跨地域数据分析的需求,这个方案也同样适用。这个方案本来就是为了分析 DataLakeAnalytics 自己的业务数据而探索出来的。

方案概览

我们知道各个地域的RDS是不通的,除非你开公网访问权限(有很大的安全风险,不推荐), 而且即使你开公网,要对多个数据库里面的数据进行联合分析也不是一件容易的事情;而且这种数据分析的需求我们不希望它占用太多的预算。

我们的方案是把各个地域的数据都同步到同一个地域的OSS上面去,然后用 DataLakeAnalytics 进行联合分析。这个方案的优点在于 OSS 存储收费非常便宜, DataLakeAnalytics 也是按查询量收费的,你平时不查询的时候一分钱都不用花。总体方案如下图:

总体方案

汇聚各个地域的数据

我们方案的第一步是把各个地域的RDS数据同步到同一个地域的OSS里面去。阿里巴巴集团开源了一个很棒的数据搬运的工具: DataX, 可以把数据在各种不同的数据源之间进行搬运,它支持的数据源类型非常丰富: 从关系型的 MySQL, SQLServer, 到各种文件系统如 HDFS, OSS等等,其中我们需要的是从 MySQL 读数据的 mysqlreader 插件以及往 OSS 写数据的 osswriter 插件。

假定我们有下面这么一个记录人员信息的表 person 需要同步:

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 了,分析OSS上的数据是 DataLakeAnalytics 的拿手好戏,在开始之前我们要有一个 DataLakeAnalytics 的账号,目前 DataLakeAnalytics 正在公测,直接申请试用就好了。试用审批成功之后,你会获得一个用户名和密码, 然后在控制台登录就可以使用:

DLA控制台

或者如果你是极客,更偏爱命令行,你也可以使用普通的 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? 还是什么调度系统?这些就留给读者自己去探索了。

目录
相关文章
|
11天前
实时协作+跨时区支持,在线文档的未来是什么?
在全球化背景下,跨境团队协作面临语言障碍、时差困扰和跨文化沟通等挑战。在线文档协作通过语言支持、灵活时间和标准化模板,有效提升团队效率,实现无缝对接。一家欧洲跨境电商企业的成功案例证明了这一模式的有效性。在线文档协作正逐渐成为企业跨境战略的重要支柱。
|
2月前
|
消息中间件 JavaScript Kafka
跨服务的数据
【10月更文挑战第29天】
30 2
|
5月前
|
运维 数据管理 数据库
数据管理DMS使用问题之哪些地域支持流式ETL功能
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。
|
关系型数据库 分布式数据库 PolarDB
沉浸式学习PostgreSQL|PolarDB 7: 移动社交、多媒体、内容分发、游戏业务场景, 跨地域多机房的智能加速
在移动社交、多媒体、内容分发业务场景中, 如果用户要交互的内容都在中心网络(假设深圳), 现在用户流动非常频繁, 当用户从深圳出差到北京, 因为网络延迟急剧增加, 他的访问体验就会变得非常差. 网络延迟对游戏业务的影响则更加严重. 为了解决这个问题, 企业会将业务部署在全国各地, 不管用户在哪里出差, 他都可以就近访问最近的中心. 由于标记用户的只有IP地址, 怎么根据用户的接入IP来判断他应该访问哪个中心呢? 通过这个实验, 大家可以了解到在数据库中如何存储IP地址范围和各中心IDC的映射关系, 以及如何根据用户的来源IP(接入IP)来判断他应该去哪个中心IDC访问.
169 0
|
存储 运维 监控
悦数图数据库 v3.6.0 发布:支持 Zone 管理,提升业务安全性和连续性
近日,悦数图数据库 v3.6.0 版本全新发布!这个版本带来了一系列令人振奋的功能和增强,进一步提升企业用户在一些特定场景的体验。同时发布的还有悦数图探索和悦数运维监控 v3.6.0 版本,新版本为您提供了更优化的可视化图探索工具和多集群可视化运维工具。
|
7月前
|
存储 运维 监控
悦数图数据库 v3.6.0 发布|支持 Zone 管理,提升业务安全性和连续性
近日悦数图数据库 v3.6.0 版本全新发布!这个版本带来了一系列令人振奋的功能和增强,进一步提升企业用户在一些特定场景的体验。同时发布的还有悦数图探索和悦数运维监控 v3.6.0 版本,新版本为您提供了更优化的可视化图探索工具和多集群可视化运维工具。
|
运维 API 数据安全/隐私保护
资源中心 - 助您轻松解决跨账号、跨产品、跨地域的资源搜索难题
资源中心为您提供跨账号、跨产品、跨地域的全局资源视图及资源搜索能力。
5500 0
资源中心 - 助您轻松解决跨账号、跨产品、跨地域的资源搜索难题
|
存储 分布式计算 算法
基于阿里云Maxcompute搭建广告策略的多维实时洞察方案
本次分享的主题为广告策略工程架构体系演进,将介绍广告在从0到1,从1到 N 的过程中,广告架构是如何支持策略、算法、模型迭代的,包括以下几部分:概述、广告策略工程架构体系演进、精益驱动思想工具:“两翼计划”。
242 0
基于阿里云Maxcompute搭建广告策略的多维实时洞察方案
|
存储 SQL 运维
Dataphin跨租户发布功能简介
Dataphin提供两种项目模式:Basic简单模式和生产开发隔离的Dev-Prod模式。使用开发生产隔离的模式,可以提供代码及数据的生产开发环境隔离。然而在某些对安全性要求更高的场景(比如金融场景),客户需要对生产和开发环境进行物理的隔离。Dataphin的3.2新版本提供的跨租户发布功能也是为了满足该需求而发布。本文将介绍跨租户发布的基本流程及功能介绍
1047 0
Dataphin跨租户发布功能简介
|
弹性计算 运维 网络安全
简单高效的跨账号网络互通方案 - 方案实操
基于资源目录场景下,企业将多账号有序组织起来后,如何快速实现它们之间的网络互通。
简单高效的跨账号网络互通方案 - 方案实操