2016-09-30 95 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

考虑到背压使我趋向于同一个方向,谢谢澄清。 –