无法执行HTTP请求:超时等待Flink中来自池的连接

时间:2019-06-21 01:09:20

标签: amazon-s3 apache-flink flink-streaming

我正在使用应用程序,该应用程序将一些文件上传到s3存储桶,稍后,它从s3存储桶读取文件并将其推送到我的数据库

我正在使用 Flink 1.4.2 fs.s3a API 从s3存储桶读取和写入文件。

将文件上传到s3存储桶可以正常工作,没有任何问题,但是当我的应用程序从s3读取那些上传的文件的第二阶段开始时,我的应用程序将引发以下错误

Caused by: java.io.InterruptedIOException: Reopen at position 0 on s3a://myfilepath/a/b/d/4: org.apache.flink.fs.s3hadoop.shaded.com.amazonaws.SdkClientException: Unable to execute HTTP request: Timeout waiting for connection from pool
at org.apache.flink.fs.s3hadoop.shaded.org.apache.hadoop.fs.s3a.S3AUtils.translateException(S3AUtils.java:125)
at org.apache.flink.fs.s3hadoop.shaded.org.apache.hadoop.fs.s3a.S3AInputStream.reopen(S3AInputStream.java:155)
at org.apache.flink.fs.s3hadoop.shaded.org.apache.hadoop.fs.s3a.S3AInputStream.lazySeek(S3AInputStream.java:281)
at org.apache.flink.fs.s3hadoop.shaded.org.apache.hadoop.fs.s3a.S3AInputStream.read(S3AInputStream.java:364)
at java.io.DataInputStream.read(DataInputStream.java:149)
at org.apache.flink.fs.s3hadoop.shaded.org.apache.flink.runtime.fs.hdfs.HadoopDataInputStream.read(HadoopDataInputStream.java:94)
at org.apache.flink.api.common.io.DelimitedInputFormat.fillBuffer(DelimitedInputFormat.java:702)
at org.apache.flink.api.common.io.DelimitedInputFormat.open(DelimitedInputFormat.java:490)
at org.apache.flink.api.common.io.GenericCsvInputFormat.open(GenericCsvInputFormat.java:301)
at org.apache.flink.api.java.io.CsvInputFormat.open(CsvInputFormat.java:53)
at org.apache.flink.api.java.io.PojoCsvInputFormat.open(PojoCsvInputFormat.java:160)
at org.apache.flink.api.java.io.PojoCsvInputFormat.open(PojoCsvInputFormat.java:37)
at org.apache.flink.runtime.operators.DataSourceTask.invoke(DataSourceTask.java:145)
at org.apache.flink.runtime.taskmanager.Task.run(Task.java:718)
at java.lang.Thread.run(Thread.java:748)

我可以通过增加s3a API的最大连接数来控制此错误。

截至目前,我在s3存储桶中大约有 1000个文件,该文件由我的应用程序推送并拉入在s3存储桶中,我的最大连接数是3000 。我正在使用Flink的并行性从s3存储桶中上传/下载这些文件。我的任务管理器数为14 。 这是间歇性故障,在这种情况下,我也有成功的案例。

我的查询是

  1. 为什么我会间歇性失败?如果我设置的最大连接数很低,那么我的应用每次运行时都应该抛出此错误。
  2. 有什么方法可以计算出我的应用程序正常运行所需的最大最大连接数,而不会遇到连接池超时错误?还是这个错误与我不知道的其他事情有关?

谢谢 提前

1 个答案:

答案 0 :(得分:0)

一些评论,基于我通过Flink(批处理)工作流处理来自S3的许多文件的经验:

  1. 当您阅读文件时,Flink将基于文件数量和每个文件的大小来计算“拆分”。每个拆分都是分开读取的,因此理论上并发连接的最大数量不是基于文件数,而是文件和文件大小的组合。
  2. HTTP客户端使用的连接池会在一段时间后释放连接,因为能够重用现有连接是胜利(服务器/客户端握手不必发生)。这样就在池中有多少可用连接中引入了一定程度的随机性。
  3. 连接池的大小不会对内存造成太大影响,因此我通常将其设置得很高(例如,对于最近的工作流程为4096)。
  4. 使用AWS连接代码时,设置为fs.s3.maxConnections,与纯Hadoop配置不同。