Я изучаю характеристики работы Flink, которая переносит данные из Kafka в S3 Sink. Мы используем BucketingSink для записи файлов паркета. Логика сегментирования c делит сообщения, имеющие папку, по типу данных, арендатору (клиенту), дате и времени, идентификатору извлечения и т. Д. c и т. c. В результате каждый файл сохраняется в структуре папок, состоящей из 9-10 слоев (s3_bucket: / 1/2/3/4/5/6/7/8/9 / myFile ...)
Если данные распределяются в виде пакетов сообщений для типа арендатора, мы видим хорошую производительность при записи, но когда данные в большей степени распространяются в виде белого шума по тысячам арендаторов, десяткам типов данных и множественным идентификаторам извлечения, мы получаем невероятную потерю выступления. (порядка 300 раз)
При подключении отладчика кажется, что проблема связана с количеством одновременно открытых на S3 обработчиков для записи данных. Более конкретно:
Исследование библиотек oop, используемых для записи в S3, обнаружило несколько возможных улучшений:
<name>fs.s3a.connection.maximum</name>
<name>fs.s3a.threads.max</name>
<name>fs.s3a.threads.core</name>
<name>fs.s3a.max.total.tasks</name>
Но ничего из них большая разница в пропускной способности. Я также попытался сгладить структуру папок для записи в один ключ, например (1_2_3 _...), но также это не принесло никаких улучшений.
Примечание: тесты были выполнены на Flink 1.8 с Had oop FileSystem (BucketingSink), запись в S3 с использованием библиотек oop fs 2.6.x (поскольку мы используем Cloudera CDH 5.x для точек сохранения), поэтому мы не можем переключиться на StreamingFileSink.