Use o site JAR em LakeFlow Jobs
O formato de arquivo Java ou JAR é baseado no popular formato de arquivo ZIP e é usado para agregar muitos arquivos Java ou Scala em um só. Usando a tarefa JAR, o senhor pode garantir a instalação rápida e confiável do código Java ou Scala em seus trabalhos LakeFlow. Este artigo fornece um exemplo de criação de um JAR e de um Job que executa o pacote de aplicativos no JAR. Neste exemplo, você vai:
- Crie o projeto JAR que define um aplicativo de exemplo.
- Agrupe os arquivos de exemplo em um JAR.
- Criar um Job para executar o JAR.
- Execute o job e veja os resultados.
Antes de começar
Você precisa do seguinte para concluir este exemplo:
- Para JARs Java, o Java Development Kit (JDK).
- Para JARs do Scala, o JDK e o sbt.
Etapa 1: criar um diretório local para o exemplo
Crie um diretório local para armazenar o código de exemplo e os artefatos gerados, por exemplo, databricks_jar_test.
Etapa 2: Criar o JAR
Siga as instruções a seguir para usar Java ou Scala para criar o JAR.
Criar um Java JAR
- 
Na pasta databricks_jar_test, crie um arquivo chamadoPrintArgs.javacom o seguinte conteúdo:Javaimport java.util.Arrays;
 public class PrintArgs {
 public static void main(String[] args) {
 System.out.println(Arrays.toString(args));
 }
 }
- 
Compile o arquivo PrintArgs.java, que cria o arquivoPrintArgs.class:Bashjavac PrintArgs.java
- 
(Opcional) executar o programa compilado: Bashjava PrintArgs Hello World!
 # [Hello, World!]
- 
Na mesma pasta dos arquivos PrintArgs.javaePrintArgs.class, crie uma pasta chamadaMETA-INF.
- 
Na pasta META-INF, crie um arquivo chamadoMANIFEST.MFcom o seguinte conteúdo. Certifique-se de adicionar uma nova linha no final deste arquivo:Main-Class: PrintArgs
- 
Na raiz da pasta databricks_jar_test, crie um JAR chamadoPrintArgs.jar:Bashjar cvfm PrintArgs.jar META-INF/MANIFEST.MF *.class
- 
(Opcional) Para testá-lo, na raiz da pasta databricks_jar_test, execute o endereço JAR:Bashjava -jar PrintArgs.jar Hello World!
 # [Hello, World!]
Se o senhor receber o erro no main manifest attribute, in PrintArgs.jar, certifique-se de adicionar uma nova linha ao final do arquivo MANIFEST.MF e, em seguida, tente criar e executar o JAR novamente.
- Faça o upload de PrintArgs.jarpara um volume. Consulte Fazer upload de arquivos para um volume do Unity Catalog.
Criar um JAR do Scala
- 
Na pasta databricks_jar_test, crie um arquivo vazio chamadobuild.sbtcom o seguinte conteúdo:ThisBuild / scalaVersion := "2.12.14"
 ThisBuild / organization := "com.example"
 lazy val PrintArgs = (project in file("."))
 .settings(
 name := "PrintArgs"
 )
- 
Na pasta databricks_jar_test, crie a estrutura de pastassrc/main/scala/example.
- 
Na pasta example, crie um arquivo chamadoPrintArgs.scalacom o seguinte conteúdo:Scalapackage example
 object PrintArgs {
 def main(args: Array[String]): Unit = {
 println(args.mkString(", "))
 }
 }
- 
Compile o programa: Bashsbt compile
- 
(Opcional) executar o programa compilado: Bashsbt "run Hello World\!"
 # Hello, World!
- 
Na pasta databricks_jar_test/project, crie um arquivo chamadoassembly.sbtcom o seguinte conteúdo:addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.0.0")
- 
Na raiz da pasta databricks_jar_test, execute o comandoassembly, que gera um JAR na pastatarget:Bashsbt assembly
- 
(Opcional) Para testá-lo, na raiz da pasta databricks_jar_test, execute o endereço JAR:Bashjava -jar target/scala-2.12/PrintArgs-assembly-0.1.0-SNAPSHOT.jar Hello World!
 # Hello, World!
