Mengoptimalkan pembacaan dengan pushdown di Glue ETL AWS - AWS Glue

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Mengoptimalkan pembacaan dengan pushdown di Glue ETL AWS

Pushdown adalah teknik optimasi yang mendorong logika tentang mengambil data lebih dekat ke sumber data Anda. Sumbernya bisa berupa database atau sistem file seperti Amazon S3. Saat menjalankan operasi tertentu secara langsung pada sumbernya, Anda dapat menghemat waktu dan daya pemrosesan dengan tidak membawa semua data melalui jaringan ke mesin Spark yang dikelola oleh GlueAWS.

Cara lain untuk mengatakan ini adalah bahwa pushdown mengurangi pemindaian data. Untuk informasi lebih lanjut tentang proses mengidentifikasi kapan teknik ini tepat, lihat Mengurangi jumlah pemindaian data dalam Panduan Pekerjaan Glue for Apache Spark Praktik Terbaik untuk Penyetelan kinerja AWS Glue untuk Apache Spark pada AWS Panduan Preskriptif.

Predikat pushdown pada file yang disimpan di Amazon S3

Saat bekerja dengan file di Amazon S3 yang telah diatur berdasarkan awalan, Anda dapat memfilter jalur Amazon S3 target Anda dengan menentukan predikat pushdown. Daripada membaca kumpulan data lengkap dan menerapkan filter dalam aDynamicFrame, Anda dapat langsung menerapkan filter ke metadata partisi yang disimpan di Katalog Data AWS Glue. Pendekatan ini memungkinkan Anda untuk secara selektif membuat daftar dan hanya membaca data yang diperlukan. Untuk informasi selengkapnya tentang proses ini, termasuk menulis ke ember berdasarkan partisi, lihatMengelola partisi untuk output ETL di AWS Glue.

Anda mencapai predikat pushdown di Amazon S3 dengan menggunakan parameter. push_down_predicate Pertimbangkan ember di Amazon S3 yang telah Anda partisi berdasarkan tahun, bulan, dan hari. Jika Anda ingin mengambil data pelanggan untuk Juni 2022, Anda dapat menginstruksikan AWS Glue untuk hanya membaca jalur Amazon S3 yang relevan. push_down_predicateDalam hal ini adalahyear='2022' and month='06'. Menyatukan semuanya, operasi baca dapat dicapai seperti di bawah ini:

Python
customer_records = glueContext.create_dynamic_frame.from_catalog( database = "customer_db", table_name = "customer_tbl", push_down_predicate = "year='2022' and month='06'" )
Scala
val customer_records = glueContext.getCatalogSource( database="customer_db", tableName="customer_tbl", pushDownPredicate="year='2022' and month='06'" ).getDynamicFrame()

Dalam skenario sebelumnya, push_down_predicate mengambil daftar semua partisi dari Katalog Data AWS Glue dan menyaringnya sebelum membaca file Amazon S3 yang mendasarinya. Meskipun ini membantu dalam banyak kasus, ketika bekerja dengan kumpulan data yang memiliki jutaan partisi, proses daftar partisi dapat memakan waktu. Untuk mengatasi masalah ini, pemangkasan partisi sisi server dapat digunakan untuk meningkatkan kinerja. Ini dilakukan dengan membangun indeks Partisi untuk data Anda di Katalog Data AWS Glue. Untuk informasi selengkapnya tentang indeks partisi, lihatMembuat indeks partisi . Anda kemudian dapat menggunakan catalogPartitionPredicate opsi untuk mereferensikan indeks. Untuk contoh mengambil partisi dengancatalogPartitionPredicate, lihat. Pemfilteran sisi server menggunakan predikat partisi katalog

Pushdown saat bekerja dengan sumber JDBC

Pembaca AWS Glue JDBC yang digunakan dalam GlueContext mendukung pushdown pada database yang didukung dengan menyediakan kueri SQL khusus yang dapat berjalan langsung pada sumbernya. Ini dapat dicapai dengan mengatur sampleQuery parameter. Kueri sampel Anda dapat menentukan kolom mana yang akan dipilih serta menyediakan predikat pushdown untuk membatasi data yang ditransfer ke mesin Spark.

Secara default, kueri sampel beroperasi pada satu node, yang dapat mengakibatkan kegagalan pekerjaan saat berhadapan dengan volume data yang besar. Untuk menggunakan fitur ini untuk menanyakan data dalam skala besar, Anda harus mengonfigurasi partisi kueri dengan menyetel enablePartitioningForSampleQuery ke true, yang akan mendistribusikan kueri ke beberapa node di seluruh kunci pilihan Anda. Partisi kueri juga memerlukan beberapa parameter konfigurasi lain yang diperlukan. Untuk informasi selengkapnya tentang partisi kueri, lihat. Membaca dari tabel JDBC secara paralel

