Realtime Compute for Apache Flink, Flink SQL işlerinde Python kullanıcı tanımlı işlevleri (UDF) destekler. Python'da skaler, toplam ve tablo işlevleri oluşturabilir, Python bağımlılıklarını yönetebilir ve UDF performansını ayarlayabilirsiniz.
Kullanıcı tanımlı işlev türleri
|
|
|
|
|
|
|
|
|
|
|
|
Python bağımlılıklarını kullanma
Realtime Compute for Apache Flink kümeleri, Pandas, NumPy ve PyArrow gibi yaygın Python paketleri önceden yüklenmiş olarak gelir. Önceden yüklenen üçüncü taraf Python paketlerinin listesi için bkz. Python işlerini geliştirme. Aşağıdaki örnekte gösterildiği gibi, bu paketleri kullanmadan önce işlevinizde içe aktarın.
@udf(result_type=DataTypes.FLOAT())
def percentile(values: List[float], percentile: float):
import numpy as np
return np.percentile(values, percentile)
Önceden yüklenmemiş bir üçüncü taraf Python paketi kullanmak için Python UDF'yi kaydederken bu paketi bağımlılık dosyası olarak yükleyin. Daha fazla bilgi için bkz. Kullanıcı tanımlı işlevleri (UDF) yönetme ve Python bağımlılıklarını kullanma.
Kod hata ayıklama
Sorun giderme amacıyla Python kullanıcı tanımlı işlevinizden günlük bilgilerini çıktılamak için logging modülünü kullanabilirsiniz. Aşağıdaki örnekte logging'in nasıl kullanılacağı gösterilmektedir.
@udf(result_type=DataTypes.BIGINT())
def add(i, j):
logging.info("hello world")
return i + j
Günlükler oluşturulduktan sonra bunları TaskManager günlük dosyalarında görüntüleyebilirsiniz. Daha fazla bilgi için bkz. Çalıştırma günlüklerini görüntüleme.
Performans ayarlama
Kaynakların önceden yüklenmesi
eval yöntemine yapılan her çağrıda kaynakların yeniden yüklenmesini önlemek için işlev başlatma sırasında kaynakları önceden yükleyin. Örneğin, büyük bir derin öğrenme modelini bir kez yükleyip ardından bu modele karşı toplu iş tahminleri çalıştırabilirsiniz.
from pyflink.table import DataTypes
from pyflink.table.udf import ScalarFunction, udf
class Predict(ScalarFunction):
def open(self, function_context):
import pickle
with open("resources.zip/resources/model.pkl", "rb") as f:
self.model = pickle.load(f)
def eval(self, x):
return self.model.predict(x)
predict = udf(Predict(), result_type=DataTypes.DOUBLE(), func_type="pandas")
Python veri dosyalarının nasıl yükleneceği hakkında bilgi için bkz. Python bağımlılıklarını kullanma.
Eşzamansız kullanıcı tanımlı işlevler
Harici veritabanlarına erişme veya HTTP hizmeti çağrıları yapma gibi G/Ç yoğun senaryolar için eşzamansız kullanıcı tanımlı işlevleri kullanın. Tek bir işlev örneği, birden çok isteği aynı anda işleyebilir; bekleme süresini birkaç çağrıya dağıtarak iş aktarım hızını önemli ölçüde artırır. Bu özellik yalnızca VVR 11.7 ve sonraki sürümlerde desteklenir ve yalnızca kullanıcı tanımlı skaler işlevler (UDSF) için geçerlidir. Ayrıntılar için bkz. Eşzamansız kullanıcı tanımlı işlevler.
Pandas kitaplığını kullanma
Standart Python kullanıcı tanımlı işlevlerine ek olarak Realtime Compute for Apache Flink, Pandas kullanıcı tanımlı işlevleri de destekler. Bu işlevler, pandas.Series ve pandas.DataFrame gibi Pandas veri yapılarını giriş olarak kabul eder; böylece Pandas ve NumPy gibi yüksek performanslı kitaplıklardan yararlanabilirsiniz. Daha fazla bilgi için bkz. Vektörleştirilmiş Kullanıcı Tanımlı İşlevler.
Parametreler
Bir Python kullanıcı tanımlı işlevinin performansı büyük ölçüde uygulamasına bağlıdır. Performans sorunlarıyla karşılaşırsanız önce işlev mantığını optimize edin. Aşağıdaki parametreler de performansı etkiler.
|
Parametre |
Açıklama |
|
python.fn-execution.bundle.size |
Python UDF'ler eşzamansız olarak çalışır. Java operatörü, verileri yürütme için bir Python işlemine göndermeden önce önbelleğe alır. Önbellek bir eşik değerine ulaştığında veriler Python işlemine gönderilir. Varsayılan değer 100.000 kayıttır. |
|
python.fn-execution.bundle.time |
Bu parametre, maksimum önbelleğe alma süresini kontrol eder. Kayıt sayısı Varsayılan değer 1.000 milisaniyedir. |
|
python.fn-execution.arrow.batch.size |
Pandas UDF'ler için bu parametre, bir Arrow toplu işinin içerebileceği maksimum kayıt sayısını belirtir. Varsayılan değer 10.000'dir. Not
|
Bu parametreleri aşırı büyük değerlere ayarlamak ters etki yaratabilir. Bir kontrol noktası sırasında aşırı arabelleğe alma, kontrol noktalarının çok uzun sürmesine veya başarısız olmasına neden olabilir. Bu parametreler hakkında daha fazla bilgi için bkz. Yapılandırma.
İlgili konular
Kullanıcı tanımlı bir işlevi kaydetme, güncelleme ve silme hakkında bilgi için bkz. Kullanıcı tanımlı işlevleri (UDF) yönetme.
Python kullanıcı tanımlı işlevlerin nasıl geliştirileceği ve kullanılacağına ilişkin demolar için bkz. Kullanıcı tanımlı toplam işlevleri (UDAF), Kullanıcı tanımlı skaler işlevler (UDSF) ve Kullanıcı tanımlı tablo işlevleri (UDTF).
Flink Python işinde özel Python sanal ortamları, üçüncü taraf Python paketleri, JAR paketleri ve veri dosyalarını nasıl kullanacağınızı öğrenmek için bkz. Python bağımlılıklarını kullanma.
Java kullanıcı tanımlı işlevlerin nasıl geliştirileceği ve kullanılacağına ilişkin demolar için bkz. Kullanıcı tanımlı toplam işlevleri (UDAF), Kullanıcı tanımlı skaler işlevler (UDSF) ve Kullanıcı tanımlı tablo işlevleri (UDTF).
Java kullanıcı tanımlı işlevlerde hata ayıklama ve performans ayarlama hakkında bilgi edinmek için bkz. Genel Bakış.