Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Buat dan terapkan menggunakan UDF Lambda
Untuk membuat kustomUDF, Anda membuat kelas Java baru dengan memperluas UserDefinedFunctionHandler
kelas. Kode sumber untuk UserDefinedFunctionHandler.java
Langkah-langkah di bagian ini menunjukkan penulisan dan pembuatan file UDF Jar kustom menggunakan Apache Maven
Lakukan langkah-langkah berikut untuk membuat kustom UDF untuk Athena menggunakan Maven
Kloning SDK dan persiapkan lingkungan pengembangan Anda
Sebelum memulai, pastikan bahwa git diinstal pada sistem Anda menggunakansudo
yum install git -y
.
Untuk menginstal federasi AWS kueri SDK
-
Masukkan yang berikut ini di baris perintah untuk mengkloning SDK repositori. Repositori ini mencakupSDK, contoh dan rangkaian konektor sumber data. Untuk informasi selengkapnya tentang konektor sumber data, lihat Gunakan Kueri Federasi Amazon Athena.
git clone https://github.com/awslabs/aws-athena-query-federation.git
Untuk menginstal prasyarat untuk prosedur ini
Jika Anda sedang mengerjakan mesin pengembangan yang sudah memiliki Apache Maven, the AWS CLI, dan alat AWS Serverless Application Model build yang diinstal, Anda dapat melewati langkah ini.
-
Dari akar
aws-athena-query-federation
direktori yang Anda buat saat Anda kloning, jalankanprepare_dev_env.shyang mempersiapkan lingkungan pengembangan Anda. -
Perbarui shell Anda untuk sumber variabel baru yang dibuat oleh proses instalasi atau restart sesi terminal Anda.
source ~/.profile
penting
Jika Anda melewati langkah ini, Anda akan mendapatkan kesalahan nanti tentang AWS CLI atau AWS SAM membangun alat yang tidak dapat mempublikasikan fungsi Lambda Anda.
Buat proyek Maven Anda
Jalankan perintah berikut untuk membuat proyek Maven Anda. Ganti groupId
dengan ID unik organisasi Anda, dan ganti my-athena-udf
dengan nama aplikasi Anda Untuk informasi lebih lanjut, lihat Bagaimana cara membuat proyek Maven pertama saya
mvn -B archetype:generate \ -DarchetypeGroupId=org.apache.maven.archetypes \ -DgroupId=
groupId
\ -DartifactId=my-athena-udfs
Tambahkan dependensi dan plugin ke proyek Maven Anda
Tambahkan konfigurasi berikut ke file proyek Maven pom.xml
Anda. Sebagai contoh, lihat file 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>
Tulis kode Java untuk UDFs
Buat kelas baru dengan memperluas UserDefinedFunctionHandler.java.
Dalam contoh berikut, dua metode Java untukUDFs, compress()
dandecompress()
, dibuat di dalam kelasMyUserDefinedFunctions
.
*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); } }
Membangun JAR file
Jalankanmvn clean install
untuk membangun proyek Anda. Setelah berhasil dibangun, JAR file dibuat di target
folder proyek Anda bernama
, di mana artifactId
-version
.jarartifactId
adalah nama yang Anda berikan dalam proyek Maven, misalnya,. my-athena-udfs
Menyebarkan ke JAR AWS Lambda
Anda memiliki dua pilihan untuk men-deploy kode Anda untuk Lambda:
-
Menyebarkan Menggunakan AWS Serverless Application Repository (Disarankan)
-
Buat Fungsi Lambda dari file JAR
Opsi 1: Menyebarkan ke AWS Serverless Application Repository
Ketika Anda menyebarkan JAR file Anda ke AWS Serverless Application Repository, Anda membuat YAML file AWS SAM template yang mewakili arsitektur aplikasi Anda. Anda kemudian menentukan YAML file ini dan bucket Amazon S3 tempat artefak untuk aplikasi Anda diunggah dan tersedia untuk file. AWS Serverless Application Repository Prosedur di bawah ini menggunakan skrip publish.shathena-query-federation/tools
direktori Athena Query Federation SDK yang Anda kloning sebelumnya.
Untuk informasi dan persyaratan selengkapnya, lihat Menerbitkan aplikasi di Panduan AWS Serverless Application Repository Pengembang, konsep AWS SAM templat di Panduan AWS Serverless Application Model Pengembang, dan Menerbitkan aplikasi tanpa server menggunakan. AWS SAM CLI
Contoh berikut menunjukkan parameter dalam YAML file. Tambahkan parameter serupa ke YAML file Anda dan simpan di direktori proyek Anda. Lihat 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
Salin publish.sh
skrip ke direktori proyek tempat Anda menyimpan YAML file Anda, dan jalankan perintah berikut:
./publish.sh
MyS3Location
MyYamlFile
Misalnya, jika lokasi bucket Anda s3://amzn-s3-demo-bucket/mysarapps/athenaudf
dan YAML file Anda disimpan sebagaimy-athena-udfs.yaml
:
./publish.sh amzn-s3-demo-bucket/mysarapps/athenaudf my-athena-udfs
Untuk membuat fungsi Lambda
-
Buka konsol Lambda di https://console.aws.amazon.com/lambda/
, pilih Create function, lalu pilih Browse serverless app repository -
PilihAplikasi privat, temukan aplikasi Anda dalam daftar, atau cari menggunakan kata-kata kunci, dan pilih.
-
Tinjau dan berikan detail aplikasi, lalu pilihTerapkan.
Anda sekarang dapat menggunakan nama metode yang ditentukan dalam JAR file fungsi Lambda Anda seperti di UDFs Athena.
Opsi 2: Buat fungsi Lambda secara langsung
Anda juga dapat membuat fungsi Lambda secara langsung menggunakan konsol atau. AWS CLI Contoh berikut menunjukkan menggunakan perintah create-function
CLI Lambda.
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