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.
Erstellen und Bereitstellen eines UDF mit Lambda
Um eine benutzerdefinierte Klasse zu erstellenUDF, erstellen Sie eine neue Java-Klasse, indem Sie die UserDefinedFunctionHandler
Klasse erweitern. Der Quellcode für die Datei UserDefinedFunctionHandler.java
Die Schritte in diesem Abschnitt veranschaulichen das Schreiben und Erstellen einer benutzerdefinierten UDF Jar-Datei mithilfe von Apache Maven
Führen Sie die folgenden Schritte aus, um mit Maven eine benutzerdefinierte UDF Version für Athena zu erstellen
Klonen Sie die SDK Entwicklungsumgebung und bereiten Sie sie vor
Bevor Sie beginnen, stellen Sie mithilfe von sudo
yum install git -y
sicher, dass git auf Ihrem System installiert ist.
Um den AWS Abfrageverbund zu installieren SDK
-
Geben Sie in der Befehlszeile Folgendes ein, um das SDK Repository zu klonen. Dieses Repository enthält die SDK Beispiele und eine Reihe von Datenquellen-Konnektoren. Weitere Hinweise zu Datenquellen-Connectors finden Sie unter Verwenden Sie Amazon Athena Federated Query.
git clone https://github.com/awslabs/aws-athena-query-federation.git
So installieren Sie die Voraussetzungen für dieses Verfahren:
Wenn Sie auf einem Entwicklungscomputer arbeiten, auf dem Apache Maven AWS CLI, das und das AWS Serverless Application Model Build-Tool bereits installiert sind, können Sie diesen Schritt überspringen.
-
Führen Sie im
aws-athena-query-federation
-Stammverzeichnis des Verzeichnisses, das Sie beim Klonen erstellt haben, das Skript prepare_dev_env.shaus, das die Entwicklungsumgebung vorbereitet. -
Aktualisieren Sie die Shell, um neue Variablen zu erzeugen, die durch den Installationsprozess erstellt wurden, oder starten Sie die Terminalsitzung neu.
source ~/.profile
Wichtig
Wenn Sie diesen Schritt überspringen, erhalten Sie später eine Fehlermeldung, dass das AWS CLI oder AWS SAM Build-Tool Ihre Lambda-Funktion nicht veröffentlichen kann.
Erstellen Ihres Maven-Projekts
Führen Sie den folgenden Befehl aus, um Ihr Maven-Projekt zu erstellen. Ersetzen groupId
mit der eindeutigen ID Ihrer Organisation und ersetzen my-athena-udf
mit dem Namen Ihrer Anwendung Weitere Informationen finden Sie unter Wie erstelle ich mein erstes Maven-Projekt
mvn -B archetype:generate \ -DarchetypeGroupId=org.apache.maven.archetypes \ -DgroupId=
groupId
\ -DartifactId=my-athena-udfs
Hinzufügen von Abhängigkeiten und Plugins zu Ihrem Maven-Projekt
Fügen Sie die folgenden Konfigurationen zu Ihrer Maven-pom.xml
-Projektdatei hinzu. Ein Beispiel finden Sie in GitHub der Datei pom.xml
<properties> <aws-athena-federation-sdk.version>2022.47.1</aws-athena-federation-sdk.version> </properties> <dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-athena-federation-sdk</artifactId> <version>${aws-athena-federation-sdk.version}</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.1</version> <configuration> <createDependencyReducedPom>false</createDependencyReducedPom> <filters> <filter> <artifact>*:*</artifact> <excludes> <exclude>META-INF/*.SF</exclude> <exclude>META-INF/*.DSA</exclude> <exclude>META-INF/*.RSA</exclude> </excludes> </filter> </filters> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
Schreiben Sie Java-Code für UDFs
Erstellen Sie eine neue Klasse, indem Sie UserDefinedFunctionHandler.java erweitern.
Im folgenden Beispiel werden zwei Java-Methoden fürUDFs, compress()
unddecompress()
, innerhalb der Klasse erstelltMyUserDefinedFunctions
.
*package *com.mycompany.athena.udfs; public class MyUserDefinedFunctions extends UserDefinedFunctionHandler { private static final String SOURCE_TYPE = "MyCompany"; public MyUserDefinedFunctions() { super(SOURCE_TYPE); } /** * Compresses a valid UTF-8 String using the zlib compression library. * Encodes bytes with Base64 encoding scheme. * * @param input the String to be compressed * @return the compressed String */ public String compress(String input) { byte[] inputBytes = input.getBytes(StandardCharsets.UTF_8); // create compressor Deflater compressor = new Deflater(); compressor.setInput(inputBytes); compressor.finish(); // compress bytes to output stream byte[] buffer = new byte[4096]; ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(inputBytes.length); while (!compressor.finished()) { int bytes = compressor.deflate(buffer); byteArrayOutputStream.write(buffer, 0, bytes); } try { byteArrayOutputStream.close(); } catch (IOException e) { throw new RuntimeException("Failed to close ByteArrayOutputStream", e); } // return encoded string byte[] compressedBytes = byteArrayOutputStream.toByteArray(); return Base64.getEncoder().encodeToString(compressedBytes); } /** * Decompresses a valid String that has been compressed using the zlib compression library. * Decodes bytes with Base64 decoding scheme. * * @param input the String to be decompressed * @return the decompressed String */ public String decompress(String input) { byte[] inputBytes = Base64.getDecoder().decode((input)); // create decompressor Inflater decompressor = new Inflater(); decompressor.setInput(inputBytes, 0, inputBytes.length); // decompress bytes to output stream byte[] buffer = new byte[4096]; ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(inputBytes.length); try { while (!decompressor.finished()) { int bytes = decompressor.inflate(buffer); if (bytes == 0 && decompressor.needsInput()) { throw new DataFormatException("Input is truncated"); } byteArrayOutputStream.write(buffer, 0, bytes); } } catch (DataFormatException e) { throw new RuntimeException("Failed to decompress string", e); } try { byteArrayOutputStream.close(); } catch (IOException e) { throw new RuntimeException("Failed to close ByteArrayOutputStream", e); } // return decoded string byte[] decompressedBytes = byteArrayOutputStream.toByteArray(); return new String(decompressedBytes, StandardCharsets.UTF_8); } }
Erstellen Sie die JAR Datei
Führen Sie mvn clean install
aus um Ihr Projekt zu erstellen. Nach erfolgreicher Erstellung wird eine JAR Datei in dem target
Ordner Ihres Projekts mit dem Namen erstellt
, wo artifactId
-version
.jarartifactId
ist der Name, den Sie im Maven-Projekt angegeben haben, zum Beispiel. my-athena-udfs
Stellen Sie das JAR bereit AWS Lambda
Sie haben zwei Möglichkeiten, Ihren Code in Lambda bereitzustellen:
-
Bereitstellen mit AWS Serverless Application Repository (empfohlen)
-
Erstellen Sie eine Lambda-Funktion aus der Datei JAR
Option 1: Bereitstellen auf AWS Serverless Application Repository
Wenn Sie Ihre JAR Datei auf dem bereitstellen AWS Serverless Application Repository, erstellen Sie eine AWS SAM YAML Vorlagendatei, die die Architektur Ihrer Anwendung darstellt. Anschließend geben Sie diese YAML Datei und einen Amazon S3 S3-Bucket an, in den Artefakte für Ihre Anwendung hochgeladen und dem zur Verfügung gestellt werden AWS Serverless Application Repository. Das folgende Verfahren verwendet das Skript publish.shathena-query-federation/tools
Verzeichnis der Athena Query Federation befindetSDK, die Sie zuvor geklont haben.
Weitere Informationen und Anforderungen finden Sie unter Veröffentlichen von Anwendungen im AWS Serverless Application Repository Entwicklerhandbuch, AWS SAM Vorlagenkonzepte im AWS Serverless Application Model Entwicklerhandbuch und Veröffentlichen serverloser Anwendungen mit dem. AWS SAM CLI
Das folgende Beispiel zeigt Parameter in einer YAML Datei. Fügen Sie Ihrer YAML Datei ähnliche Parameter hinzu und speichern Sie sie in Ihrem Projektverzeichnis. Ein vollständiges Beispiel finden Sie unter athena-udf.yaml.
Transform: 'AWS::Serverless-2016-10-31' Metadata: 'AWS::ServerlessRepo::Application': Name:
MyApplicationName
Description: 'The description I write for my application
' Author: 'Author Name
' Labels: - athena-federation SemanticVersion: 1.0.0 Parameters: LambdaFunctionName: Description: 'The name of the Lambda function that will contain your UDFs.
' Type: String LambdaTimeout: Description: 'Maximum Lambda invocation runtime in seconds. (min 1 - 900 max)' Default: 900 Type: Number LambdaMemory: Description: 'Lambda memory in MB (min 128 - 3008 max).' Default: 3008 Type: Number Resources: ConnectorConfig: Type: 'AWS::Serverless::Function' Properties: FunctionName: !Ref LambdaFunctionName Handler: "full.path.to.your.handler. For example, com.amazonaws.athena.connectors.udfs.MyUDFHandler
" CodeUri: "Relative path to your JAR file. For example, ./target/athena-udfs-1.0.jar
" Description: "My description of the UDFs that this Lambda function enables.
" Runtime: java8 Timeout: !Ref LambdaTimeout MemorySize: !Ref LambdaMemory
Kopieren Sie das publish.sh
Skript in das Projektverzeichnis, in dem Sie Ihre YAML Datei gespeichert haben, und führen Sie den folgenden Befehl aus:
./publish.sh
MyS3Location
MyYamlFile
Wenn Ihr Bucket-Speicherort beispielsweise lautet s3://amzn-s3-demo-bucket/mysarapps/athenaudf
und Ihre YAML Datei gespeichert wurde alsmy-athena-udfs.yaml
:
./publish.sh amzn-s3-demo-bucket/mysarapps/athenaudf my-athena-udfs
Eine Lambda-Funktion erstellen
-
Öffnen Sie die Lambda-Konsole unter https://console.aws.amazon.com/lambda/
, wählen Sie Create function und dann Browse Serverless App Repository -
Wählen Sie Private applications (Private Anwendungen) aus, suchen Sie Ihre Anwendung in der Liste oder mit Schlüsselwörtern und wählen Sie sie aus.
-
Überprüfen und geben Sie Anwendungsdetails an, und wählen Sie dann Deploy (Bereitstellen).
Sie können jetzt die in Ihrer JAR Lambda-Funktionsdatei definierten Methodennamen wie UDFs in Athena verwenden.
Option 2: Direktes Erstellen einer Lambda-Funktion
Sie können eine Lambda-Funktion auch direkt über die Konsole oder AWS CLI erstellen. Das folgende Beispiel zeigt die Verwendung des create-function
CLI Lambda-Befehls.
aws lambda create-function \ --function-name
MyLambdaFunctionName
\ --runtime java8 \ --role arn:aws:iam::1234567890123:role/my_lambda_role
\ --handlercom.mycompany.athena.udfs.MyUserDefinedFunctions
\ --timeout 900 \ --zip-file fileb://./target/my-athena-udfs-1.0-SNAPSHOT.jar