如何在Apache Flink中并行写入接收器

时间:2016-09-30 12:51:28

标签: apache-flink flink-streaming

我有一个地图DataStream,其并行度为8.我向DataStream添加了两个接收器。一个是慢速(Elasticsearch),另一个是快速(HDFS)。但是,我的事件只有在刷新到ES之后才写入HDFS,因此ES需要的时间比使用ES时要长。

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

在我看来,两个接收器都使用相同的线程。有可能通过使用两个接收器的相同源,或者我是否必须添加另一个作业,一个用于earch接收器,并行写入输出?

我在日志中检查了Map(1/8)到Map(8/8)的部署和接收数据。

1 个答案:

答案 0 :(得分:3)

如果Elasticsearch接收器无法跟上其输入产生的速度,则会减慢其输入操作符的速度。这个概念被称为背压,这意味着缓慢的消费者阻止快速生产者处理。

使程序按预期运行的唯一方法(HDFS接收器写入速度比Elasticsearch接收器快)是缓冲HDFS接收器写入的所有记录,但Elasticsearch接收器尚未写入。如果Elasticsearch接收器始终较慢,则某些时间点将耗尽内存/磁盘空间。

Flink解决慢消费者问题的方法是背压。

我认为有两种方法可以解决这个问题:

  1. 增加ElasticsearchSink的并行性。这可能有用与否,具体取决于您的Elasticsearch设置的功能。
  2. 将两个作业作为独立管道运行。在这种情况下,您必须两次计算所有结果。