JDBC-Verbindungen - AWS Glue

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

JDBC-Verbindungen

Bestimmte, in der Regel relationale Datenbanktypen unterstützen die Verbindung über den JDBC-Standard. Weitere Informationen zu JDBC finden Sie in der Dokumentation zur Java JDBC API. AWS Glue unterstützt nativ die Verbindung zu bestimmten Datenbanken über seine JDBC-Konnektoren – die JDBC-Bibliotheken werden in AWS-Glue-Spark-Aufträgen bereitgestellt. Wenn Sie mithilfe von AWS-Glue-Bibliotheken eine Verbindung zu diesen Datenbanktypen herstellen, haben Sie Zugriff auf eine Reihe von Standardoptionen.

Zu den JDBC-connectionType-Werten gehören:

  • "connectionType": "sqlserver": Bezeichnet eine Verbindung zu einer Microsoft SQL Server-Datenbank.

  • "connectionType": "mysql": Bezeichnet eine Verbindung zu einer MySQL-Datenbank.

  • "connectionType": "oracle": Bezeichnet eine Verbindung zu einer Oracle-Datenbank.

  • "connectionType": "postgresql": Bezeichnet eine Verbindung zu einer PostgreSQL-Datenbank.

  • "connectionType": "redshift": Bezeichnet eine Verbindung zu einer Amazon-Redshift-Datenbank. Weitere Informationen finden Sie unter Redshift-Verbindungen.

In der folgenden Tabelle sind die von AWS Glue unterstützten JDBC-Treiberversionen aufgeführt.

Produkt JDBC-Treiberversionen für Glue 4.0 JDBC-Treiberversionen für Glue 3.0 JDBC-Treiberversionen für 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

* Für den Amazon-Redshift-Verbindungstyp werden alle anderen Optionsname/Wert-Paare, die in Verbindungsoptionen für eine JDBC-Verbindung enthalten sind, einschließlich Formatierungsoptionen, direkt an die zugrunde liegende SparkSQL-Datenquelle übergeben. In AWS Glue mit Spark-Aufträgen in AWS Glue 4.0 und späteren Versionen verwendet der native AWS-Glue-Konnektor für Amazon Redshift die Amazon-Redshift-Integration für Apache Spark. Weitere Informationen finden Sie unter Amazon-Redshift-Integration für Apache Spark. In früheren Versionen finden Sie Informationen zur Amazon-Redshift-Datenquelle für Spark.

Informationen zum Konfigurieren Ihrer Amazon VPC für die Verbindung mit Amazon-RDS-Datenspeichern über JDBC finden Sie unter Einrichtung von Amazon VPC für JDBC-Verbindungen zu Amazon RDS-Datenspeichern von AWS Glue.

Anmerkung

AWS-Glue-Aufträge werden während einer Ausführung nur einem Subnetz zugeordnet. Dies kann sich auf Ihre Fähigkeit auswirken, über denselben Auftrag eine Verbindung zu mehreren Datenquellen herzustellen. Dieses Verhalten ist nicht auf JDBC-Quellen beschränkt.

Referenz zur JDBC-Verbindungsoption

Wenn Sie bereits eine Verbindung für JDBC AWS Glue definiert haben, können Sie die darin definierten Konfigurationseigenschaften wie URL, Benutzer und Passwort wiederverwenden, sodass Sie sie nicht im Code als Verbindungsoptionen angeben müssen. Dieses Feature ist in AWS Glue 3.0 und späteren Versionen verfügbar. Verwenden Sie dazu die folgenden Verbindungseigenschaften:

  • "useConnectionProperties": Setzen Sie den Wert auf „true“, um anzugeben, dass Sie die Konfiguration von einer Verbindung aus verwenden möchten.

  • "connectionName": Geben Sie den Verbindungsnamen ein, aus dem die Konfiguration abgerufen werden soll. Die Verbindung muss in derselben Region wie der Auftrag definiert sein.