- 
Faça o upload de PrintArgs-assembly-0.1.0-SNAPSHOT.jarpara um volume. Consulte Fazer upload de arquivos para um volume do Unity Catalog.
Etapa 3. Crie um trabalho para executar o JAR
- 
Em seu site workspace, clique em Jobs & pipeline na barra lateral. 
- 
Clique em Create e depois em Job . A tarefa tab é exibida com o painel de tarefa vazio. 
Se a interface de usuárioLakeFlow Jobs estiver ativada , clique no JAR para configurar a primeira tarefa. Se o bloco JAR não estiver disponível, clique em Add another task type (Adicionar outro tipo de tarefa ) e procure por JAR .
- 
Opcionalmente, substitua o nome do trabalho, cujo padrão é New Job <date-time>pelo seu nome de trabalho.
- 
Em nome da tarefa , digite um nome para a tarefa, por exemplo, JAR_example.
- 
Se necessário, selecione JAR no menu suspenso Type (Tipo ). 
- 
Para a classe Main , neste exemplo, digite PrintArgspara Java ouexample.PrintArgspara Scala.
- 
Para computar , selecione um site compatível cluster. Consulte Java e Scala para obter suporte à biblioteca. 
- 
Para Biblioteca dependente , clique em + Adicionar . 
- 
Na caixa de diálogo Add dependent library (Adicionar biblioteca dependente ), com Volumes (Volumes ) selecionado, insira o local onde o senhor carregou o JAR ( PrintArgs.jarouPrintArgs-assembly-0.1.0-SNAPSHOT.jar) na etapa anterior em Volumes File Path (Caminho do arquivo de volumes ), ou filtre ou navegue para localizar o JAR. Selecione-o.
- 
Clique em Adicionar . 
- 
Em Parâmetros , neste exemplo, digite ["Hello", "World!"].
- 
Clique em Criar tarefa . 
Etapa 4: executar o trabalho e view os detalhes da execução do trabalho
Clique em  para executar o fluxo de trabalho. Para acessar view detalhes da execução, clique em view execution (visualizar execução ) na janela pop-up Triggered execution (execução acionada ) ou clique no link na coluna começar time (tempo ) para a execução no Job execution (execução de trabalho) view.
Quando a execução for concluída, a saída será exibida no painel Output (Saída ), incluindo os argumentos passados para a tarefa.
Limites de tamanho de saída para JAR Job
Job A saída, como a saída log emitida para stdout, está sujeita a um limite de tamanho de 20 MB. Se a saída total tiver um tamanho maior, a execução será cancelada e marcada como falha.
Para evitar esse limite, o senhor pode impedir que o stdout seja retornado do driver para a Databricks definindo a configuração spark.databricks.driver.disableScalaOutput Spark como true. Em default, o valor do sinalizador é false. O sinalizador controla a saída de células para Scala JAR Job e Scala Notebook. Se o sinalizador estiver ativado, o site Spark não retornará os resultados da execução do trabalho para o cliente. O sinalizador não afeta os dados que são gravados nos arquivos log do clustering. Databricks recomenda definir esse sinalizador somente para o agrupamento de trabalhos para o JAR Job porque ele desativa os resultados do Notebook.
Recomendação: use o compartilhado SparkContext
Como o Databricks é um serviço gerenciado, talvez sejam necessárias algumas alterações no código para garantir que o Apache Spark Job seja executado corretamente. JAR Os programas de trabalho devem usar o SparkContext compartilhado API para obter o SparkContext. Como o Databricks inicializa o SparkContext, os programas que invocam o new SparkContext() falharão. Para obter o SparkContext, use apenas o SparkContext compartilhado criado pela Databricks:
val goodSparkContext = SparkContext.getOrCreate()
val goodSparkSession = SparkSession.builder().getOrCreate()
Há também vários métodos que você deve evitar ao usar o SparkContext compartilhado.
- Não ligue para SparkContext.stop().
- Não ligue para System.exit(0)ousc.stop()no final do seu programaMain. Isso pode causar um comportamento indefinido.
Recomendação: Use o site try-finally blocks para a limpeza do trabalho
Considere um JAR que consiste em duas partes:
- jobBody()que contém a parte principal do trabalho.
- jobCleanup()que deve ser executado após- jobBody(), independentemente de a função ter sido bem-sucedida ou ter retornado 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()
}
Você não deve tentar limpar usando sys.addShutdownHook(jobCleanup) ou o seguinte código:
val cleanupThread = new Thread { override def run = jobCleanup() }
Runtime.getRuntime.addShutdownHook(cleanupThread)
Devido à forma como o tempo de vida dos contêineres Spark é gerenciado em Databricks, os ganchos de desligamento não são executados de forma confiável.
Configuração dos parâmetros do trabalho JAR
O senhor passa parâmetros para JAR Job com uma matriz de strings JSON. Veja o objeto spark_jar_task no corpo da solicitação passado para as operações Create a new Job (POST /jobs/create) em Jobs API. Para acessar esses parâmetros, inspecione a matriz String passada para sua função main.
gerenciar dependências da biblioteca
O driver do Spark tem certas dependências de biblioteca que não podem ser substituídas. Se o seu trabalho adicionar uma biblioteca conflitante, as dependências da biblioteca do driver Spark terão precedência.
Para obter a lista completa das dependências do driver da biblioteca, execute o seguinte comando em um Notebook anexado a um cluster configurado com a mesma versão do Spark (ou o cluster com o driver que o senhor deseja examinar):
%sh
ls /databricks/jars
Quando o senhor define dependências de biblioteca para JARs, a Databricks recomenda listar o Spark e o Hadoop como provided dependências. No Maven, adicione o Spark e o Hadoop como dependências fornecidas:
<dependency>
  <groupId>org.apache.spark</groupId>
  <artifactId>spark-core_2.11</artifactId>
  <version>2.3.0</version>
  <scope>provided</scope>
</dependency>
<dependency>
  <groupId>org.apache.hadoop</groupId>
  <artifactId>hadoop-core</artifactId>
  <version>1.2.1</version>
  <scope>provided</scope>
</dependency>
Em sbt, adicione o Spark e o Hadoop como dependências fornecidas:
libraryDependencies += "org.apache.spark" %% "spark-core" % "2.3.0" % "provided"
libraryDependencies += "org.apache.hadoop" %% "hadoop-core" % "1.2.1" % "provided"
Especifique a versão correta do Scala para suas dependências com base na versão que está sendo executada.
Próximas etapas
Para saber mais sobre como criar e executar o Job, consulte LakeFlow Jobs.