阿里云关系型数据库(Relational Database Service,简称RDS)是一种稳定可靠、可弹性伸缩的在线数据库服务。基于阿里云分布式文件系统和SSD盘高性能存储,RDS支持MySQL、SQL Server、PostgreSQL、PPAS(PostgreSQL Plus Advanced Server,高度兼容Oracle数据库)和MariaDB引擎,并且提供了容灾、备份、恢复、监控、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。本文介绍通过数据工作台使用Spark对接RDS MySQL版、RDS SQL Server版和RDS PostgreSQL版的方法。

前置条件

  1. Spark集群RDS在同一个VPC下。进入Spark分析集群页面,选择“数据库连接”>“连接信息”,查看Spark集群的VPC ID信息。
  2. Spark集群关联RDS集群。
    • 对于RDS for MySQL可以直接spark的集群管理页面一键关联

    • 对于其他RDS数据库需要手动把Spark集群IP端配置到RDS的白名单。首先在阿里云控制台进入“专有网络VPC”,找到Spark集群的VPC ID对应的IPv4网段。如下图:

      然后进入RDS对应数据库集群配置白名单,添加上述IPv4网段。如下图:
  3. RDS已创建表,本实例使用的RDS表名为:test_table,数据库名为:testdb。建表语句和内容如下(SQL语句可直接拷贝到DMS上执行):

#MySQL 建表语句:
CREATE TABLE `testdb`.`test_table` (
    `name` varchar(32) NULL,
    `age` INT  NULL,
    `score` DOUBLE NULL
)
#MySQL 插入数据语句:
INSERT INTO `testdb`.`test_table` VALUES('aliyun01', 1001, 10.1);
INSERT INTO `testdb`.`test_table` VALUES('aliyun02', 1002, 10.2);
INSERT INTO `testdb`.`test_table` VALUES('aliyun03', 1003, 10.3);
INSERT INTO `testdb`.`test_table` VALUES('aliyun04', 1004, 10.4);
INSERT INTO `testdb`.`test_table` VALUES('aliyun05', 1005, 10.5);

#SQL Server 建表语句:
CREATE TABLE [testdb].[dbo].[test_table] (
 [name] varchar(32) NULL,
 [age] int  NULL,
 [score] float NULL
)
#SQL Server 插入数据语句:
INSERT INTO [testdb].[dbo].[test_table] VALUES('aliyun01', 1001, 10.1);
INSERT INTO [testdb].[dbo].[test_table] VALUES('aliyun02', 1002, 10.2);
INSERT INTO [testdb].[dbo].[test_table] VALUES('aliyun03', 1003, 10.3);
INSERT INTO [testdb].[dbo].[test_table] VALUES('aliyun04', 1004, 10.4);
INSERT INTO [testdb].[dbo].[test_table] VALUES('aliyun05', 1005, 10.5);

#PostgreSQL 建表语句:
CREATE TABLE "testdb"."public"."test_table" (
 "name" varchar(32) NULL,
 "age" int  NULL,
 "score" double precision  NULL
)
#PostgreSQL 插入数据语句:
INSERT INTO "testdb"."public"."test_table" VALUES('aliyun01', 1001, 10.1);
INSERT INTO "testdb"."public"."test_table" VALUES('aliyun02', 1002, 10.2);
INSERT INTO "testdb"."public"."test_table" VALUES('aliyun03', 1003, 10.3);
INSERT INTO "testdb"."public"."test_table" VALUES('aliyun04', 1004, 10.4);
INSERT INTO "testdb"."public"."test_table" VALUES('aliyun05', 1005, 10.5);

使用“数据工作台”>“作业管理”运行样例-RDS MySQL版

步骤1:通过“资源管理”上传样例代码Jar包

下载样例代码JAR包“spark-examples-0.0.1-SNAPSHOT.jar”以及依赖JAR包到本地目录。

wget https://spark-home.oss-cn-shanghai.aliyuncs.com/spark_example/spark-examples-0.0.1-SNAPSHOT.jar
wget https://spark-home.oss-cn-shanghai.aliyuncs.com/spark_connectors/mysql-connector-java-5.1.34.jar
wget https://spark-home.oss-cn-shanghai.aliyuncs.com/spark_connectors/mysql-connector-java-8.0.16.jar

在“数据工作台”>“资源管理”中添加文件夹“spark_on_rds”。上传JAR包“spark-examples-0.0.1-SNAPSHOT.jar”,“mysql-connector-java-5.1.34.jar”,”mysql-connector-java-8.0.16.jar”到/spark_on_rds/文件夹。如下图:

