Úloha zápisu do Delta Lake selže s výjimkou java.lang.UnsupportedOperationException

Problém

Úlohy Delta Lake Write někdy selžou s následující výjimkou:

java.lang.UnsupportedOperationException: com.databricks.backend.daemon.data.client.DBFSV1.putIfAbsent(path: Path, content: InputStream).
DBFS v1 doesn't support transactional writes from multiple clusters. Please upgrade to DBFS v2.
Or you can disable multi-cluster writes by setting 'spark.databricks.delta.multiClusterWrites.enabled' to 'false'.
If this is disabled, writes to a single table must originate from a single cluster.

Příčina

Rozdílové zápisy do více clusterů jsou podporovány pouze pomocí DBFS v2. Clustery Azure Databricks ve výchozím nastavení používají DBFS v2. Všechny sparkSession objekty používají DBFS v2.

Pokud však aplikace používá FileSystem rozhraní API a volání FileSystem.close() , klient systému souborů se vrátí k výchozí hodnotě, která je v1. V tomto případě selže operace zápisu Delta Lake multi-cluster.

Následující trasování protokolu ukazuje, že objekt systému souborů poklesl zpět na výchozí verzi V1.

<date> <time> INFO DBFS: Initialized DBFS with DBFSV1 as the delegate.

Řešení

Neexistují dva způsoby, jak zabránit:

  1. Nikdy Nevolejte v FileSystem.close() kódu aplikace. Pokud je nutné volat close() rozhraní API, nejprve vytvořte instanci nového FileSystem objektu klienta s objektem konfigurace z aktuální relace Apache Spark místo prázdného objektu konfigurace:

    val fileSystem = FileSystem.get(new java.net.URI(path), sparkSession.sessionState.newHadoopConf())
    
  2. Další možností je, že tento ukázkový kód dosáhne stejného cíle:

    val fileSystem = FileSystem.get(new java.net.URI(path), sc.hadoopConfiguration())