2017-05-17 169 views
1

我很興奮點燃並且對客戶端和服務器節點的責任有疑問。據我從文檔客戶端節點是非常小的機器,所以這不是他們的目的執行一些沉重的緩存操作。例如,我需要從某個持久性存儲中加載數據,執行一些沉重的緩存相關計算並將結果數據放入緩存。它看起來像這樣:瞭解客戶端和服務器

//This is on a client node 
public class Loader{ 

private DataSource dataSource; 

@IgniteInstanceResource 
private Ignite ignite; 

    public void load(){ 
     String key; 
     String values; 
     //retreive key and value from the dataSource 
     IgniteDataStreamer<String, String> streamer = ignite.dataStreamer("cache"); 
     String result; 
     //process value 
     streamer.addData(key, result); //<---------1 
    } 

} 

的問題是關於//1。處理加載的數據並將其放入緩存是客戶端節點的責任嗎?實際上我打算執行以下操作:爲每個加載的String keyString value創建任務,並在服務器節點上執行所有評估和緩存相關的操作。如下所示:

二,

public class LoaderJob extends ComputeJobAdapter{ 
    private String key; 
    private String value; 

    @Override 
    public Object execute(){ 
     //perform all computation and putting into cache here 
     //and return Tuple2(key, result); 
    } 
} 

public class LoaderTask extends extends ComputeTaskSplitAdapter<Void, Void { 

    //... 

    public Void reduce(List<ComputeJobResult> results) throws IgniteException { 
     results.stream().forEach(result -> { 
      Tuple2<String, String> jobResult = result.getData(); 
      ignite.dataStreamer("cache").addData(jobResult._1, jobResult._2); 
     }); 
     return null; 
    } 
} 

在什麼客戶端做的是隻裝載從持久性存儲數據,然後在服務器上發佈任務的第二種情況。

什麼是做這樣的事情的常見方式?

回答

2

這取決於數據量和計算複雜度。如果數據量很大,則可以直接從服務器加載數據,而無需使用客戶端。

Here是DataStreamer最簡單的例子,您只需要從持久性存儲中添加加載數據並在使用DataStreamer之前進行計算。

另外,這取決於其它的東西,比如客戶端confuguration(CPU,RAM,網絡)和客戶端和服務器節點之間的連接。如果客戶端具有良好的配置,例如作爲服務器,並且它與服務器節點在同一網絡中,那麼在客戶端上進行加載和計算並且僅在將數據流式傳輸到緩存之後,這不是問題。

+0

將會有大約25TB的數據。所以,好點...我害怕系列化的代價。 –

1

IgniteDataStreamer是在高速緩存加載數據的最快方法。所以,第一種情況是有效的。

我認爲,第二種情況下明智的,如果一個數據將從持久性存儲的服務器節點上收集和發送端加載的唯一參數。

2

創建工作奉獻了自己的一些數據,是壞主意。類似這樣的流媒體(數據將被緩存併發送到將被存儲的特定節點)。

客戶端節點是非常小的機器,所以這不是他們的目的是執行一些沉重的緩存操作

這不是一個真實的陳述。您可以爲客戶端JVM提供足夠的資源來加載數據。

您應該創建從本機客戶端和負載數據的一個數據流光。流式實例也是線程保存,所以您可以同時從一些線程加載日期。