多部分上傳失敗

學習如何解決多部分上傳失敗。

寫的亞當Pavlacka

去年發表在:2022年3月4日

問題

你觀察工作失敗,除了:

com.amazonaws。SdkClientException:無法完成多部分上傳。個人部分上傳失敗:無法執行HTTP請求:org.apache.http.conn超時等待連接池。ConnectionPoolTimeoutException:超時等待連接池……com.amazonaws.http.AmazonHttpClient RequestExecutor.executeOneRequest美元(AmazonHttpClient.java: 1190)

導致

這個錯誤起源於亞馬遜SDK多部分的內部實現上傳,所有的多部分上傳請求和提交期貨到線程池。

這裏沒有背壓控製。所有的作品都是並行提交。因此唯一限製實際並行執行的線程池的大小。在這種情況下,線程池是一種BlockingThreadPoolExecutorService一個類內部S3A隊列的請求,而不是排斥它們一旦池已經達到了它的最大線程能力。

這裏有兩個並行的限製:

  • S3A所使用的線程池的大小
  • 的大小HTTPClient連接池內AmazonS3Client

如果小於S3A線程池HTTPClient連接池,那麼我們可以想象一個情形線程成為饑餓時試圖從池中獲取連接。我們可以看到這個發生如果數以百計的最終運行命令。

解決方案

您可以調整S3A線程池的大小HTTPClient連接池。一個合理的方法是減少S3A線程池的大小是小於HTTPClient池的大小。然而,這並不是沒有風險:在hadoop - 13826據報道,上漿池太小會導致死鎖在多部分上傳。有一個相關的錯誤引用,一個在AWS Java SDK本身:問題/ 939。在這種情況下,我們不建議減少這池大小。相反,我們建議您增加HTTPClient池大小來匹配S3A池中線程的數量(目前為256)。的HTTPClient連接池最終配置fs.s3a.connection.maximum現在硬編碼到200。

為了解決這個問題,設置如下火花配置屬性。屬性將被應用到所有工作運行在集群:

spark.hadoop.fs.s3a.multipart。閾值2097152000 spark.hadoop.fs.s3a.multipart。104857600 spark.hadoop.fs.s3a.connection大小。最大500 spark.hadoop.fs.s3a.connection。超時600000


這篇文章有用嗎?