步骤2:通过“作业管理”创建并编辑作业内容

注意目前云上RDS MySQL主要由5.x和8.x两个系列,这两个系列需要使用的mysql-connector不同。

  • 如果访问的MySQL为8.x系列,在“数据工作台”>“作业管理”中创建Spark作业,作业内容如下:

    --class com.aliyun.spark.rds.SparkOnRDSMySQLSparkSession
    --jars /spark_on_rds/mysql-connector-java-8.0.16.jar
    --driver-memory 1G 
    --driver-cores 1
    --executor-cores 1
    --executor-memory 2G
    --num-executors 1
    --name spark_on_rds
    /spark_on_rds/spark-examples-0.0.1-SNAPSHOT.jar
    rm-xxx.mysql.rds.aliyuncs.com:3306 testdb test_table xxx1 xxx2 spark_on_rds01
  • 如果访问的MySQL为8.x系列,在“数据工作台”>“作业管理”中创建Spark作业,作业内容如下:

    --class com.aliyun.spark.rds.SparkOnRDSMySQLSparkSession
    --jars /spark_on_rds/mysql-connector-java-5.1.34.jar
    --driver-memory 1G 
    --driver-cores 1
    --executor-cores 1
    --executor-memory 2G
    --num-executors 1
    --name spark_on_rds
    /spark_on_rds/spark-examples-0.0.1-SNAPSHOT.jar
    rm-xxx.mysql.rds.aliyuncs.com:3306 testdb test_table xxx1 xxx2 spark_on_rds01

作业内容参数说明:

参数 说明
rm-xxx.mysql.rds.aliyuncs.com:3306 RDS MySQL版的数据库连接的“内网地址”和“内网端口”。
testdb test_table 分别为RDS MySQL版的数据库名和表名。
xxx1 xxx2 分别为RDS MySQL版的数据库登录的用户名和密码。
spark_on_rds01 Spark中创建映射RDS MySQL版数据库表的表名。

如下图:

步骤3:通过“作业管理”运行作业并查看结果

作业编辑完成后单击“运行”,选择Spark集群。运行状态会在下侧显示,如图:

运行成功后单击“YarnUI”,翻到最后看到如下结果表明Spark读取RDS MySQL成功。如下:

+--------+----+-----+
|    name| age|score|
+--------+----+-----+
|aliyun01|1001| 10.1|
+--------+----+-----+

使用“交互式查询”运行样例

步骤1:通过“会话管理”创建会话

在“数据工作台”>“会话管理”中单击“创建会话”。填写“会话名称”:spark_on_rds,选择需要执行的Spark集群。这里同样需要确认是MySQL 8.x还是MySQL 5.x系列,选择不同版本的mysql-connector。

单击“确认”后,编辑“会话内容”,内容如下:

--name spark_on_rds
--driver-memory 1G 
--driver-cores 1
--executor-cores 1
--executor-memory 2G
--num-executors 1
--jars /spark_on_rds/mysql-connector-java-5.1.34.jar

内容编辑完成后,单击“运行”(此处单击运行是为了下一步骤中可以选择会话“spark_on_rds”)。

步骤2:通过“交互式查询”创建查询

进入“数据工作台”>“交互式查询”,在“会话列表”下拉框中选择“spark_on_rds”,然后单击“新建查询”。填写“查询名称”:spark_on_rds,“查询类型”选择“sql”。如下图:

步骤3:通过“交互式查询”编辑查询

查询输入如下内容:

CREATE TABLE spark_on_rds101 USING org.apache.spark.sql.jdbc
  options (
    driver 'com.mysql.jdbc.Driver',
    url 'jdbc:mysql://rm-xxx.mysql.rds.aliyuncs.com:3306',
    dbtable 'testdb.test_table',
    user 'xxx1',
    password 'xxx2'
  )

如下图:

建表语句关键字说明:

关键字 说明
rm-xxx.mysql.rds.aliyuncs.com:3306 RDS MySQL版的数据库连接的“内网地址”和“内网端口”。
testdb test_table 分别为RDS MySQL版的数据库名和表名。
xxx1 xxx2 分别为RDS MySQL版的数据库登录的用户名和密码。
spark_on_rds101 Spark中创建映射RDS MySQL版数据库表的表名。

步骤4:通过“交互式查询”运行查询

