問題
三角洲湖寫工作有時失敗有以下例外:
. lang。UnsupportedOperationException:方式com.databricks.backend.daemon.data.client.DBFSV1。putIfAbsent(路徑:路徑、內容:InputStream)。DBFS v1不支持事務從多個集群寫道。請升級到DBFS v2。或者你可以禁用多集群寫通過設置“spark.databricks.delta.multiClusterWrites.enabled”“假”。如果這是禁用的,寫一個表必須來自一個集群。
導致
三角洲湖多集群隻支持DBFS v2寫道。磚集群使用默認DBFS v2。所有sparkSession對象使用DBFS v2。
然而,如果應用程序使用文件係統API和調用FileSystem.close (),文件係統客戶端落回到默認值,這是v1。在這種情況下,三角洲湖多集群寫操作失敗。
下麵的日誌跟蹤顯示文件係統對象回落至默認v1版本。
<日期> <時間> INFO DBFS:初始化DBFS DBFSV1為委托。
解決方案
有兩種方法來防止這種情況:
- 從不叫FileSystem.close ()在應用程序代碼。如果有必要調用close ()API,那麼首先實例化一個新的文件係統客戶端對象與一個配置對象從當前Apache火花的會話,而不是一個空配置對象:
% = scala val文件係統文件係統。(新java.net.URI(路徑),sparkSession.sessionState.newHadoopConf ())
- 另外,這段代碼示例實現同樣的目標:
% = scala val文件係統文件係統。(新java.net.URI(路徑),sc.hadoopConfiguration ())