Conexiones de JDBC - AWS Glue

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Conexiones de JDBC

Algunos tipos de bases de datos, normalmente relacionales, admiten la conexión a través del estándar JDBC. Para obtener más información sobre JDBC, consulte la Java JDBC API documentation. AWS Glue admite de forma nativa la conexión a determinadas bases de datos a través de sus conectores JDBC; las bibliotecas JDBC se proporcionan en los trabajos de Glue Spark AWS. Al conectarse a estos tipos de bases de datos mediante las bibliotecas de GlueAWS , tiene acceso a un conjunto estándar de opciones.

Entre los valores de ConnectionType de JDBC, se incluyen los siguientes:

  • "connectionType": "sqlserver": designa una conexión a una base de datos Microsoft SQL Server.

  • "connectionType": "mysql": designa una conexión a una base de datos MySQL.

  • "connectionType": "oracle": designa una conexión a una base de datos Oracle.

  • "connectionType": "postgresql": designa una conexión a una base de datos PostgreSQL.

  • "connectionType": "redshift": designa una conexión a una base de datos de Amazon Redshift. Para obtener más información, consulte Conexiones Redshift.

En la siguiente tabla, se muestran las versiones del controlador JDBC que AWS Glue admite.

Producto Versiones del controlador JDBC para Glue 4.0 Versiones del controlador JDBC para Glue 3.0 Versiones del controlador JDBC para Glue 0.9, 1.0, 2.0
Microsoft SQL Server 9.4.0 7.x 6.x
MySQL 8.0.23 8.0.23 5.1
Oracle Database 21.7 21.1 11.2
PostgreSQL 42.3.6 42.2.18 42.1.x
MongoDB 4.7.2 4.0.0 2.0.0
Amazon Redshift * redshift-jdbc42-2.1.0.16 redshift-jdbc41-1.2.12.1017 redshift-jdbc41-1.2.12.1017

* En el caso del tipo de conexión de Amazon Redshift, todos los demás pares nombre/valor que estén presentes en las opciones de una conexión JDBC, incluidas las opciones de formato, se pasan directamente al DataSource SparkSQL subyacente. En los trabajos de Glue with Spark AWS en Glue 4.0 AWS y versiones posteriores, el conector nativo de Glue AWS para Amazon Redshift utiliza la integración de Amazon Redshift para Apache Spark. Para obtener más información, consulte Integración de Amazon Redshift para Apache Spark. En versiones anteriores, consulte el origen de datos de Amazon Redshift para Spark.

Para configurar su VPC de Amazon para que se conecte a los almacenes de datos de Amazon RDS mediante JDBC, consulte Configuración de una VPC de Amazon para conexiones JDBC a los almacenes de datos de Amazon RDS de AWS Glue.

nota

Los trabajos de AWS Glue solo se asocian a una subred durante una ejecución. Esto puede afectar a su capacidad de conectarse a diversos orígenes de datos a través del mismo trabajo. Este comportamiento no se limita a los orígenes de JDBC.

Referencia de opciones de conexión de JDBC

Si ya tiene definida una conexión JDBC de Glue AWS, puede reutilizar las propiedades de configuración definidas en ella, como url, usuario y contraseña; de este modo, no tendrá que especificarlas en el código como opciones de conexión. Esta característica solo está disponible en Glue 3.0 AWS o versiones posteriores. Para ello, utilice las siguientes propiedades de conexión:

  • "useConnectionProperties": configúrelo en “true” para indicar que desea utilizar la configuración desde una conexión.

  • "connectionName": ingrese el nombre de la conexión desde la que recuperará la configuración. La conexión debe definirse en la misma región que el trabajo.