编辑查询后,单击“运行”;运行成功后,在“查询内容”中输入“select * from spark_on_rds101”,然后单击“运行”验证结果,出现如下结果表示运行成功。如下图:

使用“数据工作台”>“作业管理”运行样例-RDS SQL Server版

步骤1:通过“资源管理”上传样例代码Jar包

下载样例代码jar包“spark-examples-0.0.1-SNAPSHOT.jar”以及依赖JAR包到本地目录。

wget https://spark-home.oss-cn-shanghai.aliyuncs.com/spark_example/spark-examples-0.0.1-SNAPSHOT.jar
wget https://spark-home.oss-cn-shanghai.aliyuncs.com/spark_connectors/sqljdbc42.jar

在“数据工作台”>“资源管理”中添加文件夹“spark_on_rds”。上传jar包“spark-examples-0.0.1-SNAPSHOT.jar”以及“sqljdbc42.jar”到此文件夹。如下图:

步骤2:通过“作业管理”创建并编辑作业内容

在“数据工作台”>“作业管理”中创建Spark作业,作业内容如下:

--class com.aliyun.spark.rds.SparkOnRDSSqlServerSparkSession
--jars /spark_on_rds/sqljdbc42.jar
--driver-memory 1G 
--driver-cores 1
--executor-cores 1
--executor-memory 2G
--num-executors 1
--name spark_on_rds
/spark_on_rds/spark-examples-0.0.1-SNAPSHOT.jar
rm-xxx.sqlserver.rds.aliyuncs.com:1433 testdb dbo test_table xxx1 xxx2 spark_on_rds02

作业内容参数说明:

参数 说明
rm-xxx.sqlserver.rds.aliyuncs.com:1433 RDS SQL Server版的数据库连接的“内网地址”和“内网端口”。
testdb dbo test_table 分别为RDS SQL Server版的数据库名、schema(架构)名和表名。
xxx1 xxx2 分别为RDS SQL Server版的数据库登录的用户名和密码。
spark_on_rds02 Spark中创建映射RDS SQL Server版数据库表的表名。

如下图:

步骤3:通过“作业管理”运行作业并查看结果

作业编辑完成后单击“运行”,选择Spark集群。运行状态会在下侧显示,如图:

运行成功后单击“YarnUI”,翻到最后看到如下结果表明Spark读取RDS SQL Server成功。如下:

+--------+----+-----+
|    name| age|score|
+--------+----+-----+
|aliyun01|1001| 10.1|
+--------+----+-----+

使用“交互式查询”运行样例

步骤1:通过“会话管理”创建会话

在“数据工作台”>“会话管理”中单击“创建会话”。填写“会话名称”:spark_on_rds, 选择需要执行的Spark集群。

单击“确认”后,编辑“会话内容”,内容如下:

--name spark_on_rds
--driver-memory 1G 
--driver-cores 1
--executor-cores 1
--executor-memory 2G
--num-executors 1
--jars /spark_on_rds/sqljdbc42.jar

内容编辑完成后,单击“运行”(此处单击运行是为了下一步骤中可以选择会话“spark_on_rds”)。

步骤2:通过“交互式查询”创建查询

进入“数据工作台”>“交互式查询”,在“会话列表”下拉框中选择“spark_on_rds”,然后单击“新建查询”。填写“查询名称”:spark_on_rds,“查询类型”选择“sql”。如下图:

步骤3:通过“交互式查询”编辑查询

查询输入如下内容:

CREATE TABLE spark_on_rds101 USING org.apache.spark.sql.jdbc
    options (
    driver 'com.microsoft.sqlserver.jdbc.SQLServerDriver',
    url 'jdbc:sqlserver://rm-xxx.sqlserver.rds.aliyuncs.com:1433;DatabaseName=testdb',
    dbtable 'dbo.test_table',
    user 'xxx1',
    password 'xxx2'
)

如下图:

建表语句关键字说明:

关键字 说明
rm-xxx.sqlserver.rds.aliyuncs.com:1433 RDS SQL Server版的数据库连接的“内网地址”和“内网端口”。
testdb dbo test_table 分别为RDS SQL Server版的数据库名、schema(架构)名和表名。
xxx1 xxx2 分别为RDS SQL Server版的数据库登录的用户名和密码。
spark_on_rds101 Spark中创建映射RDS SQL Server版数据库表的表名。

步骤4:通过“交互式查询”运行查询

编辑查询后,单击“运行”;运行成功后,在“查询内容”中输入“select * from spark_on_rds101”,然后单击“运行”验证结果,出现如下结果表示运行成功。如下图:

