基于 DataLakeAnalytics 的数据湖实践

随着软硬件各方面条件的成熟,数据湖(Data Lake)已经愈来愈受到各大企业的青睐, 与传统的数仓实践不同的是,数据湖不须要专门的“入仓”的过程,数据在哪里,咱们就从哪里读取数据进行分析。这样的好处在于:一来数据能够保存在很便宜的存储上面(好比阿里云的OSS 上面), 给企业节省预算,而须要分析的时候又能够分析;另外一方面,由于省去了入仓的流程,对于中小型企业来讲人员投入更少,更容易上手。mysql

今天咱们就给你们介绍一下,如何基于阿里云的数据湖分析引擎: DataLake Analytics(后面简称DLA) 对用户保存在 OSS 里面的数据创建数据湖,对数据进行各个维度的分析,分析完成获得业务洞见以后再把这些产生的结果再回流到的 RDS 里面供前台业务决策使用。sql

开通DLA

在开始以前咱们要有一个 DLA 的帐号,目前 DLA 正在公测,直接申请试用就行了。试用审批成功以后,你会得到一个用户名和密码, 而后在控制台登陆就可使用:数据库

控制台1

或者若是你是极客,更偏心命令行,你也可使用普通的 MySQL 客户端就能够链接 DLA 了:express

mysql -hservice.cn-shanghai.datalakeanalytics.aliyuncs.com 
      -P10000 
      -u<your-user-name> 
      -p<your-password>复制代码

在这篇文章里面,我会使用 MySQL 命令行给你们演示 DLA 的功能。安全

另外你还须要在您的OSS上准备一些测试数据, 我这里准备的是著名的 TPCH 测试数据集:bash

OSS数据集

用DLA分析OSS上的数据

DLA 是一个以 SQL 做为查询语言的数据湖引擎,为了可以让 DLA 可以对 OSS 上的数据进行查询,咱们须要以某种方式告诉 DLA 咱们 OSS 数据的结构。为了让用户使用更方便,DLA 使用了传统的 数据库, 的概念来维护这些数据的元信息,也就说,OSS的文件结构的数据映射到 DLA 变成了一个数据库和一堆表。机器学习

TPCH 数据集来举个例子,咱们知道 TPCH 数据集里面包含了以下几块信息: 用户(customer), 订单(orders), 订单的详情(lineitem) 等等,这些数据总体属于一块业务,咱们创建一个数据库来对应:ide

CREATE SCHEMA oss_tpch with DBPROPERTIES(  CATALOG = 'oss',
  LOCATION = 'oss://public-datasets-cn-hangzhou/tpch/1x/'  );复制代码

这每块数据对应到OSS上一个目录的多个文件,拿 订单 来讲,它对应的是 orders_text 目录下面的 1 个文件(这个例子里面只有一个文件,实际使用中,这里能够有多个文件):工具

Orders对应的文件

咱们把这个 orders_text 目录映射到咱们的数据库 oss_tpch 下面的一张表:学习

use oss_tpch;CREATE EXTERNAL TABLE IF NOT EXISTS orders (
    O_ORDERKEY INT, 
    O_CUSTKEY INT, 
    O_ORDERSTATUS STRING, 
    O_TOTALPRICE DOUBLE, 
    O_ORDERDATE DATE, 
    O_ORDERPRIORITY STRING, 
    O_CLERK STRING, 
    O_SHIPPRIORITY INT, 
    O_COMMENT STRING) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY '|' STORED AS TEXTFILE 
LOCATION 'oss://public-datasets-cn-hangzhou/tpch/1x/orders_text/'; 查看更多复制代码

这样咱们就能够经过 DLA 对OSS上的进行数据分析了, 好比咱们先来查个前十条看看:

