Позвольте мне ответить на ваши вопросы один за другим.
Почему они не используют любой потоковый слой (как Кафка) в этом примере?
Я думаю, что у вас есть неправильное представление о потоковом в Флинка. Прежде всего, Flink - это механизм обработки потоков. В основном все, что Флинк обрабатывает, - это поток.
Вы знаете, что Flink может работать как в поточном, так и в пакетном режимах, но для партии Flink это только частный случай потока с конечной длиной, в то время как потоки обычно бесконечны. Итак, все это поток событий во Флинке. Поэтому вопрос заключается в том, откуда Флинк получает данные.
Flink может считывать данные из нескольких источников, а Kafka является одним из источников, которые могут использоваться во Flink. Взгляните на папку this и this в хранилище Flink. Они содержат инструменты различных источников в 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);
в то время как в действительности вы бы считывать данные события из внешней системы, как Кафка или Kinesis на примере намеренно упрощенным, чтобы показать суть библиотеки КЭП.
Когда & где требуется потоковая?
Если под «потоковым» вы имеете в виду не-партию, то можно с уверенностью сказать, что его следует использовать, когда постоянно поступают события и вам нужно близком к реальному времени, время обработки.
Если вы спрашиваете, когда вы должны использовать Kafka, вы можете использовать его для обработки потока событий, использовать его в качестве брокера сообщений, использовать его для агрегации журналов и так далее. Here - список вариантов использования, для которых вы можете использовать Apache Kafka.
Ссылаясь на пример Flink КЭП, я хочу знать, где & как потоковое слой (например, Кафка/Kinesis) вступит в игру?
Каковы будут преимущества/недостатки, если промежуточный поток, например Kafka/Kinesis)?
В реальном мире приложения вы будете использовать Кафка/источник данных Kinesis или другой источник данных, который считывает данные из внешней системы.
Kafka является альтернативой существующим брокерам сообщений, таким как RabbitMQ, и имеет отличные рабочие характеристики, но вы можете использовать другие источники данных в Flink или даже написать свои собственные.
Kafka представляет собой очередь сообщений, это может быть источник/приемник сообщений для потоковой технологии, такой как Flink, но Flink выполняет обработку потока. –
Я хочу знать, когда следует делать потоковое вещание? Когда потоковая передача действительно не требуется ??? – Akki