Flink записывает SingleOutputStreamOperator в два файла вместо одного

Я пытаюсь flink для проекта на работе. Я дошел до того, что обрабатываю поток, применяя окно подсчета и т. д. Однако я заметил странное поведение, которое не могу объяснить.

Создается впечатление, что поток обрабатывается двумя потоками, и вывод тоже делится на две части.

Сначала я заметил поведение при выводе потока на стандартную консоль с помощью stream.print().

Затем я распечатал файл, и он фактически печатается в двух файлах с именами 1 и 2 в выходной папке.

    SingleOutputStreamOperator<Tuple3<String, String,String>> c = stream_with_no_err.countWindow(4).apply(new CountPerWindowFunction());
    // c.print()   // this olso prints two streams in the standard console

    c.writeAsCsv("output");

Может кто-нибудь объяснить, почему такое поведение в flink? Как я могу настроить его? Почему необходимо разделить результирующий поток?

Я понимаю, что параллелизм полезен для скорости (несколько потоков), но зачем разделять результирующий поток?

Обычно я хотел бы получить результирующий поток (после обработки) в виде одного файла или потока tcp и т. д. Является ли нормальным рабочим процессом ручное объединение двух файлов и создание одного вывода?

Спасибо!


person cmcaba    schedule 24.02.2017    source источник


Ответы (1)


Flink — это распределенный и параллельный потоковый процессор. Как вы правильно сказали, распараллеливание необходимо для достижения высокой пропускной способности. Производительность приложения ограничена самым медленным оператором. Поэтому во многих случаях приемник также необходимо распараллелить.

Сказав это, очень просто уменьшить параллелизм вашего приемника до 1: c.writeAsCsv("output").setParallelism(1);

Теперь приемник будет работать как один поток и создавать только один файл.

person Fabian Hueske    schedule 24.02.2017