Saat mengaturenablePartitioningForSampleQuery, AWS Glue akan menggabungkan predikat pushdown Anda dengan predikat partisi saat menanyakan database Anda. Anda sampleQuery harus diakhiri dengan AND for AWS Glue untuk menambahkan kondisi partisi. (Jika Anda tidak memberikan predikat pushdown, sampleQuery harus diakhiri dengan a). WHERE Lihat contoh di bawah ini, di mana kita menekan predikat untuk hanya mengambil baris yang id lebih besar dari 1000. Ini hanya sampleQuery akan mengembalikan kolom nama dan lokasi untuk baris yang id lebih besar dari nilai yang ditentukan:

Python
sample_query = "select name, location from customer_tbl WHERE id>=1000 AND" customer_records = glueContext.create_dynamic_frame.from_catalog( database="customer_db", table_name="customer_tbl", sample_query = "select name, location from customer_tbl WHERE id>=1000 AND", additional_options = { "hashpartitions": 36 , "hashfield":"id", "enablePartitioningForSampleQuery":True, "sampleQuery":sample_query } )
Scala
val additionalOptions = Map( "hashpartitions" -> "36", "hashfield" -> "id", "enablePartitioningForSampleQuery" -> "true", "sampleQuery" -> "select name, location from customer_tbl WHERE id >= 1000 AND" ) val customer_records = glueContext.getCatalogSource( database="customer_db", tableName="customer_tbl").getDynamicFrame()
catatan

Jika customer_tbl memiliki nama yang berbeda dalam Katalog Data dan datastore yang mendasarinya, Anda harus memberikan nama tabel yang mendasarinya di sample_query, karena kueri diteruskan ke datastore yang mendasarinya.

Anda juga dapat melakukan query terhadap tabel JDBC tanpa mengintegrasikan dengan AWS Glue Data Catalog. Alih-alih memberikan nama pengguna dan kata sandi sebagai parameter ke metode, Anda dapat menggunakan kembali kredensil dari koneksi yang sudah ada sebelumnya dengan menyediakan dan. useConnectionProperties connectionName Dalam contoh ini, kita mengambil kredensil dari koneksi yang disebut. my_postgre_connection

Python
connection_options_dict = { "useConnectionProperties": True, "connectionName": "my_postgre_connection", "dbtable":"customer_tbl", "sampleQuery":"select name, location from customer_tbl WHERE id>=1000 AND", "enablePartitioningForSampleQuery":True, "hashfield":"id", "hashpartitions":36 } customer_records = glueContext.create_dynamic_frame.from_options( connection_type="postgresql", connection_options=connection_options_dict )
Scala
val connectionOptionsJson = """ { "useConnectionProperties": true, "connectionName": "my_postgre_connection", "dbtable": "customer_tbl", "sampleQuery": "select name, location from customer_tbl WHERE id>=1000 AND", "enablePartitioningForSampleQuery" : true, "hashfield" : "id", "hashpartitions" : 36 } """ val connectionOptions = new JsonOptions(connectionOptionsJson) val dyf = glueContext.getSource("postgresql", connectionOptions).getDynamicFrame()

Catatan dan batasan untuk pushdown di Glue AWS

Pushdown, sebagai sebuah konsep, berlaku saat membaca dari sumber non-streaming. AWS Glue mendukung berbagai sumber - kemampuan untuk menekan tergantung pada sumber dan konektor.

  • Saat menghubungkan ke Snowflake, Anda dapat menggunakan opsi iniquery. Fungsionalitas serupa ada di konektor Redshift di AWS Glue 4.0 dan versi yang lebih baru. Untuk informasi lebih lanjut tentang membaca dari Snowflake denganquery, lihat. Membaca dari tabel Snowflake

  • Pembaca DynamoDB ETL tidak mendukung filter atau predikat pushdown. MongoDB dan DocumentDB juga tidak mendukung fungsi semacam ini.

  • Saat membaca dari data yang disimpan di Amazon S3 dalam format tabel terbuka, metode partisi untuk file di Amazon S3 tidak lagi cukup. Untuk membaca dan menulis dari partisi menggunakan format tabel terbuka, lihat dokumentasi untuk formatnya.

  • DynamicFrame metode tidak melakukan pushdown proyeksi Amazon S3. Semua kolom akan dibaca dari file yang melewati filter predikat.

  • Saat bekerja dengan custom.jdbc konektor di AWS Glue, kemampuan untuk menekan tergantung pada sumber dan konektor. Harap tinjau dokumentasi konektor yang sesuai untuk mengonfirmasi apakah dan bagaimana mendukung pushdown di GlueAWS.