【发布时间】:2020-05-23 11:40:37
【问题描述】:
我正在研究将数据从 Kafka 传输到 S3 Sink 的 Flink 作业的性能。 我们正在使用 BucketingSink 来编写 parquet 文件。分桶逻辑根据数据类型、租户(客户)、日期时间、提取 ID 等划分具有文件夹的消息。这导致每个文件存储在由 9-10 层组成的文件夹结构中(s3_bucket:/ 1/2/3/4/5/6/7/8/9/myFile...)
如果数据以租户类型的消息突发形式分布,我们会看到良好的写入性能,但当数据更多是在数千个租户、数十种数据类型和多个提取 ID 上的白噪声分布时,我们有一个令人难以置信的表演损失。 (大约 300 倍)
附加一个调试器,似乎问题与在 S3 上同时打开的处理程序的数量有关以写入数据。进一步来说:
研究用于写入 S3 的 hadoop 库,我发现了一些可能的改进设置:
<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 上使用 Hadoop 文件系统 (BucketingSink) 完成的,使用 hadoop fs 库 2.6.x 写入 S3(因为我们使用 Cloudera CDH 5.x 作为保存点),所以我们不能切换到 StreamingFileSink。
【问题讨论】:
标签: hadoop amazon-s3 apache-flink