当我从 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"
如果此错误反复出现,则可能是您的网络配置有问题。
要解决此问题,请完成以下步骤:
- 验证 Flink 应用程序是否可以连接至互联网。
- 如果 Flink 应用程序在虚拟私有云(VPC)中的 AWS 资源上运行,请验证以下 VPC 功能是否已正确配置:
路由表
安全组
网络访问控制列表
- (可选)使用 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
更新 setQueueLimit 和 RecordTtl 参数以避免数据丢失也是一种最佳做法:
Internal Queue Size: FlinkKinesisProducer #setQueueLimit (queueLimit)
time-to-live on records: producerConfig.put("RecordTtl", "*****");
有关计算 setQueueLimit 值的更多信息,请参阅 Flink 网站上的 Monitoring back pressure。