Utilice estas opciones con las conexiones JDBC:

  • "url": (obligatorio) la URL de JDBC de la base de datos.

  • "dbtable": (Obligatorio) la tabla de la base de datos de la que se va a leer. Para almacenes de datos de JDBC que admiten esquemas dentro de una base de datos, especifique schema.table-name. Si no se ha proporcionado un esquema, se usa el esquema "public" predeterminado.

  • "user": (obligatorio) nombre de usuario que se va a utilizar para establecer la conexión.

  • "password": (obligatorio) contraseña que se utilizará para establecer la conexión.

  • (Opcional) las siguientes opciones le permiten proporcionar un controlador JDBC personalizado. Utilice estas opciones si debe utilizar un controlador que AWS Glue no admita de forma nativa.

    Los trabajos de ETL pueden utilizar diferentes versiones de controladores JDBC para el origen y el destino de los datos, incluso aunque el origen y el destino sean el mismo producto de base de datos. Esto le permite migrar datos entre bases de datos de origen y destino con diferentes versiones. Para usar estas opciones, primero debe subir el archivo JAR del controlador JDBC a Amazon S3.

    • "customJdbcDriverS3Path": ruta de Amazon S3 del controlador JDBC personalizado.

    • "customJdbcDriverClassName": nombre de clase del controlador JDBC.

  • "bulkSize": (opcional) se utiliza para configurar inserciones paralelas para acelerar las cargas masivas en los objetivos de JDBC. Especifique un valor entero para el grado de paralelismo que se utilizará al escribir o insertar datos. Esta opción resulta útil para mejorar el rendimiento de las escrituras en bases de datos como el repositorio de usuarios de Arch (AUR).

  • "hashfield" (Opcional) Una cadena, utilizada para especificar el nombre de una columna de la tabla JDBC que se utilizará para dividir los datos en particiones al leer tablas JDBC en paralelo. Proporcione “hashfield” O “hashexpression”. Para obtener más información, consulte Lectura desde tablas de JDBC en paralelo.

  • "hashexpression" (Opcional) Una cláusula de selección de SQL que devuelve un número entero. Se utiliza para dividir los datos de una tabla JDBC en particiones al leer tablas JDBC en paralelo. Proporcione “hashfield” O “hashexpression”. Para obtener más información, consulte Lectura desde tablas de JDBC en paralelo.

  • "hashpartitions" (Opcional) Un entero positivo. Se utiliza para especificar el número de lecturas paralelas de la tabla JDBC al leer tablas JDBC en paralelo. Valor predeterminado: 7. Para obtener más información, consulte Lectura desde tablas de JDBC en paralelo.

  • "sampleQuery": (Opcional) Una instrucción de consulta SQL personalizada. Se utiliza para especificar un subconjunto de información en una tabla para recuperar una muestra del contenido de la tabla. Cuando se configura sin tener en cuenta los datos, puede ser menos eficiente que los métodos DynamicFrame y provocar tiempos de espera o errores de falta de memoria. Para obtener más información, consulte Utilice sampleQuery.

  • "enablePartitioningForSampleQuery": (Opcional) Un booleano. Valor predeterminado: falso. Se utiliza para permitir la lectura de tablas JDBC en paralelo al especificar sampleQuery. Si se establece en true, sampleQuery debe terminar con “where” (dónde) o “and” (y) para que Glue AWS agregue condiciones de partición. Para obtener más información, consulte Utilice sampleQuery.

  • "sampleSize": (Opcional) Un entero positivo. Limita el número de filas que devuelve la consulta de ejemplo. Funciona solo cuando enablePartitioningForSampleQuery es true. Si la partición no está habilitada, en su lugar debe agregar "limit x" en el sampleQuery para limitar el tamaño. Para obtener más información, consulte Utilice sampleQuery.

Utilice sampleQuery

En esta sección, se explica cómo utilizar sampleQuery, sampleSize y enablePartitioningForSampleQuery.

sampleQuery puede ser una forma eficaz de muestrear algunas filas de su conjunto de datos. De forma predeterminada, la consulta la ejecuta un ejecutor único. Cuando se configura sin tener en cuenta los datos, puede ser menos eficiente que los métodos DynamicFrame y provocar tiempos de espera o errores de falta de memoria. Por lo general, solo es necesario ejecutar SQL en la base de datos subyacente como parte de la canalización de ETL por motivos de rendimiento. Si intenta obtener una vista previa de algunas filas de su conjunto de datos, considere utilizar show. Si intenta transformar su conjunto de datos mediante SQL, considere utilizar toDF para definir una transformación de SparkSQL contra sus datos en forma de DataFrame.

Si bien su consulta puede manipular una variedad de tablas, dbtable sigue siendo obligatoria.

Uso de sampleQuery para recuperar una muestra de la tabla

