问题
观察作业失效异常
m.amazonaws.SdkClientExceptive:无法完成多段上传单片上传失败 : 无法执行 HTTP请求 : 超时等待池或g.ache.http.conn.Conn.ConnctionPool超时例外 :超时等待池连接com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1190)
因果
错误发源于亚马逊SDK多段上传内部实现中取多段上传请求并提交成线程池
这里没有回压控制所有片段并行提交唯一对实际并行执行的限制是线程池本身的大小在这种情况下线程池BlockingThreadPoolExecutorService类内部S3A请求,而不是在水池最大线程容量后拒绝
并存性有两个限制
- S3A使用线程池大小
- 大小为HTTPClient内部连接池亚马逊S3Client
如果S3A线程池小于HTTPClient连接池,然后我们可以想象 线条在试图从池获取连接时饿死数以百计运行命令最终破解时,我们可以看到这种情况发生
求解
S3A线程池大小调和HTTPClient连接池一种似然方法就是缩小S3A线程池小于S3AHTTPClient池大小然而,这并非没有风险:hadOOP-13826上传多段时小小小水池可引起僵局AWS JavaSDK自身上有相关错误指针问题939.基于此,我们不推荐 缩小池大小反之,我们建议你增加HTTPClient池大小匹配线程数S3A池上头HTTPClient连接池归根结底配置fs.s3a.connection.maximum现硬编码为200
解决问题设置如下spark配置属性.属性应用到集群内所有作业
spark.hadoop.fs.s3a.multipart.threshold 2097152000 spark.hadoop.fs.s3a.multipart.size 104857600 spark.hadoop.fs.s3a.connection.maximum 500 spark.hadoop.fs.s3a.connection.timeout 600000