O AnalyticDB for MySQL Data Lakehouse Edition conecta-se ao ApsaraDB RDS for MySQL por meio de jobs do Spark usando dois métodos: interface de rede elástica (ENI) ou conexão SSL. O acesso via ENI é mais simples de configurar. O acesso via SSL adiciona criptografia na camada de transporte, ideal para ambientes com requisitos de segurança de dados mais rigorosos. Ambos os métodos oferecem suporte a cenários de mesma conta e entre contas.
Escolha um método de conexão
|
Método |
Quando usar |
Segurança |
|
ENI |
A instância RDS e o cluster AnalyticDB estão na mesma VPC, ou o acesso entre contas com uma função RAM é aceitável |
Isolamento padrão no nível da VPC |
|
SSL |
Políticas de conformidade exigem conexões criptografadas ou os dados são altamente sensíveis |
Criptografia na camada de transporte (SSL) adicional à VPC |
Pré-requisitos
Antes de começar, verifique se você tem:
Configuração do cluster e da instância:
Um cluster do AnalyticDB for MySQL Data Lakehouse Edition. Consulte Crie um cluster.Data Lakehouse Edition
Uma instância do ApsaraDB RDS for MySQL na mesma região do cluster. Consulte Crie uma instância do ApsaraDB RDS for MySQL.
Um grupo de recursos de job para o cluster. Consulte Crie um grupo de recursos.
Um bucket do Object Storage Service (OSS) na mesma região do cluster. Consulte Ative o OSS e Crie buckets.
Contas e permissões:
-
Uma conta de banco de dados para o cluster do AnalyticDB for MySQL:
Conta Alibaba Cloud: crie uma conta privilegiada. Consulte a seção "Crie uma conta privilegiada" em Crie uma conta de banco de dados.
Usuário do Resource Access Management (RAM): crie uma conta privilegiada e uma conta padrão e associe a conta padrão ao usuário RAM. Consulte Crie uma conta de banco de dados e Associar ou desassociar uma conta de banco de dados a ou de um usuário RAM.
Autorização concluída. Consulte Realizar autorização.
Rede e segurança:
A instância RDS deve estar em um grupo de segurança com regras de entrada e saída que permitam tráfego na porta da instância. Consulte Configure um grupo de segurança para uma instância do ApsaraDB RDS for MySQL e Adicionar uma regra de grupo de segurança.
O acesso na mesma conta requer a permissão AliyunADBSparkProcessingDataRole. O acesso entre contas exige autorização adicional para as outras contas Alibaba Cloud.
Preparar dados
Execute as instruções a seguir na instância do ApsaraDB RDS for MySQL para criar o banco de dados e a tabela de exemplo usados neste tópico:
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);
Acessar o ApsaraDB RDS for MySQL via ENI
Todos os exemplos nesta seção usam spark.adb.eni.enabled: true para rotear o tráfego do job Spark por uma interface de rede elástica até a instância RDS.
Etapa 1: Preparar o driver e o pacote JAR
-
Escreva um programa Spark que leia dados da tabela RDS e compile-o em um pacote JAR. O exemplo abaixo gera um JAR chamado
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() // Internal endpoint of the ApsaraDB RDS for MySQL instance. // See "View and change the endpoints and port numbers" for details. val url = "jdbc:mysql://rm-bp11mpql1e01****.mysql.rds.aliyuncs.com" // Table name in db_name.table_name format val dbtable = "test.persons" // Database account credentials — pass via args or environment variables in production val user = "mysql_username" 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() } } Baixe o driver MySQL Connector/J compatível com a versão do mecanismo da instância RDS em https://dev.mysql.com/downloads/connector/j/. Este exemplo usa
mysql-connector-java-8.0.11.jar.Envie o pacote JAR (
rds_test.jar) e o driver (mysql-connector-java-8.0.11.jar) para o bucket do OSS. Consulte Fazer upload de objetos.
Etapa 2: Enviar o job Spark
Acesso na mesma conta
Faça login no console do AnalyticDB for MySQL. No canto superior esquerdo, selecione uma região. No painel de navegação à esquerda, clique em Clusters. Na página Clusters, clique na aba da edição desejada, localize o cluster e clique no ID correspondente.
No painel de navegação à esquerda, escolha Job Development > Spark JAR Development.
Selecione um grupo de recursos de job e defina o tipo de job como Batch.
-
Cole a configuração a seguir no editor Spark e substitua os valores de espaço reservado:
Parâmetro
Obrigatório
Descrição
nameSim
Nome do job Spark
jarsSim
Caminho no OSS do JAR do driver MySQL Connector/J
fileSim
Caminho no OSS do pacote JAR do job Spark
classNameSim
Classe de entrada da aplicação Java ou Scala. Neste exemplo:
com.aliyun.spark.SparkRDSconfSim
Parâmetros de configuração do Spark no formato
key:value, separados por vírgulas. Consulte Parâmetros de configuração de aplicação Sparkspark.adb.eni.enabledSim
Defina como
truepara ativar o roteamento via ENIspark.adb.eni.vswitchIdSim
ID do vSwitch da instância RDS. Para encontrá-lo, passe o ponteiro do mouse sobre VPC na página Database Connection
spark.adb.eni.securityGroupIdSim
ID do grupo de segurança da instância RDS. Consulte Configure um grupo de segurança para uma instância do ApsaraDB RDS for MySQL
spark.driver.resourceSpecSim
Especificação de recursos para o driver Spark
spark.executor.instancesSim
Número de instâncias de executor Spark
spark.executor.resourceSpecSim
Especificação de recursos para cada executor Spark
{ "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" } } Clique em Run Now.
Após a conclusão do job, visualize o resultado nos logs do job Spark. Consulte a seção Visualize informações sobre uma aplicação Spark no tópico do editor Spark.
Acesso entre contas
Siga as etapas 1 a 3 de Acesso na mesma conta e use a configuração abaixo. Ela adiciona spark.adb.eni.roleArn para assumir uma função RAM na conta proprietária da instância RDS.
{
"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"
}
}
|
Parâmetro |
Obrigatório |
Descrição |
|
|
Sim (apenas entre contas) |
ARN da função RAM usada para acessar a instância RDS entre contas. Separe vários ARNs com vírgulas. Formato: |
Os demais parâmetros são iguais aos da configuração de mesma conta acima.
Clique em Run Now e visualize o resultado nos logs do job Spark.
Acessar o ApsaraDB RDS for MySQL via conexão SSL
Antes de prosseguir, ative a criptografia SSL na instância do ApsaraDB RDS for MySQL e certifique-se de que a conexão pelo endpoint interno esteja criptografada. Consulte Configure o recurso de criptografia SSL.
Etapa 1: Baixe o certificado CA e envie para o OSS
Faça login no console do ApsaraDB RDS. No canto superior esquerdo, selecione uma região. No painel de navegação à esquerda, clique em Instances e clique no ID da instância.
No painel de navegação à esquerda, clique em Data Security.
-
Clique em Download CA Certificate.
ImportanteO certificado CA tem validade de um ano. Após o vencimento, gere um novo. Não é possível estabelecer uma conexão SSL com um certificado expirado.
Descompacte o pacote baixado e envie o arquivo JKS extraído (
ApsaraDB-CA-Chain.jks) para o bucket do OSS. Consulte Fazer upload de objetos.
Etapa 2: Preparar o pacote JAR do Spark
Escreva um programa Spark que se conecte ao RDS via SSL e compile-o em test.jar. O programa lê o caminho do certificado JKS e as credenciais do banco de dados pelos argumentos da linha de comando, evitando valores sensíveis no source:
package org.example
import org.apache.spark.sql.SparkSession
object Test {
def main(args: Array[String]): Unit = {
// OSS path of the JKS certificate file, e.g. oss://testBucketName/folder/ApsaraDB-CA-Chain.jks
val JKS_FILE_PATH = args(0)
// Database account credentials
val USERNAME = args(1)
val PASSWORD = args(2)
// Database and table names
val DATABASE_NAME = args(3)
val TABLE_NAME = args(4)
// Internal endpoint of the ApsaraDB RDS for MySQL instance.
// The JKS file is downloaded to /tmp/<OSS_PATH> at runtime by the ADB_SPARK_DOWNLOAD_FILES setting.
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()
}
}
A URL de conexão JDBC usa os seguintes parâmetros SSL:
|
Parâmetro |
Valor |
Obrigatório |
Descrição |
|
|
|
Sim |
Ativa a criptografia SSL para a conexão JDBC |
|
|
|
Sim |
Caminho local do arquivo de certificado JKS. O ambiente de execução mapeia o caminho do OSS para |
|
|
|
Sim |
Senha fixa para o arquivo de certificado JKS |
|
|
|
Sim |
Formato de armazenamento do certificado |
Envie o arquivo test.jar para o bucket do OSS. Consulte Fazer upload de objetos.
Etapa 3: Enviar o job Spark
Acesso na mesma conta
Faça login no console do AnalyticDB for MySQL. Selecione uma região, clique em Clusters, localize o cluster e clique no ID correspondente.
No painel de navegação à esquerda, escolha Job Development > Spark JAR Development.
Selecione um grupo de recursos de job e defina o tipo de job como Batch.
-
Cole a configuração a seguir no editor Spark:
Parâmetro
Obrigatório
Descrição
nameSim
Nome do job Spark
fileSim
Caminho no OSS do pacote JAR do job Spark
classNameSim
Classe de entrada da aplicação Java ou Scala. Neste exemplo:
org.example.TestconfSim
Parâmetros de configuração do Spark no formato
key:value, separados por vírgulas. Consulte Parâmetros de configuração de aplicação Sparkspark.kubernetes.driverEnv.ADB_SPARK_DOWNLOAD_FILESSim
Caminho no OSS do arquivo de certificado JKS para o driver Spark. Separe vários arquivos com vírgulas. Exemplo:
oss://testBucketName/a.jks,oss://testBucketName/b.jksspark.executorEnv.ADB_SPARK_DOWNLOAD_FILESSim
Caminho no OSS do arquivo de certificado JKS para o executor Spark. Separe vários arquivos com vírgulas
spark.adb.eni.enabledSim
Defina como
truepara ativar o roteamento via ENIspark.adb.eni.vswitchIdSim
ID do vSwitch da instância RDS. Encontre-o passando o mouse sobre VPC na página Database Connection
spark.adb.eni.securityGroupIdSim
ID do grupo de segurança da instância RDS. Consulte Configure um grupo de segurança para uma instância do ApsaraDB RDS for MySQL
spark.driver.resourceSpecSim
Especificação de recursos para o driver Spark
spark.executor.instancesSim
Número de instâncias de executor Spark
spark.executor.resourceSpecSim
Especificação de recursos para cada executor Spark
{ "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****" } } Clique em Run Now.
Após a conclusão do job, visualize o resultado nos logs do job Spark. Consulte a seção Visualize informações sobre uma aplicação Spark no tópico do editor Spark.
Acesso entre contas
Siga as etapas 1 a 3 de Acesso na mesma conta e adicione spark.adb.eni.roleArn à configuração:
{
"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"
}
}
O parâmetro spark.adb.eni.roleArn é o único adicional. Seu formato e comportamento seguem a descrição em Acesso entre contas para o método ENI.
Clique em Run Now e visualize o resultado nos logs do job Spark.