Verwenden Sie diese Verbindungsoptionen mit JDBC-Verbindungen:

  • "url": (Erforderlich) Die JDBC-URL für die Datenbank.

  • "dbtable": (Erforderlich) Die Datenbanktabelle, aus der gelesen werden soll. Bei JDBC-Datenspeichern, die von Schemata innerhalb einer Datenbank unterstützen, geben Sie schema.table-name an. Wenn kein Schema angegeben ist, wird der Standardwert "öffentliches" Schema verwendet.

  • "user": (Erforderlich) Der Benutzername, der beim herstellen der Verbindung verwendet werden soll.

  • "password": (Erforderlich) Das Passwort für die Verbindung.

  • (Optional) Mit den folgenden Optionen können Sie einen benutzerdefinierten JDBC-Treiber bereitstellen. Verwenden Sie diese Optionen, wenn Sie einen Treiber verwenden müssen, der AWS Glue nicht nativ unterstützt.

    ETL-Aufträge können verschiedene JDBC-Treiberversionen für die Datenquelle und das Ziel verwenden, selbst wenn Quelle und Ziel dasselbe Datenbankprodukt sind. Auf diese Weise können Sie Daten zwischen Quell- und Zieldatenbanken mit unterschiedlichen Versionen migrieren. Um diese Optionen zu verwenden, müssen Sie zuerst die JAR-Datei des JDBC-Treibers in Amazon S3 hochladen.

    • "customJdbcDriverS3Path": Der Amazon-S3-Pfad des benutzerdefinierten JDBC-Treibers.

    • "customJdbcDriverClassName": Der Klassenname des JDBC-Treibers.

  • "bulkSize": (Optional) Wird verwendet, um parallele Inserts zu konfigurieren, um Massenladungen in JDBC-Ziele zu beschleunigen. Geben Sie einen ganzzahligen Wert für den Parallelitätsgrad an, der beim Schreiben oder Einfügen von Daten verwendet werden soll. Diese Option ist hilfreich, um die Leistung beim Schreiben in Datenbanken wie das Arch User Repository (AUR) zu verbessern.

  • "hashfield" (Optional) Eine Zeichenfolge, die zur Angabe des Namens einer Spalte in der JDBC-Tabelle verwendet wird, die zum Aufteilen der Daten in Partitionen beim parallelen Lesen aus JDBC-Tabellen verwendet werden soll. Geben Sie „hashfield“ ODER „hashexpression“ an. Weitere Informationen finden Sie unter Parallel aus JDBC-Tabellen lesen.

  • "hashexpression" (Optional) Eine SQL-Auswahlklausel, die eine ganze Zahl zurückgibt. Wird verwendet, um die Daten in einer JDBC-Tabelle beim parallelen Lesen aus JDBC-Tabellen in Partitionen zu unterteilen. Geben Sie „hashfield“ ODER „hashexpression“ an. Weitere Informationen finden Sie unter Parallel aus JDBC-Tabellen lesen.

  • "hashpartitions" (Optional) Eine positive Ganzzahl. Wird verwendet, um die Anzahl der parallelen Lesevorgänge der JDBC-Tabelle anzugeben, wenn parallel aus JDBC-Tabellen gelesen wird. Standard: 7. Weitere Informationen finden Sie unter Parallel aus JDBC-Tabellen lesen.

  • "sampleQuery": (Optional) Eine benutzerdefinierte SQL-Abfrageanweisung. Wird verwendet, um eine Teilmenge von Informationen in einer Tabelle anzugeben, um ein Beispiel des Tabelleninhalts abzurufen. Wenn sie ohne Rücksicht auf Ihre Daten konfiguriert wird, kann sie weniger effizient als DynamicFrame-Methoden sein und zu Zeitüberschreitungen oder Fehlern aufgrund von Speichermangel führen. Weitere Informationen finden Sie unter sampleQuery verwenden.

  • "enablePartitioningForSampleQuery": (Optional) Ein boolescher Wert. Standard: falsch. Wird verwendet, um das parallele Lesen aus JDBC-Tabellen bei Angabe von sampleQuery zu ermöglichen. Wenn es auf wahr festgelegt ist, muss sampleQuery mit „where“ oder „and“ enden, damit AWS Glue Partitionierungsbedingungen anfügt. Weitere Informationen finden Sie unter sampleQuery verwenden.

  • "sampleSize": (Optional) Eine positive Ganzzahl. Begrenzt die Anzahl der von der Beispielabfrage zurückgegebenen Zeilen. Funktioniert nur, wenn enablePartitioningForSampleQuery true ist. Wenn die Partitionierung nicht aktiviert ist, sollten Sie stattdessen "limit x" direkt in sampleQuery einfügen, um die Größe zu begrenzen. Weitere Informationen finden Sie unter sampleQuery verwenden.

