簡體   English   中英

KSQL:我可以在 KSQL UDF 函數中使用線程來加快進程嗎?

[英]KSQL: Could I use threads in KSQL UDF functions to speed up the process?

我在 3 個節點中運行獨立的ksql-server ,與 3 個節點的Kafka集群通信。 從具有 15 個分區的Topic創建了一個Stream ,數據在流中以進行一些豐富。 得到一段代碼作為UDF來查找 IP2Location.bin 文件, UDF類如下所示:

import java.io.IOException;
import java.util.Map;

import com.google.gson.Gson;

import io.confluent.common.Configurable;
import io.confluent.ksql.function.udf.Udf;
import io.confluent.ksql.function.udf.UdfDescription;

@UdfDescription(name = "Ip2Lookup", description = "Lookup class for IP2Location database.")
public class Ip2Lookup implements Configurable {

    private IP2Location loc = null;
    private Gson gson = null;

    @Udf(description = "fetches the geoloc of the ipaddress.")
    public synchronized String ip2lookup(String ip) {

        String json = null;
        if (loc != null) {
            IP2LocationResult result = null;
            try {
                result = loc.query(ip);
                System.out.println(result);
                json = gson.toJson(result);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return json;
        }
        return ip;
    }

    @Override
    public void configure(Map<String, ?> arg0) {

        try {
            String db_path = null;
            String os = System.getProperty("os.name").toLowerCase();

            db_path = "/data/md0/ip2loc/ipv4-bin/IP-COUNTRY-REGION-CITY-LATITUDE-LONGITUDE-ZIPCODE-TIMEZONE-ISP-DOMAIN-NETSPEED-AREACODE-WEATHER-MOBILE-ELEVATION-USAGETYPE.BIN";

            loc = new IP2Location(db_path);
            gson = new Gson();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

進入TopicStream數據非常快(可能是每秒一百萬條記錄)。 在方法上synchronized到位后,每個ksql-server節點的速度為每秒 3000 條記錄/消息。 有了這個速度,你知道,追趕速度需要時間。 如果沒有synchronized方法,我會看到損壞的數據,因為多個線程左右使用單個對象/方法。

問題1:如何准確的udf通話將被稱為/由KSQL調用?

問題 2:我可以使用線程處理udf的請求嗎?

問題 3:作為 Topic/Stream 有 15 個分區,我應該啟動 15 個ksql-servers節點嗎?

謝謝。

問題 1:KSQL 將如何調用/調用 udf 調用?

不明白你的意思。 一旦您的 UDF 可用於 KSQL(請參閱https://docs.confluent.io/current/ksql/docs/developer-guide/udf.html#deploying ),您可以在 KSQL 語句IP2LOOKUP UDF 稱為IP2LOOKUP 您還可以在 KSQL 中運行SHOW FUNCTIONS以確認您的 UDF 可供使用。

也許您是因為下一個問題而問的? KSQL 將一次調用您的 UDF 一條消息。

問題 2:我可以使用線程處理 udf 中的請求嗎?

你為什么想這么做? 您是否擔心使用您當前的 UDF 代碼的 KSQL 無法處理傳入的數據量? 說到這,什么預期的數據量,你試圖把手,因為也許你正在嘗試做過早的優化?

另外,在不知道更多細節的情況下,我認為 UDF 的多線程設置不會產生任何優勢,因為 UDF 在調用時仍然一次只處理一條消息(每個 KSQL 服務器,或者更准確地說,每個流任務,其中每個 KSQL 服務器可以有很多;我提到這一點是為了清楚說明 KSQL 中的 UDF不會通過在所有服務器上僅處理一條消息來阻礙您的處理;處理當然是分布式的,並且發生在平行線)。

問題3:作為Topic/Stream有15個分區,我應該啟動15個ksql-servers節點嗎?

這取決於您的數據量。 您可以根據需要旋轉任意數量的 KSQL 服務器。 如果數據量較低,單個 KSQL 服務器可能就足夠了。 如果數據量更大,您可以開始啟動額外的 KSQL 服務器,最多 15 個服務器(因為輸入主題有 15 個分區)。 任何額外的 KSQL 服務器都將處於空閑狀態。

在 15 個 KSQL 服務器不夠的情況下,您應該將輸入主題的分區數從 15 個增加到更高的數量,然后您還可以啟動更多的 KSQL 服務器(從而增加您設置的計算能力)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM