我正在尝试研究this Flink CEP示例。我确实看到,在这个例子中,他们创建了一个单独的应用程序(这是一种流应用程序),它正在生产和销售。消费数据&在数据上应用模式匹配。他们之间没有放置流媒体层(如Kafka)。到目前为止,单个应用程序足以满足此目的,这使得它非常优化。现在,我知道如果我使用Kafka,那么我将需要2个申请;一个用于将数据摄入Kafka主题&其他用于消费来自Kafka主题的数据。我几乎没有问题,我没有得到答案::
为什么他们没有使用任何流层(如Kafka) 例子??
当&需要流媒体的地方??
参考Flink CEP示例,我想知道哪里和哪个怎么样 流媒体层(如Kafka / Kinesis)将发挥作用??
如果像流媒体层那样有什么优点/缺点 Kafka / Kinesis)介于?
答案 0 :(得分:1)
让我逐一回答你的问题。
为什么他们在这个例子中没有使用任何流层(如Kafka)?
我认为你对Flink中的流媒体有误解。首先Flink是流处理引擎。基本上Flink正在处理的所有内容都是一个流。
许多人都知道Flink可以在流模式或批处理模式下工作,但对于Flink批处理只是具有有限长度的流的特殊情况,而流通常是无限的。所以一切都是Flink的一系列事件。所以问题是Flink从哪里获取数据。
Flink可以从多个来源读取数据,而Kafka是可以在Flink中使用的来源之一。查看Flink存储库中的this和this文件夹。它们包含Flink中不同来源的工具,包括Kafka,Kinesis,RabbitMQ等。从Flink的角度来看,无论数据来自外部系统,是从文件中读取还是正在生成,都无关紧要。
Flink用户可以实现他/她将由Flink运行时使用的数据源。为此,需要扩展RichSourceFunction
类并实现run
方法。例如,此数据源将从0开始生成无限数字流:
public class DummySource extends RichParallelSourceFunction<Integer> {
public void run(SourceContext<Integer> sourceContext) throws Exception {
// You can specify custom termination conditions
// the source should not be inifite
int i = 0;
while (true) {
// provide an event for Flink processing
sourceContext.collect(i);
i++;
}
}
}
由于使用什么数据源并不重要,本教程的作者决定简化示例并使用一个使用随机数生成器生成数据的简单数据源:
MonitoringEvent monitoringEvent;
int rackId = random.nextInt(shard) + offset;
if (random.nextDouble() >= temperatureRatio) {
double power = random.nextGaussian() * powerStd + powerMean;
monitoringEvent = new PowerEvent(rackId, power);
} else {
double temperature = random.nextGaussian() * temperatureStd + temperatureMean;
monitoringEvent = new TemperatureEvent(rackId, temperature);
}
sourceContext.collect(monitoringEvent);
虽然实际上你会从像Kafka或Kinesis这样的外部系统中读取事件数据,但这个例子是故意简化的,以显示CEP库的要点。
何时&amp;哪里需要流媒体?
如果通过“流式传输”表示非批处理,那么可以肯定地说,当事件不断被接收并且您需要接近实时的处理时间时应该使用它。
如果您询问何时应该使用Kafka,那么您可以使用它来处理事件流,将其用作消息代理,将其用于日志聚合等等。 Here是您可以使用Apache Kafka的用例列表。
参考Flink CEP示例,我想知道哪里和哪个;流层(如Kafka / Kinesis)将如何发挥作用?
如果像Kafka / Kinesis这样的流媒体层介于两者之间会有什么优势/劣势?
在实际应用程序中,您将使用Kafka / Kinesis数据源或从外部系统读取数据的其他数据源。
Kafka是RabbitMQ等现有消息代理的替代品,具有出色的性能特征,但您可以在Flink中使用其他数据源,甚至可以编写自己的数据源。