全部產品
Search
文件中心

AnalyticDB:訪問RDS MySQL資料來源

更新時間:Jul 06, 2024

AnalyticDB MySQL企業版及湖倉版支援訪問同帳號或其他阿里雲帳號(跨帳號)下RDS MySQL中的資料。您可以通過ENI和SSL鏈路兩種方式訪問RDS MySQL資料,SSL鏈路訪問RDS MySQL資料時可以加密網路連接,保證資料的安全性,對比ENI訪問方式更加安全。本文主要介紹通過ENI和SSL鏈路訪問RDS MySQL資料的具體方法。

前提條件

資料準備

在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包

  1. 編寫訪問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()
      }
    }
  2. 在官方網站下載適配RDS MySQL版本的驅動程式。下載地址,請參見https://dev.mysql.com/downloads/connector/j/

    本文以mysql-connector-java-8.0.11.jar為例。

  3. 將Spark作業依賴的Jar包及RDS MySQL驅動程式上傳至OSS中。具體操作,請參見上傳檔案

同帳號訪問RDS MySQL資料

  1. 在左側導覽列,單擊作業開發 > Spark Jar 開發

  2. 在編輯器視窗上方,選擇Job型資源群組和作業類型。本文以Batch類型為例。

  3. 在編輯器中輸入以下作業內容。

    {
        "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應用配置參數說明

  4. 單擊運行

  5. Spark作業執行成功後,您可以在Spark日誌中查看RDS MySQL表的資料。如何查看日誌,請參見查看Spark應用資訊

跨帳號訪問RDS MySQL資料

  1. 重要

    跨帳號訪問RDS MySQL資料來源時,需使用跨帳號授權時步驟二所建立的RAM使用者登入控制台。詳情請參見帳號授權

  2. 在左側導覽列,單擊作業開發 > Spark Jar 開發

  3. 在編輯器視窗上方,選擇Job型資源群組和作業類型。本文以Batch類型為例。

  4. 在編輯器中輸入以下作業內容。

    {
        "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角色。詳細資料,請參見跨帳號授權

    更多參數,請參見參數說明

  5. 單擊運行

  6. Spark作業執行成功後,您可以在Spark日誌中查看RDS MySQL表的資料。如何查看日誌,請參見查看Spark應用資訊

通過SSL鏈路訪問RDS MySQL資料

通過SSL鏈路訪問RDS MySQL資料時,RDS MySQL執行個體需開啟SSL加密,且開啟SSL加密時必須選擇加密內網鏈路。具體操作,請參見設定SSL加密

下載CA認證並上傳至OSS

  1. 登入RDS管理主控台,在左上方選擇叢集所在地區。在左側導覽列,單擊執行個體列表,單擊目的地組群ID。

  2. 在左側導覽列單擊資料安全性

  3. 單擊下載CA認證

    重要

    CA認證的預設有效期間為1年,到期需要重建。 使用到期的CA認證則無法通過SSL鏈路訪問RDS的資料。

  4. 解壓CA認證壓縮包,並將JKS檔案上傳至OSS中。具體操作,請參見上傳檔案

上傳驅動程式及Spark作業依賴的Jar包

  1. 編寫訪問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

  2. test.jar包上傳至OSS中。具體操作,請參見上傳檔案

同帳號訪問RDS MySQL資料

  1. 登入雲原生資料倉儲AnalyticDB MySQL控制台,在左上方選擇叢集所在地區。在左側導覽列,單擊集群清單,在湖倉版頁簽下,單擊目的地組群ID。

  2. 在左側導覽列,單擊作業開發 > Spark Jar 開發

  3. 在編輯器視窗上方,選擇Job型資源群組和作業類型。本文以Batch類型為例。

  4. 在編輯器中輸入以下作業內容。

    {
      "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應用配置參數說明

  5. 單擊運行

  6. Spark作業執行成功後,您可以在Spark日誌中查看RDS MySQL表的資料。如何查看日誌,請參見查看Spark應用資訊

跨帳號訪問RDS MySQL資料

  1. 重要

    跨帳號訪問RDS MySQL資料來源時,需使用跨帳號授權時步驟二所建立的RAM使用者登入控制台。詳情請參見帳號授權

  2. 在左側導覽列,單擊作業開發 > Spark Jar 開發

  3. 在編輯器視窗上方,選擇Job型資源群組和作業類型。本文以Batch類型為例。

  4. 在編輯器中輸入以下作業內容。

    {
      "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角色。詳細資料,請參見跨帳號授權

    更多參數,請參加參數說明

  5. 單擊運行

  6. Spark作業執行成功後,您可以在Spark日誌中查看RDS MySQL表的資料。如何查看日誌,請參見查看Spark應用資訊