Bu konuda Flink Python API işleri için arka plan bilgileri, sınırlamalar, geliştirme yöntemleri, hata ayıklama yöntemleri ve konektör kullanımı açıklanmaktadır.
Arka Plan Bilgileri
Flink Python işlerini yerel ortamda geliştirmeniz gerekir. Geliştirme tamamlandıktan sonra işleri Flink geliştirme konsolunda dağıtıp başlatarak iş sonuçlarını görüntüleyebilirsiniz. Genel yordam hakkında daha fazla bilgi için bkz. Flink Python işleri.
Geliştirme Ortamı Gereksinimleri
-
VVR 8.0.11 öncesi Realtime Compute for Apache Flink altyapı sürümlerinde Python 3.7.9 önceden yüklü olarak gelir. VVR 8.0.11 ve sonraki sürümlerde Python 3.9.21 önceden yüklü olarak gelir. VVR 11.7 ve sonraki sürümlerde Python 3.9.21, 3,10.19 ve 3,11.14 önceden yüklü olarak gelir.
NotYerel geliştirme ortamınızdaki Python sürümünün, hedef VVR altyapısıyla birlikte önceden yüklenen Python sürümüyle eşleşmesini öneririz.
NotVVR 11.7 ve sonraki sürümler varsayılan olarak Python 3.9 kullanır. Önceden yüklenen Python 3,10 veya 3,11'i kullanmak istiyorsanız işi aşağıdaki gibi yapılandırın:
sayfasında hedef işin adına tıklayın.
-
Configuration sekmesinde, Parameters bölümünün sağ tarafındaki Edit seçeneğine tıklayın ve Other Configuration alanına aşağıdaki yapılandırmayı ekleyin (örnek olarak Python 3,11 kullanılmıştır):
python.executable: python3.11 python.client.executable: python3.11
-
PyFlink yüklüdür ve sürümü hedef VVR altyapı sürümüyle eşleşir. Örneğin, dağıtım sayfasında seçtiğiniz altyapı
vvr-11.7.0-jdk11-flink-1.20ise şunu yüklemeniz gerekir:pip install ververica-flink==11.7.0NotVVR 11.5 ve önceki sürümler özel bir PyFlink paketi sağlamaz. Açık kaynaklı PyFlink'in karşılık gelen sürümünü yüklemeniz gerekir. Örneğin, dağıtım sayfasında seçtiğiniz altyapı
vvr-8.0.9-flink-1.17iseapache-flink==1.17.*yüklemeniz gerekir.pip install apache-flink==1.17.2 Bir IDE yüklüdür. PyCharm veya VS Code önerilir.
Python işlerini yerel ortamda geliştirip ardından Realtime Compute for Apache Flink konsolunda dağıtmanız ve çalıştırmanız gerekir.
Sınırlamalar
Dağıtım ve ağ ortamlarının Flink üzerindeki etkisi nedeniyle Python işlerini geliştirirken aşağıdaki sınırlamalara dikkat edin:
Yalnızca açık kaynaklı Flink V1.13 ve sonraki sürümler desteklenir.
Flink çalışma alanı, Pandas, NumPy ve PyArrow gibi yaygın kullanılan Python kitaplıklarını içeren önceden yüklenmiş bir Python ortamıyla birlikte gelir. Ayrıntılar için bu konunun sonundaki Önceden yüklenen paket listesi bölümüne bakın.
Flink çalışma zamanı ortamı yalnızca JDK 8 ve JDK 11'i destekler. Python işiniz üçüncü taraf JAR paketlerine bağımlıysa JAR paketlerinin uyumlu olduğundan emin olun.
VVR 4.x yalnızca açık kaynaklı Scala V2.11'i destekler. VVR 6.x ve sonraki sürümler yalnızca açık kaynaklı Scala V2.12'yi destekler. Python işiniz üçüncü taraf JAR paketlerine bağımlıysa JAR paketi bağımlılıklarının ilgili Scala sürümüyle eşleştiğinden emin olun.
İş Geliştirme
Table API/SQL ile DataStream API Arasında Seçim Yapma
PyFlink iki geliştirme yaklaşımını destekler: Table API/SQL ve DataStream API. Table API/SQL aşağıdaki nedenlerle önerilir:
Daha iyi performans: Table API/SQL'in optimize edilmiş yürütme planı tamamen JVM içinde çalışır. Buna karşılık DataStream API, JVM ile Python işlemi arasında satır bazında serileştirme ve serileştirmeyi kaldırma gerektirir; bu da önemli bir performans yükü getirir.
Daha kapsamlı özellikler: Table API/SQL, konektörler, veri biçimleri ve pencere işlevleri için daha eksiksiz destek sunar ve SQL işleriyle aynı konektör ekosistemini paylaşır.
Topluluk tavsiyesi: Apache Flink topluluğu, PyFlink için birincil geliştirme yönü olarak Table API/SQL'e öncelik verir.
DataStream API'yi yalnızca SQL ile ifade edilemeyen karmaşık özel mantık senaryolarında kullanın.
Geliştirme Referansları
Flink iş kodunu yerel olarak geliştirmek için aşağıdaki belgelere başvurabilirsiniz. Geliştirme tamamlandıktan sonra kodu Flink geliştirme konsoluna yükleyip işi dağıtın.
Apache Flink V1.20 iş kodu geliştirmesi için bkz. Flink Python API Geliştirme Kılavuzu.
Apache Flink kodlama sırasında karşılaşılan sorunlar ve çözümleri için bkz. SSS.
Proje Yapısı
Python işleri için önerilen proje yapısı aşağıdaki gibidir:
my-flink-python-project/
├── my_job.py # Main job file.
├── udfs.py # User-defined functions (optional)
├── requirements.txt # Third-party Python dependencies (optional)
└── config.properties # Configuration file (optional)
Bağımlılık Yönetimi
Python işlerinde özel Python sanal ortamlarının, üçüncü taraf Python paketlerinin, JAR dosyalarının ve veri dosyalarının nasıl kullanılacağı hakkında bilgi için bkz. Python bağımlılıklarını kullanma.
Kullanıcı Tanımlı İşlevler (UDF'ler)
Aşağıda, hassas dize verilerini maskeleyen bir Python UDSF geliştirme örneği verilmiştir:
from pyflink.table import DataTypes
from pyflink.table.udf import udf
@udf(result_type=DataTypes.STRING())def mask_phone(phone: str):"""Phone number masking: retains the first 3 and last 4 digits, replacing the middle with ****"""if phone is None or len(phone) != 11:return phone.
return phone[:3] + '****' + phone[7:]
Bu UDF'yi bir SQL işinde şu şekilde kullanın:
CREATE TEMPORARY FUNCTION mask_phone AS 'udfs.mask_phone' LANGUAGE PYTHON;INSERT INTO sink_table
SELECT name, mask_phone(phone) AS masked_phone
FROM source_table;
UDF'lerin nasıl kaydedileceği, güncelleneceği ve silineceği hakkında bilgi için bkz. UDF'leri yönetme.
Konektörleri Kullanma
Flink tarafından desteklenen konektörlerin listesi için bkz. Desteklenen konektörler. Bir konektörü kullanmak için aşağıdaki adımları uygulayın:
Realtime Compute konsoluna giriş yapın.
Hedef çalışma alanının Actions sütununda Console seçeneğine tıklayın.
Sol gezinme bölmesinde Artifacts seçeneğine tıklayın.
-
Upload Artifact seçeneğine tıklayın ve hedef konektörün Python paketini seçerek yükleyin.
Kendi geliştirdiğiniz bir konektörü veya Flink tarafından sağlanan bir konektörü yükleyebilirsiniz. Flink tarafından sağlanan konektörlerin resmi Python paketlerini indirmek için bkz. Konektör listesi.
sayfasında seçeneğine tıklayın. Additional Dependencies alanı için hedef konektörün Python paketini seçin, diğer parametreleri yapılandırın ve işi dağıtın.
-
Dağıtılan işin adına tıklayın. Configuration sekmesinde, Parameters bölümündeki Edit seçeneğine tıklayın. Other Configuration alanında Python konektör paketlerinin konum bilgilerini ekleyin.
İşiniz birden çok konektör Python paketine bağımlıysa, örneğin connector-1.jar ve connector-2.jar adlı iki paket varsa yapılandırma aşağıdaki gibidir.
pipeline.classpaths: 'file:///flink/usrlib/connector-1.jar;file:///flink/usrlib/connector-2.jar' -
Yerleşik konektörleri, veri biçimlerini ve katalogları (yalnızca VVR 11.2 ve sonraki sürümler) kullanmak için işin Additional Configuration altındaki Running Parameters bölümüne yapılandırmayı ekleyin. Örnek:
## Multiple connectors used. pipeline.used-builtin-connectors: kafka;sls ## Multiple data formats for data transmission. pipeline.used-builtin-formats: avro;parquet ## Multiple previously created catalogs used. pipeline.used-builtin-catalogs: catalogname1;catalogname2
Konektörlerin nasıl kullanılacağına ilişkin ayrıntılar için bkz. Tam örnek kod.
İş Hata Ayıklama
Sorun giderme amacıyla günlük bilgilerini çıktılamak için Python UDF'lerinin kod uygulamasında günlükleme kullanabilirsiniz. Örnek:
import logging
@udf(result_type=DataTypes.BIGINT())
def add(i, j):
logging.info("hello world")
return i + j
Günlük çıktısı alındıktan sonra günlükleri TaskManager günlük dosyalarında görüntüleyebilirsiniz.
Yerel Hata Ayıklama
Realtime Compute for Apache Flink varsayılan olarak İnternet erişimine sahip olmadığından kodunuz yerel ortamda çevrimiçi veri kaynaklarına doğrudan bağlanamayabilir. Yerel hata ayıklama için aşağıdaki yaklaşımları öneririz:
Birim testi: İşlev mantığının doğru olduğundan emin olmak için UDF'lerde bağımsız birim testleri gerçekleştirin.
-
Yerel yürütme: Girişleri simüle etmek için yerel veri kaynaklarını (dosyalar veya bellek içi veriler gibi) kullanın ve işleme mantığını doğrulamak için işi yerel olarak çalıştırın. Örnek:
from pyflink.datastream import StreamExecutionEnvironment env = StreamExecutionEnvironment.get_execution_environment()# Use a local data source for testing. ds = env.from_collection([('Alice', 1), ('Bob', 2), ('Alice', 3)]) ds.key_by(lambda x: x[0]).sum(1).print() env.execute("local_test") Uzaktan hata ayıklama: Çevrimiçi veri kaynaklarına bağlanarak hata ayıklamak için bkz. Konektörlerle işleri yerel olarak çalıştırma ve hata ayıklama.
İş Dağıtımı
Python işi geliştirmesi tamamlandıktan sonra işi dağıtmak üzere Realtime Compute konsoluna yükleyin. Aşağıdaki adımları uygulayın:
Realtime Compute konsoluna giriş yapın ve hedef çalışma alanına gidin.
Sol gezinme bölmesinde Artifacts seçeneğine tıklayın ve Python iş dosyasını (.py veya .zip) yükleyin. Üçüncü taraf bağımlılıklar veya yapılandırma dosyaları varsa bunları da yükleyin.
-
sayfasında seçeneğine tıklayın ve dağıtım bilgilerini doldurun.
Parameter
Description
Python File Path
Yüklenen Python iş dosyasını seçin.
Entry Module
İş dosyası bir .py dosyasıysa bu alan gerekli değildir. İş dosyası bir .zip dosyasıysa giriş modülü adını belirtin, örneğinmy_job.
Additional Dependencies
Varsa konektör JAR dosyalarını veya yapılandırma dosyalarını seçin.
Python Libraries
Varsa üçüncü taraf Python paketlerini (.whl veya .zip) seçin.
Python Archives
Varsa özel Python sanal ortamını (.zip) seçin. Deploy seçeneğine tıklayın.
Dağıtım parametreleri hakkında daha fazla bilgi için bkz. İş dağıtma.
Tam Örnek Kod
Bu örnekte Kafka'dan veri okuyan, basit işleme gerçekleştiren ve sonuçları MySQL'e yazan bir Python akış işi gösterilmektedir. Bu yalnızca referans amaçlıdır.
Bu örnekte kontrol noktaları ve yeniden başlatma stratejileri gibi çalışma parametrelerinin yapılandırması yer almamaktadır. Bu yapılandırmaları işi dağıttıktan sonra Deployment Details sayfasında özelleştirebilirsiniz. Daha fazla bilgi için bkz. İş dağıtım bilgilerini yapılandırma.
import logging
import sys
from pyflink.common import Types
from pyflink.datastream import StreamExecutionEnvironment
from pyflink.table import StreamTableEnvironment
logging.basicConfig(stream=sys.stdout, level=logging.INFO)
def kafka_to_mysql():
# Create the execution environment.
env = StreamExecutionEnvironment.get_execution_environment()
t_env = StreamTableEnvironment.create(env)
# Create the Kafka source table.
t_env.execute_sql("""
CREATE TABLE kafka_source (
`id` INT,
`name` STRING,
`score` INT,
`event_time` TIMESTAMP(3),
WATERMARK FOR event_time AS event_time - INTERVAL '5' SECOND
) WITH (
'connector' = 'kafka',
'topic' = 'student_topic',
'properties.bootstrap.servers' = 'your-kafka-broker:9092',
'properties.group.id' = 'my-group',
'scan.startup.mode' = 'latest-offset',
'format' = 'json'
)
""")
# Create the MySQL sink table.
t_env.execute_sql("""
CREATE TABLE mysql_sink (
`id` INT,
`name` STRING,
`score` INT,
PRIMARY KEY (id) NOT ENFORCED
) WITH (
'connector' = 'jdbc',
'url' = 'jdbc:mysql://your-mysql-host:3306/my_database',
'table-name' = 'student',
'username' = 'your_username',
'password' = 'your_password'
)
""")
# Filter records with scores greater than 60 and write them to MySQL.
t_env.execute_sql("""
INSERT INTO mysql_sink
SELECT id, name, score
FROM kafka_source
WHERE score >= 60
""")
if __name__ == '__main__':
kafka_to_mysql()
Önceden Yüklenen Paketler
VVR-11
Aşağıdaki paketler Flink çalışma alanında önceden yüklenmiştir.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
VVR-8
Aşağıdaki paketler Flink çalışma alanında önceden yüklenmiştir.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
VVR-6
Aşağıdaki paketler Flink çalışma alanında önceden yüklenmiştir.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Referanslar
Flink Python işleri için tam bir geliştirme iş akışı örneği için bkz. Flink Python işleri.
Flink Python işlerinde özel Python sanal ortamlarının, üçüncü taraf Python paketlerinin, JAR dosyalarının ve veri dosyalarının kullanımı hakkında bilgi için bkz. Python bağımlılıklarını kullanma.
Realtime Compute for Apache Flink ayrıca SQL ve DataStream işlerini de destekler. Daha fazla bilgi için bkz. İş geliştirme kılavuzu ve JAR işleri geliştirme.