Spark On POLARDB

HBase Spark分析引擎是云数据库HBase版提供的分析引擎,基于Spark提供的复杂分析、流式处理、机器学习的能力。Spark分析引擎可以对接阿里云的各种数据源,例如:云HBase数据、MongoDB、Phoenix等,同时也支持对接POLARDB数据库。POLARDB数据库是阿里云自研的下一代关系型云数据库,100%兼容MySQL,性能最高是MySQL的6倍。本文主要介绍HBase Sprk分析引擎如何对接POLARDB。

场景介绍

POLARDB中经常会存储一些维度表信息,例如用户维度表信息,包含用户的ID,姓名,地址等信息。此类数据的特点是数据量小,不经常改变。
Spark 中经常会存在一些海量事实表数据用于数据的分析,例如用户的通话信息、交易信息等。此类数据的特点是数据量大、时刻更新。用户需要在这类数据中统计、分析挖掘有价值的内容。
事实表数据一般包含用户的ID信息,在Spark侧对事实表统计分析时,对分析的结果需要补齐用户的其他信息,例如姓名、地址等。
这时就可以通过Spark直接和POLARDB的数据表做关联查询和统计分析,而不用担心搬迁POLARDB的数据,以及搬迁数据带来的数据同步问题和额外的维护工作量。
下面就看下在Spark中如何关联POLARDB数据库。

在Spark分析引擎中创建表

本文中的SQL样例可以运行在Spark分析集群的SQL服务ThriftServer
在Spark分析引擎中创建POLARDB表的语法如下:

create table jdbc_polordb
using org.apache.spark.sql.jdbc
options (
  url "jdbc:mysql://pc-xxx.rwlb.rds.aliyuncs.com:3306",
  dbtable "testdb.test_table",
  user 'testuser',
  password 'xxx'
)

样例使用的是Spark的JDBC DataSource API。每个参数意义如下:
jdbc:mysql://pc-xxx.rwlb.rds.aliyuncs.com:3306:POLARDB的数据库地址,从POLARDB集群中获取,可以是集群地址,主地址或者SQL加速地址。如图:
undefined
testdb.test_table:testdb是POLARDB中创建的数据库名称,test_table为创建的表名称。
userpassword分别对应数据库的用户名和登陆密码。

在Spark分析引擎中操作表

在Spark分析引擎中创建表后,可以直接在Spark中操作POLARDB表。表的操作常用的有:查询表、插入数据、删除表。

  1. 查询样例:
select * from jdbc_polordb limit 5;
+-----+---------+--+
| id  |  name   |
+-----+---------+--+
| 9   | name9   |
| 15  | name15  |
| 9   | name99  |
| 28  | name28  |
| 15  | name15  |
+-----+---------+--+
select * from jdbc_polordb where id >= 96;
+------+-----------+--+
|  id  |   name    |
+------+-----------+--+
| 96   | name96    |
| 99   | name99    |
| 98   | name98    |
| 99   | name99    |
| 97   | name97    |
| 100  | name100   |
| 200  | testdata  |
+------+-----------+--+
  1. 插入数据样例:
insert into jdbc_polordb values(200, 'testdata');
+---------+--+
| Result  |
+---------+--+
+---------+--+
select * from jdbc_polordb where id=200;
+------+-----------+--+
|  id  |   name    |
+------+-----------+--+
| 200  | testdata  |
+------+-----------+--+
  1. 与其他表join样例:
select j.id, j.name from jdbc_polordb j join test_parquet t on j.id = t.id;
+-----+--------+--+
| id  |  name  |
+-----+--------+--+
| 1   | name1  |
| 3   | name3  |
| 5   | name5  |
+-----+--------+--+
  1. 删除表样例(删除表不会删除POLARDB数据库中的表):
drop table jdbc_polordb;
+---------+--+
| Result  |
+---------+--+
+---------+--+

Spark分析引擎查询POLARDB性能优化

Spark中查询POLARDB表性能方面提供了如下的优化能力:

  1. 列值裁剪
    根据用户的SQL语句在POLARDB中获取需要的字段的数据。例如,POLARDB中的表testuser有四个字段,co1、col2、col3、col4。 Spark中的查询语句为:
select co1, co3 from jdbc_polordb

则Spark只会获取testuser中col1和co3两个字段对应的数据,减少数据获取量。

  1. 过滤条件下推
    Spark支持常用的过滤条件下推有:=,>,>=,<,<=,is null, is not null,like xx%, like %xx, like %xx%,in,not。如:
select * from jdbc_polordb where id >= 96;
select * from jdbc_polordb where id=200;

过滤条件下推会把过滤条件下推到POLARDB数据库,减少获取的数据量,提升查询性能。

  1. 分区并行读取
    在Spark中创建JDBC表时可以指定分区,查询会按照分区字段和分区数并发查询。语法如下:

  2. table jdbc_polordb
  3. org.apache.spark.sql.jdbc
  4. (
    url "jdbc:mysql://pc-xxx.rwlb.rds.aliyuncs.com:3306",
    dbtable "testdb.test_table",
    user 'testuser',
    password 'xxx',
    partitionColumn 'id',
    lowerBound '20',
    upperBound '80',
    numPartitions '5'
    )

partitionColumn是需要分区的字段名称,lowerBound为下界值,upperBound为上界值,numPartitions为分区数。在此基础上执行select * form jdbc_polordb,Spark会下发5个并行的Job查询POLARDB数据库。下图为Spark的并行Job,
undefined

总结

Spark作为大数据计算框架可以与POLARDB数据很容易结合在一起,在Spark中关联、分析POLARDB的数据。本文简单介绍Spark分析引擎与POLARDB结合的常用操作,更多内容欢迎大家试用Spark分析引擎POLARDB

猜你喜欢

转载自yq.aliyun.com/articles/690754