Fungsi skalar yang didefinisikan pengguna (UDSF) memetakan nol, satu, atau beberapa nilai skalar ke satu nilai skalar. Setiap baris input menghasilkan tepat satu nilai output.
Topik ini menjelaskan cara membuat, mendaftarkan, dan menggunakan UDSF Python di Realtime Compute for Apache Flink.
Batasan
Batasan berikut berlaku saat Anda mengembangkan fungsi yang didefinisikan pengguna (UDF) Python di Realtime Compute for Apache Flink:
| Constraint | Requirement |
|---|---|
| Versi Apache Flink | 1.12 dan versi setelahnya |
| Versi Python | Telah dipasang sebelumnya di setiap ruang kerja. VVR sebelum 8.0.11: Python 3.7.9. VVR 8.0.11 dan versi setelahnya: Python 3.9.21. |
| Versi JDK | JDK 8 dan JDK 11. Paket JAR pihak ketiga harus kompatibel dengan JDK 8 atau JDK 11. |
| Versi Scala | Hanya Scala 2.11 open-source. Paket JAR pihak ketiga harus kompatibel dengan Scala 2.11. |
Setelah melakukan upgrade ke VVR 8.0.11 atau versi setelahnya, uji, terapkan, dan jalankan kembali draft PyFlink yang sudah ada untuk memastikan kompatibilitas.
Membuat UDSF
Langkah-langkah berikut menggunakan Windows sebagai contoh lingkungan. Flink menyediakan repositori contoh yang mencakup implementasi untuk UDSF, fungsi agregat yang didefinisikan pengguna (UDAF), dan fungsi bernilai tabel yang didefinisikan pengguna (UDTF).
-
Unduh dan ekstrak python_demo-master ke mesin lokal Anda.
Ini adalah repositori GitHub pihak ketiga. Akses mungkin lambat atau tidak stabil.
-
Di PyCharm, pilih File > Open dan buka direktori
python_demo-masteryang telah diekstrak. -
Buka file
udfs.pydi path\python_demo-master\udx, lalu definisikan UDSF Anda.from pyflink.table import DataTypes from pyflink.table.udf import udf @udf(result_type=DataTypes.STRING()) def sub_string(s: str, begin: int, end: int): return s[begin:end]Contoh fungsi
sub_stringmengekstraksi karakter dari posisibeginhingga posisienddalam string input. -
Dari direktori
\python_demo-master, jalankan perintah berikut untuk membuat paket direktoriudx:zip -r python_demo.zip udxSaat file
python_demo.zipmuncul di\python_demo-master\, paket tersebut siap digunakan.
Mendaftarkan UDSF
Setelah membuat paket, daftarkan UDSF di konsol Realtime Compute for Apache Flink. Untuk langkah-langkah pendaftarannya, lihat Mengelola fungsi yang didefinisikan pengguna (UDF).
Menggunakan UDSF
Setelah mendaftarkan UDSF, gunakan fungsi tersebut dalam pekerjaan Flink SQL.
-
Buat draft menggunakan Flink SQL. Untuk detailnya, lihat Ikhtisar pengembangan pekerjaan. Contoh berikut memanggil
ASI_UDSF(nama terdaftar UDSF Anda) untuk mengekstraksi karakter dari posisi 2 hingga 4 pada bidangadi tabel sumber:CREATE TEMPORARY TABLE ASI_UDSF_Source ( a VARCHAR, b INT, c INT ) WITH ( 'connector' = 'datagen' ); CREATE TEMPORARY TABLE ASI_UDSF_Sink ( a VARCHAR ) WITH ( 'connector' = 'blackhole' ); INSERT INTO ASI_UDSF_Sink SELECT ASI_UDSF(a, 2, 4) FROM ASI_UDSF_Source; -
Di panel navigasi sebelah kiri Konsol pengembangan, pilih O&M > Deployments. Temukan deployment tersebut, lalu klik Start di kolom Actions. Setelah deployment dimulai, karakter pada posisi 2–4 dari bidang
adiASI_UDSF_Sourceakan ditulis keASI_UDSF_Sink.
Fungsi yang didefinisikan pengguna asinkron
Untuk UDF yang melakukan operasi intensif I/O seperti akses database eksternal atau permintaan HTTP, gunakan fungsi yang didefinisikan pengguna asinkron. Satu UDF asinkron dapat menangani beberapa permintaan I/O secara bersamaan, mendistribusikan waktu tunggu di antara permintaan, serta meningkatkan throughput pekerjaan.
Batasan
-
Hanya didukung pada VVR 11.7 dan versi setelahnya. Diperlukan VVR PyFlink 11.7 atau versi setelahnya. Untuk detailnya, lihat ververica-flink.
pip3 install "ververica-flink>=11.7" -
Hanya fungsi skalar yang didefinisikan pengguna asinkron (UDSF) yang didukung.
-
Hanya mode proses Python yang didukung, yaitu
python.execution-mode=process. -
Fungsi yang didefinisikan pengguna asinkron berbasis Pandas belum didukung.
Penggunaan
Fungsi yang didefinisikan pengguna asinkron dapat diimplementasikan sebagai fungsi async Python atau sebagai subclass dari kelas fungsi asinkron. Contoh kode ditampilkan di bawah ini.
import asyncio
from pyflink.table import DataTypes
from pyflink.table.udf import AsyncScalarFunction, udf
# Metode 1: Gunakan fungsi async Python
@udf(result_type=DataTypes.STRING())
async def async_api_call(product_id: str) -> str:
await asyncio.sleep(0.05)
return f"product_{product_id}"
# Metode 2: Subclass dari kelas fungsi asinkron
class AsyncUserLookup(AsyncScalarFunction):
def open(self, function_context):
self.cache = {}
async def eval(self, user_id: str) -> str:
if user_id in self.cache:
return self.cache[user_id]
await asyncio.sleep(0.05)
result = f"user_{user_id}"
self.cache[user_id] = result
return result
def close(self):
self.cache.clear()
async_user_lookup = udf(
AsyncUserLookup(),
input_types=[DataTypes.STRING()],
result_type=DataTypes.STRING()
)
Fungsi yang didefinisikan pengguna asinkron didaftarkan dan digunakan dengan cara yang sama seperti fungsi sinkron.
Parameter konfigurasi
Parameter berikut mengontrol perilaku waktu proses fungsi yang didefinisikan pengguna asinkron.
|
Parameter |
Nilai default |
Deskripsi |
|
table.exec.async-scalar.max-concurrent-operations |
10 |
Jumlah maksimum panggilan asinkron konkuren per instans operator. Nilai default: 10. |
|
table.exec.async-scalar.timeout |
3 min |
Timeout untuk satu panggilan asinkron. |
|
table.exec.async-scalar.retry-strategy |
FIXED_DELAY |
Strategi pengulangan setelah panggilan asinkron gagal. Nilai yang didukung:
|
|
table.exec.async-scalar.retry-delay |
100 ms |
Waktu tunggu untuk pengulangan dengan penundaan tetap. Catatan
Hanya berlaku saat table.exec.async-scalar.retry-strategy diatur ke FIXED_DELAY. |
|
table.exec.async-scalar.max-attempts |
3 |
Jumlah maksimum upaya sebelum panggilan asinkron dianggap gagal. Catatan
Hanya berlaku saat table.exec.async-scalar.retry-strategy diatur ke FIXED_DELAY. |