sampleQuery verwenden

Dieser Abschnitt erläutert die Verwendung von sampleQuery, sampleSize und enablePartitioningForSampleQuery.

sampleQuery kann ein effizienter Weg sein, um ein paar Zeilen Ihres Datensatzes abzufragen. In der Standardeinstellung wird die Abfrage von einem einzigen Ausführer ausgeführt. Wenn sie ohne Rücksicht auf Ihre Daten konfiguriert wird, kann sie weniger effizient als DynamicFrame-Methoden sein und zu Zeitüberschreitungen oder Fehlern aufgrund von Speichermangel führen. Das Ausführen von SQL in der zugrunde liegenden Datenbank als Teil Ihrer ETL-Pipeline ist im Allgemeinen nur aus Leistungsgründen erforderlich. Wenn Sie eine Vorschau einiger Zeilen Ihres Datensatzes anzeigen möchten, sollten Sie die Verwendung von show in Betracht ziehen. Wenn Sie versuchen, Ihr Dataset mithilfe von SQL zu transformieren, sollten Sie die Verwendung von toDF in Betracht ziehen, um eine SparkSQL-Transformation für Ihre Daten in einem DataFrame-Formular zu definieren.

Während Ihre Abfrage eine Vielzahl von Tabellen manipulieren kann, ist dbtable weiterhin erforderlich.

Verwendung von sampleQuery zum Abrufen eines Beispiels Ihrer Tabelle

Wenn Sie das Standardverhalten von „sampleQuery“ zum Abrufen eines Beispiels Ihrer Daten verwenden, erwartet AWS Glue keinen nennenswerten Durchsatz und führt Ihre Abfrage daher auf einem einzigen Ausführer aus. Um die von Ihnen bereitgestellten Daten zu begrenzen und keine Leistungsprobleme zu verursachen, empfehlen wir Ihnen, SQL mit einer LIMIT-Klausel bereitzustellen.

Beispiel Verwenden von sampleQuery ohne Partitionierung

Das folgende Codebeispiel zeigt, wie sampleQuery ohne Partitionierung verwendet wird.

//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()

Verwendung von sampleQuery für größere Datensätze

Wenn Sie einen großen Datensatz lesen, müssen Sie möglicherweise die JDBC-Partitionierung aktivieren, um eine Tabelle parallel abzufragen. Weitere Informationen finden Sie unter Parallel aus JDBC-Tabellen lesen. Um sampleQuery mit JDBC-Partitionierung zu verwenden, legen Sie enablePartitioningForSampleQuery auf wahr fest. Um dieses Feature zu aktivieren, müssen Sie einige Änderungen an Ihrer sampleQuery vornehmen.

Wenn Sie die JDBC-Partitionierung mit sampleQuery verwenden, muss Ihre Abfrage mit „where“ oder „and“ enden, damit AWS Glue Partitionierungsbedingungen anfügen kann.

Wenn Sie die Ergebnisse Ihrer sampleQuery beim parallelen Lesen aus JDBC-Tabellen einschränken möchten, legen Sie den "sampleSize"-Parameter fest, anstatt eine LIMIT-Klausel anzugeben.

Beispiel Verwenden sampleQuery mit JDBC-Partitionierung

Das folgende Codebeispiel zeigt, wie sampleQuery mit JDBC-Partitionierung verwendet wird.

//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()

Hinweise und Einschränkungen:

Beispielabfragen können nicht zusammen mit Auftragslesezeichen verwendet werden. Der Lesezeichenstatus wird ignoriert, wenn die Konfiguration für beide bereitgestellt wird.

Benutzerdefinierten JDBC-Treiber verwenden

In den folgenden Codebeispielen wird gezeigt, wie JDBC-Datenbanken mit benutzerdefinierten JDBC-Treibern gelesen und geschrieben werden. Diese demonstrieren das Lesen aus einer Version eines Datenbankprodukts und das Schreiben in eine spätere Version desselben Produkts.

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) } }