使用“数据工作台”>“作业管理”运行样例-RDS PostgreSQL版

步骤1:通过“资源管理”上传样例代码Jar包

下载样例代码jar包“spark-examples-0.0.1-SNAPSHOT.jar”以及依赖jar包到本地目录。

wget https://spark-home.oss-cn-shanghai.aliyuncs.com/spark_example/spark-examples-0.0.1-SNAPSHOT.jar
wget https://spark-home.oss-cn-shanghai.aliyuncs.com/spark_connectors/postgresql-42.2.5.jar

在“数据工作台”>“资源管理”中添加文件夹“spark_on_rds”。上传jar包“spark-examples-0.0.1-SNAPSHOT.jar”以及“postgresql-42.2.5.jar”到此文件夹。如下图:

步骤2:通过“作业管理”创建并编辑作业内容

在“数据工作台”>“作业管理”中创建Spark作业,作业内容如下:

--class com.aliyun.spark.rds.SparkOnRDSPostgreSQLSparkSession
--jars /spark_on_rds/postgresql-42.2.5.jar
--driver-memory 1G 
--driver-cores 1
--executor-cores 1
--executor-memory 2G
--num-executors 1
--name spark_on_rds
/spark_on_rds/spark-examples-0.0.1-SNAPSHOT.jar
rm-xxx.pg.rds.aliyuncs.com:3433 testdb public test_table xxx1 xxx2 spark_on_rds03

作业内容参数说明:

参数 说明
rm-xxx.pg.rds.aliyuncs.com:3433 RDS PostgreSQL版的数据库连接的“内网地址”和“内网端口”。
testdb public test_table 分别为RDS PostgreSQL版的据库名、schema(模式)名和表名。
xxx1 xxx2 分别为RDS PostgreSQL版的数据库登录的用户名和密码。
spark_on_rds03 Spark中创建映射RDS PostgreSQL版数据库表的表名。

如下图:

步骤3:通过“作业管理”运行作业并查看结果

作业编辑完成后单击“运行”,选择Spark集群。运行状态会在下侧显示,如图:

运行成功后单击“YarnUI”,翻到最后看到如下结果表明Spark读取RDS PostgreSQL成功。如下:

+--------+----+-----+
|    name| age|score|
+--------+----+-----+
|aliyun01|1001| 10.1|
+--------+----+-----+

使用“交互式查询”运行样例

步骤1:通过“会话管理”创建会话

在“数据工作台”>“会话管理”中单击“创建会话”。填写“会话名称”:spark_on_rds, 选择需要执行的Spark集群。

单击“确认”后,编辑“会话内容”,内容如下:

--name spark_on_rds
--driver-memory 1G 
--driver-cores 1
--executor-cores 1
--executor-memory 2G
--num-executors 1
--jars /spark_on_rds/postgresql-42.2.5.jar

内容编辑完成后,单击“运行”(此处单击运行是为了下一步骤中可以选择会话“spark_on_rds”)。

步骤2:通过“交互式查询”创建查询

进入“数据工作台”>“交互式查询”,在“会话列表”下拉框中选择“spark_on_rds”,然后单击“新建查询”。填写“查询名称”:spark_on_rds,“查询类型”选择“sql”。如下图:

步骤3:通过“交互式查询”编辑查询

查询输入如下内容:

CREATE TABLE spark_on_rds101 USING org.apache.spark.sql.jdbc
    options (
    driver 'org.postgresql.Driver',
    url 'jdbc:postgresql://rm-xxx.pg.rds.aliyuncs.com:3433/testdb',
    dbtable 'public.test_table',
    user 'xxx1',
    password 'xxx2'
)

如下图:

建表语句关键字说明:

关键字 说明
rm-xxx.pg.rds.aliyuncs.com:3433 RDS PostgreSQL版的数据库连接的“内网地址”和“内网端口”。
testdb public test_table 分别为RDS PostgreSQL版的据库名、schema(模式)名和表名。
xxx1 xxx2 分别为RDS PostgreSQL版的数据库登录的用户名和密码。
spark_on_rds03 Spark中创建映射RDS PostgreSQL版数据库表的表名。

步骤4:通过“交互式查询”运行查询

编辑查询后,单击“运行”;运行成功后,在“查询内容”中输入“select * from spark_on_rds101”,然后单击“运行”验证结果,出现如下结果表示运行成功。如下图:

小结