Cuando se utiliza el comportamiento predeterminado de sampleQuery para recuperar una muestra de los datos, Glue AWS no espera un rendimiento sustancial, por lo que ejecuta la consulta en un único ejecutor. Para limitar los datos que proporciona y no causar problemas de rendimiento, sugerimos que proporcione una cláusula LIMIT a SQL.

ejemplo Uso de sampleQuery sin particionar

En el siguiente ejemplo de código, se muestra cómo utilizar sampleQuery sin particionar.

//A full sql query statement. val query = "select name from $tableName where age > 0 limit 1" val connectionOptions = JsonOptions(Map( "url" -> url, "dbtable" -> tableName, "user" -> user, "password" -> password, "sampleQuery" -> query )) val dyf = glueContext.getSource("mysql", connectionOptions) .getDynamicFrame()

Uso de sampleQuery contra conjuntos de datos más grandes

Si está leyendo un conjunto de datos grande, es posible que tenga que habilitar las particiones de JDBC para consultar una tabla en paralelo. Para obtener más información, consulte Lectura desde tablas de JDBC en paralelo. Para utilizar sampleQuery con la partición JDBC,configure enablePartitioningForSampleQuery como true. La activación de esta característica requiere que realice algunos cambios en su sampleQuery.

Cuando utilice la partición JDBC con sampleQuery, la consulta debe terminar con “where” (dónde) o “and” (y) para que Glue AWS agregue condiciones de partición.

Si desea limitar los resultados de su sampleQuery al leer tablas JDBC en paralelo, defina el parámetro "sampleSize" en lugar de especificar una cláusula LIMIT.

ejemplo Uso de sampleQuery con particiones JDBC

En el siguiente ejemplo de código, se muestra cómo utilizar sampleQuery con partición JDBC.

//note that the query should end with "where" or "and" if use with JDBC partitioning. val query = "select name from $tableName where age > 0 and" //Enable JDBC partitioning by setting hashfield. //to use sampleQuery with partitioning, set enablePartitioningForSampleQuery. //use sampleSize to limit the size of returned data. val connectionOptions = JsonOptions(Map( "url" -> url, "dbtable" -> tableName, "user" -> user, "password" -> password, "hashfield" -> primaryKey, "sampleQuery" -> query, "enablePartitioningForSampleQuery" -> true, "sampleSize" -> "1" )) val dyf = glueContext.getSource("mysql", connectionOptions) .getDynamicFrame()

Notas y restricciones:

Las consultas de muestra no se pueden utilizar junto con los marcadores de trabajo. Se ignorará el estado del marcador cuando se brinden configuraciones para ambos.

Utilice un controlador JDBC personalizado

En los ejemplos de código siguientes, se muestra cómo se utilizan controladores JDBC personalizados para leer bases de datos JDBC y escribir en ellas. En ellos, se muestra cómo se lee una versión de un producto de base de datos y se escribe en una versión posterior del mismo producto.

