AnalyticDB for MySQL支援訪問同帳號或其他阿里雲帳號(跨帳號)下RDS MySQL中的資料。您可以通過ENI和SSL鏈路兩種方式訪問RDS MySQL資料,SSL鏈路訪問RDS MySQL資料時可以加密網路連接,保證資料的安全性,對比ENI訪問方式更加安全。本文主要介紹通過ENI和SSL鏈路訪問RDS MySQL資料的具體方法。
前提條件
AnalyticDB for MySQL叢集的產品系列為湖倉版。
AnalyticDB for MySQL叢集與RDS MySQL執行個體位於同一地區。具體操作,請參見建立叢集和建立RDS MySQL執行個體。
已在AnalyticDB for MySQL叢集中建立Job型資源群組。具體操作,請參見建立資源群組。
已建立AnalyticDB for MySQL叢集的資料庫帳號。
如果是通過阿里雲帳號訪問,只需建立高許可權帳號。具體操作,請參見建立高許可權帳號。
如果是通過RAM使用者訪問,需要建立高許可權帳號和普通帳號並且將RAM使用者綁定到普通帳號上。具體操作,請參見建立資料庫帳號和綁定或解除綁定RAM使用者與資料庫帳號。
已將RDS MySQL執行個體添加到安全性群組中,且安全性群組規則的入方向與出方向允許存取RDS MySQL連接埠的訪問請求。具體操作,請參見設定安全性群組和添加安全性群組規則。
已開通OSS服務,並建立與AnalyticDB for MySQL叢集位於相同地區的儲存空間。具體操作,請參見開通OSS服務和建立儲存空間。
已完成授權操作。具體操作,請參見帳號授權。
重要同帳號訪問時,需具備AliyunADBSparkProcessingDataRole許可權;跨帳號訪問時,需要對其他阿里雲帳號授權。
資料準備
在RDS MySQL中建立資料庫和表,並插入資料。樣本語句如下:
CREATE DATABASE `test`;
CREATE TABLE `test`.`persons` (
`id` int(11) DEFAULT NULL,
`first_name` varchar(32) DEFAULT NULL,
`laster_name` varchar(32) DEFAULT NULL,
`age` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
;
INSERT INTO persons VALUES(1,'a','b',5);
INSERT INTO persons VALUES(2,'c','d',6);
INSERT INTO persons VALUES(3,'e','f',7);
通過ENI訪問RDS MySQL資料
上傳驅動程式及Spark作業依賴的Jar包
編寫訪問RDS MySQL表的樣本程式(即Spark作業依賴的Jar包),並進行編譯打包。本文產生的Jar包名稱為
rds_test.jar
。範例程式碼如下:package com.aliyun.spark import org.apache.spark.sql.SparkSession object SparkRDS { def main(args: Array[String]): Unit = { val sparkSession = SparkSession.builder() .appName("rds mysql test") .getOrCreate() // RDS MySQL執行個體的內網地址。查看方法,請參見查看或修改內外網地址和連接埠。 val url = "jdbc:mysql://rm-bp11mpql1e01****.mysql.rds.aliyuncs.com" // RDS MySQL的表名。格式為"db_name.table_name"。 val dbtable = "test.persons" // 串連RDS MySQL資料庫的帳號。 val user = "mysql_username" // RDS MySQL資料庫帳號的密碼。 val password = "mysql_password" val jdbcDF = sparkSession.read .format("jdbc") .option("url", url) .option("driver", "com.mysql.jdbc.Driver") .option("dbtable", dbtable) .option("user", user) .option("password", password) .load() jdbcDF.show() } }
在官方網站下載適配RDS MySQL版本的驅動程式。下載地址,請參見https://dev.mysql.com/downloads/connector/j/。
本文以mysql-connector-java-8.0.11.jar為例。
將Spark作業依賴的Jar包及RDS MySQL驅動程式上傳至OSS中。具體操作,請參見上傳檔案。
同帳號訪問RDS MySQL資料
登入雲原生資料倉儲AnalyticDB MySQL控制台,在左上方選擇叢集所在地區。在左側導覽列,單擊集群清單。在集群清單上方,選擇產品系列,然後單擊目的地組群ID。
在左側導覽列,單擊
。在編輯器視窗上方,選擇Job型資源群組和作業類型。本文以Batch類型為例。
在編輯器中輸入以下作業內容。
{ "name": "rds-mysql-example", "jars": [ "oss://testBucketName/mysql-connector-java-8.0.11.jar" ], "file": "oss://testBucketName/rds_test.jar", "className": "com.aliyun.spark.SparkRDS", "conf": { "spark.adb.eni.enabled": "true", "spark.adb.eni.vswitchId": "vsw-bp17jqw3lrrobn6y****", "spark.adb.eni.securityGroupId": "sg-bp163uxgt4zandx****", "spark.driver.resourceSpec": "small", "spark.executor.instances": 1, "spark.executor.resourceSpec": "small" } }
參數說明:
參數
說明
name
Spark作業名稱。
jars
RDS MySQL驅動程式所在的OSS路徑。
本文樣本為mysql-connector-java-8.0.11.jar包所在的OSS路徑。
file
Spark作業依賴的Jar包所在的OSS路徑。
className
Java或者Scala程式入口類名稱。
本文樣本為com.aliyun.spark.SparkRDS。
spark.adb.eni.enabled
開啟ENI訪問。
spark.adb.eni.vswitchId
交換器ID。在RDS MySQL執行個體的資料庫連接頁面,將滑鼠移動至VPC處,擷取交換器ID。
spark.adb.eni.securityGroupId
RDS MySQL執行個體中添加的安全性群組ID。如未添加安全性群組,請參見設定安全性群組。
conf其他參數
與開源Spark中的配置項基本一致,參數格式為
key:value
形式,多個參數之間以英文逗號(,)分隔。更多應用配置參數,請參見Spark應用配置參數說明。單擊運行。
Spark作業執行成功後,您可以在Spark日誌中查看RDS MySQL表的資料。如何查看日誌,請參見查看Spark應用資訊。
跨帳號訪問RDS MySQL資料
登入雲原生資料倉儲AnalyticDB MySQL控制台,在左上方選擇叢集所在地區。在左側導覽列,單擊集群清單。在集群清單上方,選擇產品系列,然後單擊目的地組群ID。
在左側導覽列,單擊
。在編輯器視窗上方,選擇Job型資源群組和作業類型。本文以Batch類型為例。
在編輯器中輸入以下作業內容。
{ "name": "rds-mysql-example", "jars": [ "oss://testBucketName/mysql-connector-java-8.0.11.jar" ], "file": "oss://testBucketName/rds_test.jar", "className": "com.aliyun.spark.SparkRDS", "conf": { "spark.adb.eni.enabled": "true", "spark.adb.eni.vswitchId": "vsw-bp17jqw3lrrobn6y****", "spark.adb.eni.securityGroupId": "sg-bp163uxgt4zandx****", "spark.driver.resourceSpec": "small", "spark.executor.instances": 1, "spark.executor.resourceSpec": "small" "spark.adb.eni.roleArn":"acs:ram::testAccountID:role/testUserName" } }
參數說明:
參數
說明
spark.adb.eni.roleArn
跨帳號訪問RDS資料來源時使用的RAM角色。多個角色之間使用英文逗號(,)隔開。格式為
acs:ram::testAccountID:role/testUserName
。testAccountID
:RDS資料來源所屬的阿里雲帳號ID。testUserName
:跨帳號授權時建立的RAM角色。詳細資料,請參見跨帳號授權。
更多參數,請參見參數說明。
單擊運行。
Spark作業執行成功後,您可以在Spark日誌中查看RDS MySQL表的資料。如何查看日誌,請參見查看Spark應用資訊。
通過SSL鏈路訪問RDS MySQL資料
通過SSL鏈路訪問RDS MySQL資料時,RDS MySQL執行個體需開啟SSL加密,且開啟SSL加密時必須選擇加密內網鏈路。具體操作,請參見使用雲端認證快速開啟SSL鏈路加密。
下載CA認證並上傳至OSS
上傳驅動程式及Spark作業依賴的Jar包
編寫訪問RDS MySQL表的樣本程式,並進行編譯打包。本文產生的Jar包名稱為
test.jar
。範例程式碼如下:package org.example import org.apache.spark.sql.SparkSession object Test { def main(args: Array[String]): Unit = { // JKS檔案所在的OSS路徑oss://testBucketName/folder/ApsaraDB-CA-Chain.jks。 val JKS_FILE_PATH = args(0) // 串連RDS MySQL資料庫的帳號。 val USERNAME = args(1) // RDS MySQL資料庫帳號的密碼。 val PASSWORD = args(2) // RDS MySQL的資料庫名。 val DATABASE_NAME = args(3) // RDS MySQL的表名。 val TABLE_NAME = args(4) // RDS MySQL執行個體的內網地址。 val mysqlUrl = "jdbc:mysql://rm-bp11mpql1e01****.mysql.rds.aliyuncs.com:3306/?" + "useSSL=true" + s"&trustCertificateKeyStoreUrl=file:///tmp/testBucketName/folder/ApsaraDB-CA-Chain.jks" + "&trustCertificateKeyStorePassword=apsaradb" + "&trustCertificateKeyStoreType=JKS" + val spark = SparkSession.builder().getOrCreate() spark.read.format("jdbc") .option("driver", "com.mysql.cj.jdbc.Driver") .option("url", mysqlUrl) .option("user", USERNAME) .option("password", PASSWORD) .option("dbtable", s"${DATABASE_NAME}.${TABLE_NAME}") .load() .show() } }
參數說明:
參數
說明
useSSL
是否使用SSL加密連結。取值:
true:是。
false(預設值):否。
本文樣本需選擇true。
trustCertificateKeyStoreUrl
JKS認證所在的本地路徑,格式為
file:///tmp/<JKS_FILE_PATH>
,其中,JKS_FILE_PATH
為JKS認證所在的OSS路徑。例如:JKS認證所在的OSS路徑為
oss://testBucketName/folder/ApsaraDB-CA-Chain.jks
,則JKS認證所在的本地路徑為file:///tmp/testBucketName/folder/ApsaraDB-CA-Chain.jks
。trustCertificateKeyStorePassword
JKS認證的密碼,固定為apsaradb。
trustCertificateKeyStoreType
認證的儲存格式,固定為JKS。
將
test.jar
包上傳至OSS中。具體操作,請參見上傳檔案。
同帳號訪問RDS MySQL資料
登入雲原生資料倉儲AnalyticDB MySQL控制台,在左上方選擇叢集所在地區。在左側導覽列,單擊集群清單。在集群清單上方,選擇產品系列,然後單擊目的地組群ID。
在左側導覽列,單擊
。在編輯器視窗上方,選擇Job型資源群組和作業類型。本文以Batch類型為例。
在編輯器中輸入以下作業內容。
{ "file": "oss://testBucketName/test.jar", "className": "org.example.Test", "name": "MYSQL PEM Test", "conf": { "spark.kubernetes.driverEnv.ADB_SPARK_DOWNLOAD_FILES": "oss://testBucketName/folder/ApsaraDB-CA-Chain.jks", "spark.executorEnv.ADB_SPARK_DOWNLOAD_FILES": "oss://testBucketName/folder/ApsaraDB-CA-Chain.jks", "spark.driver.resourceSpec": "small", "spark.executor.instances": 1, "spark.executor.resourceSpec": "small", "spark.adb.eni.enabled": "true", "spark.adb.eni.vswitchId": "vsw-bp17jqw3lrrobn6y****", "spark.adb.eni.securityGroupId": "sg-bp163uxgt4zandx****" } }
參數說明:
參數
說明
name
Spark作業名稱。
file
Spark作業依賴的Jar包所在的OSS路徑。
className
Java或者Scala程式入口類名稱。
本文樣本為org.example.Test。
spark.kubernetes.driverEnv.ADB_SPARK_DOWNLOAD_FILES
Spark Driver節點參數,用於指定JKS認證所在的OSS路徑。多個JKS認證中間用英文逗號(,)分隔。例如:
spark.kubernetes.driverEnv.ADB_SPARK_DOWNLOAD_FILES: "oss://testBucketName/a.jks,oss://testBucketName/b.jks"
。spark.executorEnv.ADB_SPARK_DOWNLOAD_FILES
Spark Executor節點參數,用於指定JKS認證所在的OSS路徑。多個JKS認證中間用英文逗號(,)分隔。例如:
spark.executor.ADB_SPARK_DOWNLOAD_FILES: "oss://testBucketName/a.jks,oss://testBucketName/b.jks"
。spark.adb.eni.enabled
開啟ENI訪問。
spark.adb.eni.vswitchId
交換器ID。在RDS MySQL執行個體的資料庫連接頁面,將滑鼠移動至VPC處,擷取交換器ID。
spark.adb.eni.securityGroupId
RDS MySQL執行個體中添加的安全性群組ID。如未添加安全性群組,請參見設定安全性群組。
conf其他參數
與開源Spark中的配置項基本一致,參數格式為
key:value
形式,多個參數之間以英文逗號(,)分隔。更多應用配置參數,請參見Spark應用配置參數說明。單擊運行。
Spark作業執行成功後,您可以在Spark日誌中查看RDS MySQL表的資料。如何查看日誌,請參見查看Spark應用資訊。
跨帳號訪問RDS MySQL資料
登入雲原生資料倉儲AnalyticDB MySQL控制台,在左上方選擇叢集所在地區。在左側導覽列,單擊集群清單。在集群清單上方,選擇產品系列,然後單擊目的地組群ID。
在左側導覽列,單擊
。在編輯器視窗上方,選擇Job型資源群組和作業類型。本文以Batch類型為例。
在編輯器中輸入以下作業內容。
{ "file": "oss://testBucketName/test.jar", "className": "org.example.Test", "name": "MYSQL PEM Test", "conf": { "spark.kubernetes.driverEnv.ADB_SPARK_DOWNLOAD_FILES": "oss://testBucketName/folder/ApsaraDB-CA-Chain.jks", "spark.executorEnv.ADB_SPARK_DOWNLOAD_FILES": "oss://testBucketName/folder/ApsaraDB-CA-Chain.jks", "spark.driver.resourceSpec": "small", "spark.executor.instances": 1, "spark.executor.resourceSpec": "small", "spark.adb.eni.enabled": "true", "spark.adb.eni.vswitchId": "vsw-bp17jqw3lrrobn6y****", "spark.adb.eni.securityGroupId": "sg-bp163uxgt4zandx****", "spark.adb.eni.roleArn":"acs:ram::testAccountID:role/testUserName", } }
參數說明:
參數
說明
spark.adb.eni.roleArn
跨帳號訪問RDS資料來源時使用的RAM角色。多個角色之間使用英文逗號(,)隔開。格式為
acs:ram::testAccountID:role/testUserName
。testAccountID
:RDS資料來源所屬的阿里雲帳號ID。testUserName
:跨帳號授權時建立的RAM角色。詳細資料,請參見跨帳號授權。
更多參數,請參見參數說明。
單擊運行。
Spark作業執行成功後,您可以在Spark日誌中查看RDS MySQL表的資料。如何查看日誌,請參見查看Spark應用資訊。