Crie um JAR compatível com Databricks
Um arquivo Java archive (JAR) empacota código Java ou Scala para implantação em LakeFlow Jobs. Atenda aos requisitos de compatibilidade JAR e configure seu projeto para o tipo de compute de destino.
Para implantação automatizada e fluxos de trabalho de integração contínua, utilize Pacotes de Automação Declarativa para criar um projeto a partir de um padrão com configurações de compilação e implantação pré-configuradas. Consulte Crie um JAR Scala usando Pacotes de Automação Declarativa e Pacote que faz upload de um arquivo JAR para o Unity Catalog. Esta página descreve a abordagem manual para compreender os requisitos de JAR e as configurações personalizadas.
Em um nível alto, seu JAR deve atender aos seguintes requisitos de compatibilidade:
- **Versões correspondentes**: Use as mesmas versões de Java Development Kit (JDK), Scala e Spark que seu compute
- Forneça dependências : Inclua as bibliotecas necessárias em seu JAR ou instale-as em seu compute
- Use a sessão Databricks Spark : Chame
SparkSession.builder().getOrCreate()para acessar a sessão - Adicione seu JAR à lista de permissões (somente para compute padrão): Adicione seu JAR à lista de permissões
Visualização
Jobs serverless de Scala e Java estão em pré-visualização pública. Você pode usar tarefas JAR para implantar seu JAR. Consulte Gerenciar pré-visualizações do Databricks se ainda não estiver habilitado.
Arquitetura de compute
Serverless e compute padrão usam a arquitetura Spark Connect para isolar o código do usuário e aplicar a governança do Unity Catalog. O Databricks Connect inclui as APIs Spark Connect. Serverless e compute padrão não suportam Spark Context ou APIs RDD do Spark diretamente. Veja limitações do serverless e limitações do modo de acesso padrão.
O compute dedicado usa a arquitetura Spark clássica e inclui todas as APIs do Spark.
Encontre suas versões do JDK, Scala e Spark
Faça a correspondência entre as versões do JDK, Scala e Spark em execução em seu compute.
Ao construir um JAR, suas versões de JDK, Scala e Spark devem corresponder às versões executadas em seu compute. Estas três versões estão interconectadas — a versão do Spark determina a versão compatível do Scala, e ambas dependem de uma versão específica do JDK.
Siga estes passos para encontrar as versões corretas para o seu tipo de compute:
- Serverless
- Standard
- Dedicated
-
Use a versão do ambiente serverless 4 ou superior
-
Encontre as versões do Databricks Connect, JDK e Scala para seu ambiente na tabela de versões do ambiente serverless.
- Clique
em Compute na barra lateral e selecione seu compute para view a versão do Databricks Runtime.
- Use uma versão do Databricks Connect que corresponda à versão principal e secundária do Databricks Runtime (por exemplo, Databricks Runtime 17.3 → databricks-connect 17.x). Encontre as versões correspondentes do JDK e Scala na matriz de suporte de versão.
- Clique
em Compute na barra lateral e selecione seu compute para view a versão do Databricks Runtime.
- Encontre as versões do JDK, Scala e Spark na seção Ambiente do sistema das notas sobre a versão da sua versão do Databricks Runtime (por exemplo, Databricks Runtime 17.3 LTS)
O uso de versões incompatíveis de JDK, Scala ou Spark pode causar um comportamento inesperado ou impedir que seu código seja executado.
Configuração do projeto
Depois de saber seus requisitos de versão, configure seus arquivos de compilação e empacote seu JAR.
Definir versões de JDK e Scala
Configure seu arquivo de compilação para usar as versões corretas do JDK e do Scala. Os exemplos a seguir mostram as versões do Databricks Runtime 17,3 LTS e da versão 4 do ambiente serverless.
- Sbt
- Maven
Em build.sbt:
scalaVersion := "2.13.16"
javacOptions ++= Seq("-source", "17", "-target", "17")
Em pom.xml:
<properties>
<scala.version>2.13.16</scala.version>
<scala.binary.version>2.13</scala.binary.version>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
Dependências do Spark
Adicione uma dependência do Spark para acessar as APIs do Spark sem empacotar o Spark em seu JAR.
- Serverless
- Standard access mode
- Dedicated access mode
Use o Databricks Connect
Adicione uma dependência no Databricks Connect (recomendado). A versão do Databricks Connect deve corresponder à versão do Databricks Connect no seu ambiente serverless. Marque-o como provided porque está incluído no runtime. Não inclua dependências do Apache Spark como spark-core ou outros artefatos org.apache.spark no seu arquivo de compilação. O Databricks Connect tem todas as APIs do Spark necessárias.
Maven pom.xml:
<dependency>
<groupId>com.databricks</groupId>
<artifactId>databricks-connect_2.13</artifactId>
<version>17.3.2</version>
<scope>provided</scope>
</dependency>
sbt build.sbt:
libraryDependencies += "com.databricks" %% "databricks-connect" % "17.3.+" % "provided"
Alternativa: spark-sql-api
Você pode compilar com spark-sql-api em vez de Databricks Connect, mas a Databricks recomenda usar o Databricks Connect porque as APIs do Spark executadas em compute serverless podem diferir ligeiramente do Spark de código aberto. Estas bibliotecas estão incluídas no runtime, portanto, marque-as como provided.
Maven pom.xml:
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
sbt build.sbt:
libraryDependencies += "org.apache.spark" %% "spark-sql-api" % "4.0.1" % "provided"
Use o Databricks Connect
Adicionar uma dependência no Databricks Connect (recomendado). A versão do Databricks Connect deve corresponder à versão principal e secundária do Databricks Runtime do seu cluster (por exemplo, Databricks Runtime 17.3 → databricks-connect 17.x). Marque-o como provided porque está incluído no tempo de execução. Não inclua dependências do Apache Spark como spark-core ou outros artefatos org.apache.spark no seu arquivo de build. O Databricks Connect tem todas as APIs Spark necessárias.
Maven pom.xml:
<dependency>
<groupId>com.databricks</groupId>
<artifactId>databricks-connect_2.13</artifactId>
<version>17.3.2</version>
<scope>provided</scope>
</dependency>
sbt build.sbt:
libraryDependencies += "com.databricks" %% "databricks-connect" % "17.3.+" % "provided"
Alternativa: spark-sql-api
Você pode compilar em relação a spark-sql-api em vez de Databricks Connect, mas a Databricks recomenda usar o Databricks Connect porque as APIs do Spark em execução no compute serverless podem diferir ligeiramente do Spark de código aberto. Estas bibliotecas estão incluídas no runtime, portanto, marque-as como provided.
Maven pom.xml:
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
sbt build.sbt:
libraryDependencies += "org.apache.spark" %% "spark-sql-api" % "4.0.1" % "provided"
Use Databricks Connect ou APIs Spark
Adicione uma dependência no Databricks Connect (recomendado) ou compile com bibliotecas Spark com escopo provided.
Opção 1: databricks-connect (recomendado)
Marque-o como provided porque está incluído no tempo de execução.
Maven pom.xml:
<dependency>
<groupId>com.databricks</groupId>
<artifactId>databricks-connect_2.13</artifactId>
<version>17.3.2</version>
<scope>provided</scope>
</dependency>
sbt build.sbt:
libraryDependencies += "com.databricks" %% "databricks-connect" % "17.3.+" % "provided"
Opção 2: spark-sql-api
Você pode compilar com spark-sql-api, mas isso não é recomendado porque a versão no Databricks pode diferir ligeiramente. Essas bibliotecas estão incluídas no runtime, então marque-as como provided.
Maven pom.xml:
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
sbt build.sbt:
libraryDependencies += "org.apache.spark" %% "spark-sql-api" % "4.0.1" % "provided"
Opção 3: Outras bibliotecas Spark
Você pode usar qualquer biblioteca do Apache Spark (por exemplo, spark-core ou spark-sql) com o escopo provided, desde que a versão corresponda à versão do Spark em execução no seu cluster. Encontre a versão do Spark do seu cluster na seção Ambiente do sistema das notas sobre a versão do Databricks Runtime.
Dependências do aplicativo
Adicione as bibliotecas necessárias do seu aplicativo ao seu arquivo de compilação. A forma como você gerencia isso depende do seu tipo de compute:
- Serverless
- Standard access mode
- Dedicated access mode
O compute serverless fornece o Databricks Connect e um conjunto limitado de dependências (veja as notas sobre a versão). Empacote todas as outras bibliotecas em seu JAR usando sbt-assembly ou Maven Shade Plugin, ou adicione-as ao seu ambiente serverless.
Por exemplo, para empacotar uma biblioteca em seu JAR:
Maven pom.xml:
<dependency>
<groupId>io.circe</groupId>
<artifactId>circe-core_2.13</artifactId>
<version>0.14.10</version>
</dependency>
sbt build.sbt:
libraryDependencies += "io.circe" %% "circe-core" % "0.14.10"
O Databricks Runtime inclui muitas bibliotecas comuns além do Spark. Encontre a lista completa de bibliotecas e versões fornecidas na seção Ambiente do Sistema das notas de versão do Databricks Runtime para sua versão do Databricks Runtime (por exemplo, Databricks Runtime 17.3 LTS).
Para bibliotecas fornecidas pelo Databricks Runtime, é necessário adicioná-las como dependências com escopo provided. Por exemplo, no Databricks Runtime 17.3 LTS, protobuf-java é fornecido:
Maven pom.xml:
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.25.5</version>
<scope>provided</scope>
</dependency>
sbt build.sbt:
libraryDependencies += "com.google.protobuf" % "protobuf-java" % "3.25.5" % "provided"
Para bibliotecas não fornecidas pelo Databricks Runtime, empacote-as em seu JAR usando sbt-assembly ou Maven Shade Plugin, ou instale-as como bibliotecas com escopo de compute.
O Databricks Runtime inclui muitas bibliotecas comuns além do Spark. Encontre a lista completa de bibliotecas e versões fornecidas na seção Ambiente do Sistema das notas de versão do Databricks Runtime para sua versão do Databricks Runtime (por exemplo, Databricks Runtime 17.3 LTS).
Para bibliotecas fornecidas pelo Databricks Runtime, é necessário adicioná-las como dependências com escopo provided. Por exemplo, no Databricks Runtime 17.3 LTS, protobuf-java é fornecido:
Maven pom.xml:
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.25.5</version>
<scope>provided</scope>
</dependency>
sbt build.sbt:
libraryDependencies += "com.google.protobuf" % "protobuf-java" % "3.25.5" % "provided"
Para bibliotecas não fornecidas pelo Databricks Runtime, empacote-as em seu JAR usando sbt-assembly ou Maven Shade Plugin, ou instale-as como bibliotecas com escopo de compute.
Requisitos de código
Ao escrever seu código JAR, siga estes padrões para garantir a compatibilidade com Jobs do Databricks.
Use a sessão Spark do Databricks
Ao executar um JAR em um Job, você deve usar a sessão Spark fornecida pelo Databricks. O código a seguir mostra como acessar a sessão a partir do seu código:
- Java
- Scala
SparkSession spark = SparkSession.builder().getOrCreate();
val spark = SparkSession.builder().getOrCreate()
Use blocos try-finally para limpeza de jobs
Se desejar um código que seja executado de forma confiável no final do seu Job, por exemplo, para limpar arquivos temporários, utilize um bloco try-finally. Não utilize um gancho de desligamento, porque estes não são executados de forma confiável em Jobs.
Considere um JAR que consiste em duas partes:
jobBody()que contém a parte principal do job.jobCleanup()que deve executar apósjobBody(), seja essa função bem-sucedida ou retorne uma exceção.
Por exemplo, jobBody() cria tabelas e jobCleanup() descarta essas tabelas.
A maneira segura de garantir que o método de limpeza seja chamado é colocar um bloco try-finally no código:
try {
jobBody()
} finally {
jobCleanup()
}
Não tente limpar usando sys.addShutdownHook(jobCleanup) ou o seguinte código:
// Do NOT clean up with a shutdown hook like this. This will fail.
val cleanupThread = new Thread { override def run = jobCleanup() }
Runtime.getRuntime.addShutdownHook(cleanupThread)
O Databricks gerencia os tempos de vida dos contêineres Spark de uma forma que impede que os ganchos de desligamento sejam executados de forma confiável.
Ler parâmetros de Job
O Databricks passa parâmetros para seu Job JAR como uma matriz de strings do JSON. Para usar esses parâmetros, inspecione a matriz String passada para sua função main.
Para mais detalhes sobre os parâmetros, consulte Parametrizar jobs.
Configuração adicional
Dependendo do seu tipo de compute, você pode precisar de configuração adicional:
- Modo de acesso padrão : Por motivos de segurança, um administrador deve adicionar coordenadas Maven e caminhos para bibliotecas JAR a uma lista de permissões.
- Compute serverless : Se seu Job acessar recursos privados (bancos de dados, APIs, armazenamento), configure a rede com uma Configuração de Conectividade de Rede (NCC). Consulte segurança de rede serverless.
Configurar registro para compute serverless
No compute serverless, a API de log SLF4J usa um backend sem operações (NOP) por default. Isso significa que as mensagens de log de bibliotecas e do código do aplicativo que usam SLF4J são descartadas silenciosamente.
Para rotear a saída de log SLF4J para o backend do Log4j 2, você deve adicionar a ponte log4j-slf4j2-impl ao seu JAR fat ou como uma dependência JAR separada no seu job. O ambiente serverless inclui o backend Log4j 2 (log4j-api e log4j-core), mas a ponte que conecta SLF4J ao Log4j não está no classpath do usuário por default.
A versão da ponte deve corresponder à versão log4j-api fornecida no seu versão de ambiente serverless. Por exemplo, a versão 5 do ambiente usa log4j-api versão 2.20.0, portanto, é preciso adicionar log4j-slf4j2-impl versão 2.20.0.
Opção 1: Incluir a ponte em seu JAR monolítico
Adicionar log4j-slf4j2-impl como uma dependência de compilação para que seja empacotado no seu JAR completo:
- Sbt
- Maven
Em build.sbt:
libraryDependencies += "org.apache.logging.log4j" % "log4j-slf4j2-impl" % "2.20.0"
Em pom.xml:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j2-impl</artifactId>
<version>2.20.0</version>
</dependency>
Opção 2: adicionar a bridge como uma dependência JAR separada no job
Em vez de empacotar a ponte no seu JAR robusto, é possível adicioná-la como uma dependência de biblioteca separada ao configurar sua tarefa JAR. Na configuração da tarefa em **Ambiente e Bibliotecas**, adicione uma dependência JAR usando a coordenada Maven:
org.apache.logging.log4j:log4j-slf4j2-impl:2.20.0
Para obter detalhes sobre como adicionar dependências JAR a jobs serverless, consulte Configurar o ambiente serverless.
Evite incluir log4j-api ou log4j-core no JAR monolítico. Estas bibliotecas já são fornecidas pelo runtime serverless, e empacotá-las pode causar conflitos de versão.
Outros recursos
- Saiba como usar um JAR em um job.
- Saiba mais sobre o Databricks Connect.
- Saiba mais sobre Scala no Databricks.