我如何排查从 Flink 写入 Kinesis Data Streams 时发生的超时错误?

上次更新时间:2020 年 5 月 6 日

我在尝试将数据从 Flink 写入 Amazon Kinesis Data Streams 时收到超时或异常错误。为什么会发生这种情况?如何排查这些错误?

简短描述

使用 FlinkKinesisProducer 的 Flink 应用程序可能会生成以下错误消息:

Caused by: org.apache.flink.kinesis.shaded.org.apache.http.conn.ConnectTimeoutException: Connect to kinesis.us-east-1.amazonaws.com:443 [kinesis.us-east-1.amazonaws.com/xxx.xxx.xxxx.xxx] failed: connect timed out
[AWS Log: ERROR](CurlHttpClient)Curl returned error code 28

这两个超时错误由以下原因造成:网络问题和运行 Flink 应用程序的环境中缺乏系统资源。

解决方法

无法连接到 Kinesis Data Streams 服务终端节点

当 Flink 应用程序无法连接到 Data Streams 服务终端节点时,会发生以下错误:

Caused by: org.apache.flink.kinesis.shaded.org.apache.http.conn.ConnectTimeoutException: Connect to kinesis.us-east-1.amazonaws.com: 443 [ kinesis.us-east-1.amazonaws.com/xxx.xxxx.xxx] failed:connect timed out

如果此错误频繁发生,则可能是您的网络配置存在问题。

要解决此问题,请执行以下步骤:

1.    验证 Flink 应用程序是否可以连接到 Internet。

2.    如果您的 Flink 应用程序在 Virtual Private Cloud (VPC) 中的 AWS 资源上运行,请验证以下 VPC 功能是否配置正确:
       路由表
       安全组
       网络访问控制列表 (ACL)

3.    (可选)您还可以使用 Data Streams 的 VPC 终端节点在 VPC 内进行通信。

对已提交的请求的响应未在配置的超时期限内返回

以下 Curl 28 错误表示对已提交的请求的响应未在配置的超时期限内返回。因此,发生超时:

[AWS Log: ERROR](CurlHttpClient)Curl returned error code 28

因临时网络问题而发生超时。超时还可能是向因为 Data Streams 有太多待处理的请求,其中记录会发送到 Kinesis Producer Library (KPL) 守护程序。记录之所以会发送到 KPL,是因为 FlinkKinesisProducer 使用 KPL 将数据从 Flink 流发送到 Amazon Kinesis 流。

要解决此问题,请更改 FlinkKinesisProducer 的 对象的以下配置参数:

Request timeout period: producerConfig.put (“RequestTimeout”, “****”); I
  • 内部队列大小:FlinkKinesisProducer #setQueueLimit (queueLimit)

这也是更新以下参数以避免数据丢失的最佳实践:

Internal Queue Size: FlinkKinesisProducer #setQueueLimit (queueLimit)
time-to-live on records: producerConfig.put("RecordTtl", "*****");

有关计算 setQueueLimit 值的更多信息,请参阅 Apache 网站 上的反压机制。


这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?