2016-09-30 67 views
2

我有一個並行度爲8的DataStream。我將兩個接收器添加到DataStream中。一個很慢(Elasticsearch),另一個很快(HDFS)。但是,我的事件只會在被刷新到ES後寫入HDFS,因此ES需要的時間比無ES的時間要長。如何在Apache Flink中並行寫入接收器

dataStream.setParallelism(8); 
dataStream.addSink(elasticsearchSink); 
dataStream.addSink(hdfsSink); 

在我看來,這兩個匯使用相同的線程。是否可以通過使用與兩個接收器相同的源,或者是否必須添加另一個作業(一個用於earch接收器)以並行寫入輸出?

我檢查了Map(1/8)到Map(8/8)正在部署和接收數據的日誌。

回答

1

如果Elasticsearch接收器無法跟上輸入生成的速度,它會減慢其輸入運算符。這個概念被稱爲背壓,這意味着一個緩慢的消費者阻止一個快速的生產者加工。

使您的程序按照您的預期工作的唯一方法(HDFS接收器寫入速度比Elasticsearch接收器快)是緩衝HDFS接收器寫入但Elasticsearch接收器尚未寫入的所有記錄。如果Elasticsearch接收器一直較慢,則在某個時間點將耗盡內存/磁盤空間。

Flink解決緩慢消費者問題的方法是反壓。

我看到兩種方法來解決這個問題:

  1. 增加ElasticsearchSink的並行性。這可能有用或不用,這取決於您的Elasticsearch設置的功能。
  2. 將兩個作業作爲獨立的管線運行。在這種情況下,您將不得不計算兩次所有結果。
+0

考慮到背壓使我趨向於同一個方向,謝謝澄清。 –