Erste Schritte mit dem Athena JDBC-Treiber für nahtlose Datenabfragen

Sind Sie ein Java-Entwickler, der eine Verbindung zu Amazon Athena von Ihren Anwendungen aus herstellen möchte? Der Athena JDBC-Treiber macht es einfach, Daten in Amazon S3 mit Standard-SQL abzufragen.
Dieser Artikel erklärt den Athena JDBC-Treiber. Er zeigt anhand von Beispielcode, wie Sie ihn verwenden. Zudem werden die vorhandenen Sicherheitsfunktionen erläutert. Am Ende haben Sie eine solide Grundlage für die Nutzung von Athena mit Java.
Was ist der Athena JDBC-Treiber?
Der Athena JDBC-Treiber ist ein Type-4-Treiber. Java-Anwendungen nutzen ihn, um eine Verbindung zur Athena-Datenquelle herzustellen. Die JDBC-API ermöglicht diese Verbindung, indem sie JDBC-Methodenaufrufe in HTTP-Anfragen umwandelt, die Athena versteht.
Die Verwendung der JDBC-API zur Abfrage von Athena bietet mehrere Vorteile:
- Sie verbirgt die Details der zugrundeliegenden HTTP-Kommunikation
- Sie ermöglicht die Nutzung von bekanntem JDBC-Code und SQL zur Arbeit mit Athena
- Sie erlaubt die Integration von Athena in jede Java-Anwendung oder jedes Tool, das JDBC unterstützt
AWS stellt den Treiber als eigenständige JAR-Datei bereit. Um ihn zu verwenden, fügen Sie die JAR-Datei einfach zum Klassenpfad Ihrer Anwendung hinzu.
Verbindung zu Athena herstellen
Um über den JDBC-Treiber eine Verbindung zu Athena herzustellen, müssen Sie einen JDBC-Verbindungsstring im folgenden Format konstruieren:
jdbc:awsathena://AwsRegion=[Region];S3OutputLocation=[Output];[Property1]=[Value1];[Property2]=[Value2];...
Die wichtigsten Bestandteile sind:
- Die AWS-Region, in der Ihre Athena-Instanz gehostet wird.
- S3OutputLocation – Der S3-Speicherort, an dem Athena die Abfrageergebnisse speichern soll
- Weitere optionale Konfigurationseigenschaften
Hier ist ein Beispiel für eine JDBC-URL, die eine Verbindung zu Athena in der Region us-west-2 herstellt. Das System speichert die Ergebnisse in einem festgelegten S3-Bucket:
jdbc:awsathena://AwsRegion=us-west-2;S3OutputLocation=s3://my-athena-results/output;
Um die Verbindung im Java-Code tatsächlich herzustellen, verwenden Sie die Klasse DriverManager:
String url = "jdbc:awsathena://AwsRegion=us-west-2;S3OutputLocation=s3://my-athena-results/output"; Connection conn = DriverManager.getConnection(url);
Dies erstellt ein Connection-Objekt, das Sie anschließend zum Ausführen von Abfragen verwenden können.
Athena-Authentifizierung
Um die Verbindung herzustellen, benötigt der JDBC-Treiber AWS-Anmeldeinformationen, um sich bei Athena zu authentifizieren. Es gibt mehrere Möglichkeiten, Anmeldeinformationen bereitzustellen:
- Umgebungsvariablen – Setzen Sie die Umgebungsvariablen AWS_ACCESS_KEY_ID und AWS_SECRET_ACCESS_KEY.
- Java-Systemeigenschaften – Legen Sie die Systemeigenschaften aws.accessKeyId und aws.secretKey fest.
- AWS-Anmeldeinformationsdatei – Legen Sie den Access Key und Secret in der Datei ~/.aws/credentials ab.
- AWS-Instanzprofil – Weisen Sie der EC2-Instanz, auf der Sie laufen, eine IAM-Rolle zu. Der Treiber ruft dann automatisch temporäre Anmeldeinformationen ab.
Der JDBC-Treiber sucht in dieser Reihenfolge nach Anmeldeinformationen. Um das Hardcodieren sensibler Schlüssel zu vermeiden, sollten Sie ein Instanzprofil oder die Anmeldeinformationsdatei verwenden.
Grundlegende Abfragen
Sobald Sie eine Verbindung hergestellt haben, können Sie SQL-Abfragen ausführen. Verwenden Sie dazu die Methode createStatement, um ein Statement-Objekt zu erstellen, und rufen Sie dann executeQuery mit Ihrem SQL ab:
Statement stmt = conn.createStatement(); String sql = "SELECT * FROM my_table LIMIT 10"; ResultSet rs = stmt.executeQuery(sql);
Dies sendet die Abfrage an Athena, wartet auf deren Abschluss und liefert die Ergebnisse als ResultSet zurück. Anschließend können Sie über die Zeilen iterieren und auf Spaltenwerte zugreifen:
while (rs.next()) {
String col1 = rs.getString(1);
int col2 = rs.getInt(2);
// ...
}Denken Sie daran, dass Athena Daten abfragt, die in S3 gespeichert sind. Bevor Sie Abfragen durchführen, müssen Sie eine externe Tabelle erstellen, die auf die S3-Daten verweist:
CREATE EXTERNAL TABLE my_table (
col1 STRING,
col2 INT
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION 's3://my-data-bucket/input/';Dies erstellt eine Tabelle my_table mit zwei Spalten, die durch eine CSV-Datei in S3 unterstützt werden. Mit der erstellten Tabelle können Sie diese dann wie oben über JDBC abfragen.
Parametrisierte Abfragen
Für Abfragen, die Parameter akzeptieren, verwenden Sie ein PreparedStatement anstelle eines regulären Statement. Konstruieren Sie das SQL mit ?-Platzhaltern und binden Sie dann Werte daran:
String sql = "SELECT * FROM my_table WHERE col1 = ?"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, "foo"); ResultSet rs = pstmt.executeQuery();
Dies bindet den Wert “foo” an den ersten ?-Platzhalter. Die Verwendung eines PreparedStatement hat einige Vorteile:
- Es vermeidet SQL-Injektionen, indem Parameter getrennt von der Abfrage gesendet werden.
- Athena kann den Abfrageplan zwischenspeichern und wiederverwenden
- Sie können dieselbe Abfrage mehrfach mit unterschiedlichen Parameterwerten ausführen
Sicherheitsfunktionen
Der Athena JDBC-Treiber unterstützt mehrere sicherheitsbezogene Funktionen und Konfigurationen:
Verschlüsselung
Standardmäßig verbindet sich der Treiber über HTTPS mit Athena, um eine Verschlüsselung während der Übertragung zu gewährleisten. Alle zwischen der Anwendung und Athena ausgetauschten Daten werden mittels TLS verschlüsselt.
Zugriffskontrolle
Athena beachtet die an die AWS-Anmeldeinformationen gebundenen IAM-Berechtigungen, die vom JDBC-Treiber verwendet werden. Sie können den Datenzugriff eines Benutzers einschränken, indem Sie SELECT-Berechtigungen auf bestimmte Datenbanken und Tabellen gewähren.
Beispielsweise erlaubt diese Richtlinie nur das Abfragen von Tabellen in der Datenbank „my_database“:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"athena:StartQueryExecution",
"athena:GetQueryExecution",
"athena:GetQueryResults",
"athena:StopQueryExecution"
],
"Resource": [
"arn:aws:athena:us-west-2:123456789012:workgroup/primary"
]
},
{
"Effect": "Allow",
"Action": [
"glue:GetTable",
"glue:GetPartitions",
"glue:GetPartition"
],
"Resource": [
"arn:aws:glue:us-west-2:123456789012:catalog",
"arn:aws:glue:us-west-2:123456789012:database/my_database",
"arn:aws:glue:us-west-2:123456789012:table/my_database/*"
]
}
]
}Weisen Sie diese Richtlinie dem IAM-Benutzer oder der Rolle zu, die für die JDBC-Verbindung verwendet wird, um die Zugriffskontrolle durchzusetzen.
S3-Verschlüsselung
Das System speichert die Abfrageergebnisse an dem im JDBC-URL angegebenen S3-Speicherort. Um diese Daten im Ruhezustand zu schützen, können Sie den S3-Bucket so konfigurieren, dass er Verschlüsselung verwendet.
- Verwenden Sie die Standard-Bucket-Verschlüsselung, um alle Objekte automatisch zu verschlüsseln
- Verwenden Sie in Ihrer Anwendung die clientseitige Verschlüsselung, um Daten vor der Speicherung in S3 zu verschlüsseln
Der Athena JDBC-Treiber unterstützt transparent das Lesen und Schreiben in verschlüsselte S3-Buckets.
Fazit
Der Athena JDBC-Treiber hilft Java-Anwendungen, SQL-Abfragen für Daten in Amazon S3 durchzuführen. Er unterstützt verschiedene Authentifizierungsmethoden und Sicherheitsfunktionen zum Schutz der Daten.
Weitere Informationen finden Sie in der offiziellen Dokumentation zum Athena JDBC-Treiber.
Über DataSunrise
Wenn Sie zusätzliche Sicherheits-, Überwachungs-, Audit- und Compliance-Funktionen für Athena benötigen, sollten Sie DataSunrise Database Security in Betracht ziehen. DataSunrise bietet Tools zur Kontrolle von Datenmaskierung, zur Echtzeit-Überwachung von Abfragen, zur Überwachung und zur Einhaltung von Vorschriften.
Um DataSunrise live zu erleben und eine kostenlose Testlizenz zu erhalten, kontaktieren Sie unser Team, um eine Online-Demo zu vereinbaren. Wir zeigen Ihnen, wie DataSunrise die Sicherheit von Athena verbessern kann.
Nächste
