[英]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();
}
}
}
進入Topic
和Stream
數據非常快(可能是每秒一百萬條記錄)。 在方法上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.