問題
嚐試S3操作時,Apache Spark作業失敗。
堆棧跟蹤中出現錯誤信息“Caused by: java.net.SocketException: Connection reset”。
S3讀取操作的堆棧跟蹤示例:
導致:javax.net.ssl.SSLException:連接複位;請求ID: XXXXX,擴展請求ID: XXXXX,雲提供商:AWS,實例ID: i-XXXXXXXX at sun.security.ssl.Alert.createSSLException(Alert.java:127) at sun.security.ssl.TransportContext.fatal(TransportContext.java:324)…at sun.security.ssl.SSLSocketImpl$AppInputStream.read(SSLSocketImpl.java:833) at org.apache.http.impl.io.SessionInputBufferImpl.streamRead(SessionInputBufferImpl.java:137)…at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:135) at com.amazonaws.internal.SdkFilterInputStream.read(SdkFilterInputStream.java:90) at com.amazonaws.event.ProgressInputStream.read(ProgressInputStream.java:180) at com.amazonaws.internal.SdkFilterInputStream.read(SdkFilterInputStream.java:90)…導致:java.net.SocketException: Connection reset at java.net.SocketInputStream.read(SocketInputStream.java:210) at java.net.SocketInputStream.read(SocketInputStream.java:141) at sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:467) at sun.security.ssl.SSLSocketInputRecord.readFully(SSLSocketInputRecord.java:450) at sun.security.ssl.SSLSocketInputRecord.decodeInputRecord(SSLSocketInputRecord.java:243)
導致
舊版本的Hadoop S3連接器不會重試SocketTimeoutException或SSLException錯誤。這些異常分別在客戶端超時或服務器端超時時發生。
解決方案
此問題已在新版本的Hadoop S3連接器中得到解決。Databricks Runtime 7.3 LTS及以上版本使用新的連接器。
- 如果您使用Databricks Runtime 7.3 LTS或以上版本,請確保這些設置不存在於集群的Spark配置中:
spark.hadoop.fs.s3。impl com.databricks.s3a.S3AFileSystemspark.hadoop.fs.s3n.impl com.databricks.s3a.S3AFileSystem spark.hadoop.fs.s3a.impl com.databricks.s3a.S3AFileSystem
- 如果您使用的是Databricks Runtime 7.0 - 7.2,請升級到Databricks Runtime 7.3 LTS或以上版本。
- 如果您使用的是Databricks Runtime 6.4或以下版本,請聯係技術支持以獲得幫助。