2017-07-14 68 views
0

我們計劃運行分佈在兩臺機器上的kafka流應用程序。每個實例都將其Ktable數據存儲在自己的機器上。 我們面臨的挑戰是,Kafka交互式查詢 - 跨實例訪問大量數據

  1. 我們有100萬條記錄推送到Ktable。我們需要迭代整個Ktable(RocksDB)數據並生成報告。
  2. 假設存儲在每個實例中的500K個記錄。通過http (除非有任何流式TCP技術可用),通過單個GET從其他實例獲取所有記錄是不可能的。基本上 我們需要一次調用兩個實例數據並生成報告。

建議的解決方案: 我們正在考慮有這兩個instances.So共享位置(state.dir),這兩種情況下,將存儲在同一目錄下的Ktable數據和想法是讓所有數據一個實例,而不只是通過調用交互式查詢,

final ReadOnlyKeyValueStore<Key, Result> allDataFromTwoInstance = 
     streams.store("result", 
      QueryableStoreTypes.<Key, Result>keyValueStore()) 

    KeyValueIterator<Key, ReconResult> iterator = allDataFromTwoInstance.all(); 
    while (iterator.hasNext()) { 
     //append to excel report 
    } 

問題: 請問上述解決方案的工作沒有任何問題?如果沒有,有沒有其他解決方案呢?

請建議。提前致謝

回答

2

GlobalKTable是最自然是首選,但它是指其中定義的全局表包含整個數據集的每個節點。

想到的另一種方法的確是在點播節點之間流動數據。這很有意義,特別是如果創建報告不是偶發操作,或者數據集不適合單個節點。基本上,你可以按照查詢遠程卡夫卡流的文件指引節點位置:

http://kafka.apache.org/0110/documentation/streams/developer-guide#streams_developer-guide_interactive-queries_discovery

和RPC使用支持流媒體的框架,例如阿卡-HTTP。

服務器端的數據流:

http://doc.akka.io/docs/akka-http/current/java/http/routing-dsl/source-streaming-support.html

消費流響應:

http://doc.akka.io/docs/akka-http/current/java/http/implications-of-streaming-http-entity.html#client-side-handling-of-streaming-http-entities

+0

阿卡-http看起來很有趣。非常感謝你的詳細解釋 – Sathish