Python
import sys from awsglue.transforms import * from awsglue.utils import getResolvedOptions from pyspark.context import SparkContext, SparkConf from awsglue.context import GlueContext from awsglue.job import Job import time from pyspark.sql.types import StructType, StructField, IntegerType, StringType sc = SparkContext() glueContext = GlueContext(sc) spark = glueContext.spark_session # Construct JDBC connection options connection_mysql5_options = { "url": "jdbc:mysql://<jdbc-host-name>:3306/db", "dbtable": "test", "user": "admin", "password": "pwd"} connection_mysql8_options = { "url": "jdbc:mysql://<jdbc-host-name>:3306/db", "dbtable": "test", "user": "admin", "password": "pwd", "customJdbcDriverS3Path": "s3://DOC-EXAMPLE-BUCKET/mysql-connector-java-8.0.17.jar", "customJdbcDriverClassName": "com.mysql.cj.jdbc.Driver"} connection_oracle11_options = { "url": "jdbc:oracle:thin:@//<jdbc-host-name>:1521/ORCL", "dbtable": "test", "user": "admin", "password": "pwd"} connection_oracle18_options = { "url": "jdbc:oracle:thin:@//<jdbc-host-name>:1521/ORCL", "dbtable": "test", "user": "admin", "password": "pwd", "customJdbcDriverS3Path": "s3://DOC-EXAMPLE-BUCKET/ojdbc10.jar", "customJdbcDriverClassName": "oracle.jdbc.OracleDriver"} # Read from JDBC databases with custom driver df_mysql8 = glueContext.create_dynamic_frame.from_options(connection_type="mysql", connection_options=connection_mysql8_options) # Read DynamicFrame from MySQL 5 and write to MySQL 8 df_mysql5 = glueContext.create_dynamic_frame.from_options(connection_type="mysql", connection_options=connection_mysql5_options) glueContext.write_from_options(frame_or_dfc=df_mysql5, connection_type="mysql", connection_options=connection_mysql8_options) # Read DynamicFrame from Oracle 11 and write to Oracle 18 df_oracle11 = glueContext.create_dynamic_frame.from_options(connection_type="oracle", connection_options=connection_oracle11_options) glueContext.write_from_options(frame_or_dfc=df_oracle11, connection_type="oracle", connection_options=connection_oracle18_options)
Scala
import com.amazonaws.services.glue.GlueContext import com.amazonaws.services.glue.MappingSpec import com.amazonaws.services.glue.errors.CallSite import com.amazonaws.services.glue.util.GlueArgParser import com.amazonaws.services.glue.util.Job import com.amazonaws.services.glue.util.JsonOptions import com.amazonaws.services.glue.DynamicFrame import org.apache.spark.SparkContext import scala.collection.JavaConverters._ object GlueApp { val MYSQL_5_URI: String = "jdbc:mysql://<jdbc-host-name>:3306/db" val MYSQL_8_URI: String = "jdbc:mysql://<jdbc-host-name>:3306/db" val ORACLE_11_URI: String = "jdbc:oracle:thin:@//<jdbc-host-name>:1521/ORCL" val ORACLE_18_URI: String = "jdbc:oracle:thin:@//<jdbc-host-name>:1521/ORCL" // Construct JDBC connection options lazy val mysql5JsonOption = jsonOptions(MYSQL_5_URI) lazy val mysql8JsonOption = customJDBCDriverJsonOptions(MYSQL_8_URI, "s3://DOC-EXAMPLE-BUCKET/mysql-connector-java-8.0.17.jar", "com.mysql.cj.jdbc.Driver") lazy val oracle11JsonOption = jsonOptions(ORACLE_11_URI) lazy val oracle18JsonOption = customJDBCDriverJsonOptions(ORACLE_18_URI, "s3://DOC-EXAMPLE-BUCKET/ojdbc10.jar", "oracle.jdbc.OracleDriver") def main(sysArgs: Array[String]): Unit = { val spark: SparkContext = new SparkContext() val glueContext: GlueContext = new GlueContext(spark) val args = GlueArgParser.getResolvedOptions(sysArgs, Seq("JOB_NAME").toArray) Job.init(args("JOB_NAME"), glueContext, args.asJava) // Read from JDBC database with custom driver val df_mysql8: DynamicFrame = glueContext.getSource("mysql", mysql8JsonOption).getDynamicFrame() // Read DynamicFrame from MySQL 5 and write to MySQL 8 val df_mysql5: DynamicFrame = glueContext.getSource("mysql", mysql5JsonOption).getDynamicFrame() glueContext.getSink("mysql", mysql8JsonOption).writeDynamicFrame(df_mysql5) // Read DynamicFrame from Oracle 11 and write to Oracle 18 val df_oracle11: DynamicFrame = glueContext.getSource("oracle", oracle11JsonOption).getDynamicFrame() glueContext.getSink("oracle", oracle18JsonOption).writeDynamicFrame(df_oracle11) Job.commit() } private def jsonOptions(url: String): JsonOptions = { new JsonOptions( s"""{"url": "${url}", |"dbtable":"test", |"user": "admin", |"password": "pwd"}""".stripMargin) } private def customJDBCDriverJsonOptions(url: String, customJdbcDriverS3Path: String, customJdbcDriverClassName: String): JsonOptions = { new JsonOptions( s"""{"url": "${url}", |"dbtable":"test", |"user": "admin", |"password": "pwd", |"customJdbcDriverS3Path": "${customJdbcDriverS3Path}", |"customJdbcDriverClassName" : "${customJdbcDriverClassName}"}""".stripMargin) } }