mysql> select * from orders limit 10;
+------------+-----------+---------------+--------------+-------------+-----------------+-----------------+----------------+---------------------------------------------------------------------------+
| o_orderkey | o_custkey | o_orderstatus | o_totalprice | o_orderdate | o_orderpriority | o_clerk         | o_shippriority | o_comment                                                                 |
+------------+-----------+---------------+--------------+-------------+-----------------+-----------------+----------------+---------------------------------------------------------------------------+
|          1 |   3689999 | O             |    224560.83 | 1996-01-02  | 5-LOW           | Clerk#000095055 | 0 | nstructions sleep furiously among || 2 | 7800163 | O | 75388.65 | 1996-12-01 | 1-URGENT | Clerk#000087916 | 0 | foxes. pending accounts at the pending, silent asymptot || 3 | 12331391 | F | 255287.36 | 1993-10-14 | 5-LOW | Clerk#000095426 | 0 | sly final accounts boost. carefully regular ideas cajole carefully. depos || 4 | 13677602 | O | 43119.84 | 1995-10-11 | 5-LOW | Clerk#000012340 | 0 | sits. slyly regular warthogs cajole. regular, regular theodolites acro || 5 | 4448479 | F | 125809.76 | 1994-07-30 | 5-LOW | Clerk#000092480 | 0 | quickly. bold deposits sleep slyly. packages use slyly || 6 | 5562202 | F | 56408.2 | 1992-02-21 | 4-NOT SPECIFIED | Clerk#000005798 | 0 | ggle. special, final requests are against the furiously specia || 7 | 3913430 | O | 240358.24 | 1996-01-10 | 2-HIGH | Clerk#000046961 | 0 | ly special requests || 32 | 13005694 | O | 136666.23 | 1995-07-16 | 2-HIGH | Clerk#000061561 | 0 | ise blithely bold, regular requests. quickly unusual dep || 33 | 6695788 | F | 183460.23 | 1993-10-27 | 3-MEDIUM | Clerk#000040860 | 0 | uriously. furiously final request || 34 | 6100004 | O | 52842.63 | 1998-07-21 | 3-MEDIUM | Clerk#000022278 | 0 | ly final packages. fluffily final deposits wake blithely ideas. spe |+------------+-----------+---------------+--------------+-------------+-----------------+-----------------+----------------+---------------------------------------------------------------------------+
10 rows in set (0.21 sec) 查看更多复制代码

咱们再来看看用户 36901 的前十条订单:

mysql> select * from orders where o_custkey= '36901' limit 10;
+------------+-----------+---------------+--------------+-------------+-----------------+-----------------+----------------+------------------------------------------------------------------+| o_orderkey | o_custkey | o_orderstatus | o_totalprice | o_orderdate | o_orderpriority | o_clerk         | o_shippriority | o_comment                                                        |
+------------+-----------+---------------+--------------+-------------+-----------------+-----------------+----------------+------------------------------------------------------------------+|    1243264 |     36901 | F             |    103833.45 | 1992-03-23  | 2-HIGH          | Clerk#000000922 | 0 | nts haggle. even, even theodolites are. blithely |
|    1274530 |     36901 | O             |    181977.58 | 1997-04-29  | 2-HIGH          | Clerk#000000232 | 0 | bold foxes along the carefully expres |
|    1599527 |     36901 | F             |    322352.11 | 1993-10-16  | 2-HIGH          | Clerk#000000674 | 0 | the slyly even dependencies. |
|    1837477 |     36901 | F             |    101653.62 | 1993-05-27  | 5-LOW           | Clerk#000000891 | 0 | lyly special requests. express foxes sleep fu |
|    1994082 |     36901 | O             |     77952.78 | 1995-07-05  | 3-MEDIUM        | Clerk#000000525 | 0 | luffily ironic courts. bold, e |
|    2224802 |     36901 | F             |    243852.76 | 1993-01-14  | 1-URGENT        | Clerk#000000827 | 0 | sly final requests. pending, regular ideas among the furiously u |
|    4957636 |     36901 | F             |      5741.32 | 1992-05-20  | 5-LOW           | Clerk#000000230 | 0 | ackages. fluffily even packages solve carefully dolphins. unusua |
|    5078467 |     36901 | F             |    119823.03 | 1994-04-29  | 4-NOT SPECIFIED | Clerk#000000402 | 0 | regular asymptotes cajo |
|    5173859 |     36901 | F             |    103624.02 | 1994-05-28  | 3-MEDIUM        | Clerk#000000335 | 0 | regular dependencies poach quickly. unusu |
|    5525574 |     36901 | O             |     136098.0 | 1998-02-16  | 4-NOT SPECIFIED | Clerk#000000425 | 0 | cial pinto beans wake. slyly even warthogs use. bo |
+------------+-----------+---------------+--------------+-------------+-----------------+-----------------+----------------+------------------------------------------------------------------+10 rows in set (1.07 sec) 查看更多复制代码

再来查一查订单量最多的前是我的:

mysql> select o_custkey, count(*) as cnt from orders group by o_custkey order by cnt desc limit 10;
+-----------+------+| o_custkey | cnt  |
+-----------+------+|      3451 |   41 |
|    102022 |   41 |
|    102004 |   41 |
|     79300 |   40 |
|    117082 |   40 |
|    122623 |   40 |
|     69682 |   39 |
|    143500 |   39 |
|    142450 |   38 |
|     53302 |   38 |
+-----------+------+10 rows in set (2.69 sec) 查看更多复制代码

恩,这些人就是咱们要重点服务好的客户啊,咱们要把这些用户的ID回写到前台的 RDS 数据库里面让咱们的营销同窗作一些针对性的营销活动,没问题,DLA支持把分析好的数据回流到RDS

数据回流 RDS

映射 MySQL 数据库信息进 DLA

要把分析好的数据回流到RDS咱们首先一种机制来告诉 DLA 数据回流的目的地,得益于DLA统一的设计,咱们就像映射 OSS 的数据同样,咱们映射一个 MySQL 数据库进来就行了,好比咱们要把数据写到以下的数据库里面:

mysql -habcde.mysql.rds.aliyuncs.com -P3306 -uhello -pworld -Dmarketing复制代码

那么咱们在 DLA 里面建一个映射的库:

CREATE SCHEMA `mysql_marketing` WITH DBPROPERTIES 
( 
  CATALOG = 'mysql', 
  LOCATION = 'jdbc:mysql://abcde.mysql.rds.aliyuncs.com:3306/marketing',
  USER='hello',
  PASSWORD='world',
  INSTANCE_ID = '<your-rds-instance-id>',
  VPC_ID = '<your-vpc-id-where-your-rds-lives>');复制代码

这里须要解释一下的是 VPC_IDINSTANCE_ID, 咱们知道为了安全的缘由在阿里云上购买的 RDS 咱们通常都会把它放在一个单独的VPC里面,以保证只有咱们本身能够访问,这里为了让 DLA 可以访问到咱们的 MySQL 数据库以进行数据回流,咱们须要告诉 DLA 这个 RDS的相关信息。

其中 INSTANCE_IDVPC_ID 在 RDS的详情页面均可以找到, 好比 VPC_ID :

INSTANCE_ID :

因为 RDS 的安全组会对访问的来源IP进行控制,咱们须要把DLA相关的地址段 100.104.0.0/16 IP地址段加入到你的RDS的白名单列表,以下图:

到这里为止,准备工做就完成了,咱们的 mysql 数据库建好了。

映射 MySQL 结果表进 DLA

咱们要保存的结果很简单,就是下单量前 10 的用户, 这个表在 MySQL 数据库里面的建表语句以下:

create table top10_user (
    custkey int,
    order_cnt bigint);复制代码

而为了把这个表映射进 DLA 咱们建一个对应的表,建表语句几乎同样:

use mysql_marketing;create external table top10_user (
    custkey int,
    order_cnt bigint);复制代码

ETL

下面咱们就能够把查出来的数据进行回流了:

mysql> insert into mysql_marketing.top10_user
    -> select o_custkey, count(*) as cnt from oss_tpch.orders
    -> group by o_custkey order by cnt desc limit 10;
+------+| rows |
+------+|   10 |
+------+1 row in set (4.71 sec)

mysql> select * from mysql_marketing.top10_user;
+---------+-----------+| custkey | order_cnt |
+---------+-----------+|  143500 |        39 |
|  102004 |        41 |
|   53302 |        38 |
|    3451 |        41 |
|  122623 |        40 |
|  129637 |        38 |
|  102022 |        41 |
|  117082 |        40 |
|   69682 |        39 |
|   79300 |        40 |
+---------+-----------+10 rows in set (0.14 sec) 查看更多复制代码

总结

在这篇文章里面,我带你们一块儿体验了一下如何用 DLA 创建基于 OSS 的数据湖,对数据库里面的数据进行各个维度的分析,分析完成以后把分析获得的关键数据再回写到咱们的RDS里面去。例子里面不少地方写的比较简单,若是想进一步了解更多相关详细信息能够参考如下资料:

原文连接一站式开发者服务,海量学习资源0元起!阿里热门开源项目、机器学习干货、开发者课程/工具、小微项目、移动研发等海量资源;更有开发者福利Kindle、技术图书幸运抽奖,100%中--》https://www.aliyun.com/acts/product-section-2019/developer?utm_content=g_1000047140

相关文章
相关标签/搜索