Utilizar o Apache Oozie com o Apache Hadoop para definir e executar um fluxo de trabalho no Azure HDInsight baseado em Linux
Saiba como usar o Apache Oozie com o Apache Hadoop no Azure HDInsight. O Oozie é um sistema de fluxo de trabalho e coordenação que gerencia trabalhos do Hadoop. O Oozie é integrado à pilha Hadoop e suporta os seguintes trabalhos:
- Apache Hadoop MapReduce
- Apache Pig
- Apache Hive
- Apache Sqoop
Você também pode usar o Oozie para agendar trabalhos específicos de um sistema, como programas Java ou shell scripts.
Nota
Outra opção para definir fluxos de trabalho com o HDInsight é usar o Azure Data Factory. Para saber mais sobre o Data Factory, consulte Usar o Apache Pig e o Apache Hive com o Data Factory. Para usar o Oozie em clusters com o Enterprise Security Package, consulte Executar o Apache Oozie em clusters Hadoop do HDInsight com o Enterprise Security Package.
Pré-requisitos
Um cluster Hadoop no HDInsight. Consulte Introdução ao HDInsight no Linux.
Um cliente SSH. Consulte Conectar-se ao HDInsight (Apache Hadoop) usando SSH.
Um Banco de Dados SQL do Azure. Consulte Criar um banco de dados no Banco de Dados SQL do Azure no portal do Azure. Este artigo usa um banco de dados chamado oozietest.
O esquema de URI para o armazenamento primário de clusters.
wasb://
para o Armazenamento do Azure,abfs://
para o Azure Data Lake Storage Gen2 ouadl://
para o Azure Data Lake Storage Gen1. Se a transferência segura estiver habilitada para o Armazenamento do Azure, o URI seráwasbs://
. Consulte também, transferência segura.
Exemplo de fluxo de trabalho
O fluxo de trabalho usado neste documento contém duas ações. Ações são definições para tarefas, como executar Hive, Sqoop, MapReduce ou outros processos:
Uma ação do Hive executa um script HiveQL para extrair registros do
hivesampletable
que está incluído no HDInsight. Cada linha de dados descreve uma visita de um dispositivo móvel específico. O formato do registo é semelhante ao seguinte texto:8 18:54:20 en-US Android Samsung SCH-i500 California United States 13.9204007 0 0 23 19:19:44 en-US Android HTC Incredible Pennsylvania United States NULL 0 0 23 19:19:46 en-US Android HTC Incredible Pennsylvania United States 1.4757422 0 1
O script Hive usado neste documento conta o total de visitas para cada plataforma, como Android ou iPhone, e armazena as contagens em uma nova tabela Hive.
Para obter mais informações sobre o Hive, consulte [Usar o Apache Hive com HDInsight][hdinsight-use-hive].
Uma ação Sqoop exporta o conteúdo da nova tabela do Hive para uma tabela criada no Banco de Dados SQL do Azure. Para obter mais informações sobre o Sqoop, consulte Usar o Apache Sqoop com o HDInsight.
Nota
Para obter versões do Oozie suportadas em clusters HDInsight, consulte Novidades nas versões de cluster Hadoop fornecidas pelo HDInsight.
Criar o diretório de trabalho
O Oozie espera que você armazene todos os recursos necessários para um trabalho no mesmo diretório. Este exemplo utiliza wasbs:///tutorials/useoozie
. Para criar esse diretório, conclua as seguintes etapas:
Edite o código abaixo para substituir
sshuser
pelo nome de usuário SSH do cluster e substituaCLUSTERNAME
pelo nome do cluster. Em seguida, insira o código para se conectar ao cluster HDInsight usando SSH.ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.net
Para criar o diretório, use o seguinte comando:
hdfs dfs -mkdir -p /tutorials/useoozie/data
Nota
O
-p
parâmetro causa a criação de todos os diretórios no caminho. Odata
diretório é usado para armazenar os dados usados pelouseooziewf.hql
script.Edite o código abaixo para substituir
sshuser
pelo seu nome de usuário SSH. Para se certificar de que o Oozie pode representar sua conta de usuário, use o seguinte comando:sudo adduser sshuser users
Nota
Você pode ignorar erros que indicam que o usuário já é um membro do
users
grupo.
Adicionar um driver de banco de dados
Esse fluxo de trabalho usa o Sqoop para exportar dados para o banco de dados SQL. Portanto, você deve fornecer uma cópia do driver JDBC usado para interagir com o banco de dados SQL. Para copiar o driver JDBC para o diretório de trabalho, use o seguinte comando da sessão SSH:
hdfs dfs -put /usr/share/java/sqljdbc_7.0/enu/mssql-jdbc*.jar /tutorials/useoozie/
Importante
Verifique o driver JDBC real que existe em /usr/share/java/
.
Se seu fluxo de trabalho usou outros recursos, como um jar que contém um aplicativo MapReduce, você também precisará adicionar esses recursos.
Definir a consulta do Hive
Use as etapas a seguir para criar um script Hive query language (HiveQL) que define uma consulta. Você usará a consulta em um fluxo de trabalho do Oozie posteriormente neste documento.
A partir da conexão SSH, use o seguinte comando para criar um arquivo chamado
useooziewf.hql
:nano useooziewf.hql
Depois que o editor GNU nano abrir, use a seguinte consulta como o conteúdo do arquivo:
DROP TABLE ${hiveTableName}; CREATE EXTERNAL TABLE ${hiveTableName}(deviceplatform string, count string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE LOCATION '${hiveDataFolder}'; INSERT OVERWRITE TABLE ${hiveTableName} SELECT deviceplatform, COUNT(*) as count FROM hivesampletable GROUP BY deviceplatform;
Há duas variáveis usadas no script:
${hiveTableName}
: Contém o nome da tabela a ser criada.${hiveDataFolder}
: Contém o local para armazenar os arquivos de dados para a tabela.O arquivo de definição de fluxo de trabalho, workflow.xml neste artigo, passa esses valores para esse script HiveQL em tempo de execução.
Para guardar o ficheiro, selecione Ctrl+X, introduza Y e, em seguida, selecione Enter.
Use o seguinte comando para copiar
useooziewf.hql
parawasbs:///tutorials/useoozie/useooziewf.hql
:hdfs dfs -put useooziewf.hql /tutorials/useoozie/useooziewf.hql
Este comando armazena o
useooziewf.hql
arquivo no armazenamento compatível com HDFS para o cluster.
Definir o fluxo de trabalho
As definições de fluxo de trabalho do Oozie são escritas em Hadoop Process Definition Language (hPDL), que é uma linguagem de definição de processo XML. Use as seguintes etapas para definir o fluxo de trabalho:
Use a seguinte instrução para criar e editar um novo arquivo:
nano workflow.xml
Depois que o editor nano abrir, insira o seguinte XML como conteúdo do arquivo:
<workflow-app name="useooziewf" xmlns="uri:oozie:workflow:0.2"> <start to = "RunHiveScript"/> <action name="RunHiveScript"> <hive xmlns="uri:oozie:hive-action:0.2"> <job-tracker>${jobTracker}</job-tracker> <name-node>${nameNode}</name-node> <configuration> <property> <name>mapred.job.queue.name</name> <value>${queueName}</value> </property> </configuration> <script>${hiveScript}</script> <param>hiveTableName=${hiveTableName}</param> <param>hiveDataFolder=${hiveDataFolder}</param> </hive> <ok to="RunSqoopExport"/> <error to="fail"/> </action> <action name="RunSqoopExport"> <sqoop xmlns="uri:oozie:sqoop-action:0.2"> <job-tracker>${jobTracker}</job-tracker> <name-node>${nameNode}</name-node> <configuration> <property> <name>mapred.compress.map.output</name> <value>true</value> </property> </configuration> <arg>export</arg> <arg>--connect</arg> <arg>${sqlDatabaseConnectionString}</arg> <arg>--table</arg> <arg>${sqlDatabaseTableName}</arg> <arg>--export-dir</arg> <arg>${hiveDataFolder}</arg> <arg>-m</arg> <arg>1</arg> <arg>--input-fields-terminated-by</arg> <arg>"\t"</arg> <archive>mssql-jdbc-7.0.0.jre8.jar</archive> </sqoop> <ok to="end"/> <error to="fail"/> </action> <kill name="fail"> <message>Job failed, error message[${wf:errorMessage(wf:lastErrorNode())}] </message> </kill> <end name="end"/> </workflow-app>
Há duas ações definidas no fluxo de trabalho:
RunHiveScript
: Esta ação é a ação inicial e executa ouseooziewf.hql
script Hive.RunSqoopExport
: Esta ação exporta os dados criados a partir do script Hive para um banco de dados SQL usando o Sqoop. Esta ação só é executada se forRunHiveScript
bem-sucedida.O fluxo de trabalho tem várias entradas, como
${jobTracker}
. Você substituirá essas entradas pelos valores usados na definição de trabalho. Você criará a definição de trabalho posteriormente neste documento.Observe também a
<archive>mssql-jdbc-7.0.0.jre8.jar</archive>
entrada na seção Sqoop. Esta entrada instrui o Oozie a disponibilizar este arquivo para o Sqoop quando esta ação for executada.
Para guardar o ficheiro, selecione Ctrl+X, introduza Y e, em seguida, selecione Enter.
Use o seguinte comando para copiar o
workflow.xml
arquivo para/tutorials/useoozie/workflow.xml
:hdfs dfs -put workflow.xml /tutorials/useoozie/workflow.xml
Criar uma tabela
Nota
Há muitas maneiras de se conectar ao Banco de dados SQL para criar uma tabela. Os passos seguintes utilizam FreeTDS do cluster do HDInsight.
Use o seguinte comando para instalar o FreeTDS no cluster HDInsight:
sudo apt-get --assume-yes install freetds-dev freetds-bin
Edite o código abaixo para substituir
<serverName>
pelo nome lógico do servidor SQL e<sqlLogin>
pelo logon do servidor. Insira o comando para se conectar ao banco de dados SQL de pré-requisito. Digite a senha no prompt.TDSVER=8.0 tsql -H <serverName>.database.windows.net -U <sqlLogin> -p 1433 -D oozietest
Você recebe a saída como o seguinte texto:
locale is "en_US.UTF-8" locale charset is "UTF-8" using default charset "UTF-8" Default database being set to oozietest 1>
Na linha de comandos
1>
, introduza as seguintes linhas:CREATE TABLE [dbo].[mobiledata]( [deviceplatform] [nvarchar](50), [count] [bigint]) GO CREATE CLUSTERED INDEX mobiledata_clustered_index on mobiledata(deviceplatform) GO
Quando for introduza a declaração
GO
, as instruções anteriores são avaliadas. Essas instruções criam uma tabela, chamadamobiledata
, que é usada pelo fluxo de trabalho.Para verificar se a tabela foi criada, use os seguintes comandos:
SELECT * FROM information_schema.tables GO
Você vê a saída como o seguinte texto:
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE oozietest dbo mobiledata BASE TABLE
Saia do utilitário tsql entrando
exit
no1>
prompt.
Criar a definição de tarefa
A definição de trabalho descreve onde encontrar o workflow.xml. Ele também descreve onde encontrar outros arquivos usados pelo fluxo de trabalho, como useooziewf.hql
. Além disso, ele define os valores para as propriedades usadas no fluxo de trabalho e os arquivos associados.
Para obter o endereço completo do armazenamento padrão, use o seguinte comando. Esse endereço é usado no arquivo de configuração criado na próxima etapa.
sed -n '/<name>fs.default/,/<\/value>/p' /etc/hadoop/conf/core-site.xml
Este comando retorna informações como o seguinte XML:
<name>fs.defaultFS</name> <value>wasbs://mycontainer@mystorageaccount.blob.core.windows.net</value>
Nota
Se o cluster HDInsight usar o Armazenamento do Azure como o armazenamento padrão, o conteúdo do
<value>
elemento começará comwasbs://
. Se o Azure Data Lake Storage Gen1 for usado, ele começará comadl://
. Se o Azure Data Lake Storage Gen2 for usado, ele começará comabfs://
.Salve o
<value>
conteúdo do elemento, como ele é usado nas próximas etapas.Edite o xml abaixo da seguinte maneira:
Valor do espaço reservado Valor substituído wasbs://mycontainer@mystorageaccount.blob.core.windows.net Valor recebido da etapa 1. administração Seu nome de login para o cluster HDInsight, se não for admin. serverName Nome do servidor do Banco de Dados SQL do Azure. sqlLogin Logon do servidor do Banco de Dados SQL do Azure. sqlSenha Senha de logon do servidor do Banco de Dados SQL do Azure. <?xml version="1.0" encoding="UTF-8"?> <configuration> <property> <name>nameNode</name> <value>wasbs://mycontainer@mystorageaccount.blob.core.windows.net</value> </property> <property> <name>jobTracker</name> <value>headnodehost:8050</value> </property> <property> <name>queueName</name> <value>default</value> </property> <property> <name>oozie.use.system.libpath</name> <value>true</value> </property> <property> <name>hiveScript</name> <value>wasbs://mycontainer@mystorageaccount.blob.core.windows.net/tutorials/useoozie/useooziewf.hql</value> </property> <property> <name>hiveTableName</name> <value>mobilecount</value> </property> <property> <name>hiveDataFolder</name> <value>wasbs://mycontainer@mystorageaccount.blob.core.windows.net/tutorials/useoozie/data</value> </property> <property> <name>sqlDatabaseConnectionString</name> <value>"jdbc:sqlserver://serverName.database.windows.net;user=sqlLogin;password=sqlPassword;database=oozietest"</value> </property> <property> <name>sqlDatabaseTableName</name> <value>mobiledata</value> </property> <property> <name>user.name</name> <value>admin</value> </property> <property> <name>oozie.wf.application.path</name> <value>wasbs://mycontainer@mystorageaccount.blob.core.windows.net/tutorials/useoozie</value> </property> </configuration>
A maioria das informações neste arquivo é usada para preencher os valores usados nos arquivos workflow.xml ou ooziewf.hql, como
${nameNode}
. Se o caminho for umwasbs
caminho, você deve usar o caminho completo. Não o encurte para apenaswasbs:///
. Aoozie.wf.application.path
entrada define onde encontrar o arquivo workflow.xml. Este arquivo contém o fluxo de trabalho que foi executado por este trabalho.Para criar a configuração de definição de tarefa do Oozie, use o seguinte comando:
nano job.xml
Depois que o editor nano abrir, cole o XML editado como o conteúdo do arquivo.
Para guardar o ficheiro, selecione Ctrl+X, introduza Y e, em seguida, selecione Enter.
Enviar e gerenciar o trabalho
As etapas a seguir usam o comando Oozie para enviar e gerenciar fluxos de trabalho do Oozie no cluster. O comando Oozie é uma interface amigável sobre a API REST do Oozie.
Importante
Ao usar o comando Oozie, você deve usar o FQDN para o nó principal do HDInsight. Este FQDN só é acessível a partir do cluster ou, se o cluster estiver numa rede virtual do Azure, a partir de outras máquinas na mesma rede.
Para obter a URL para o serviço Oozie, use o seguinte comando:
sed -n '/<name>oozie.base.url/,/<\/value>/p' /etc/oozie/conf/oozie-site.xml
Isso retorna informações como o seguinte XML:
<name>oozie.base.url</name> <value>http://ACTIVE-HEADNODE-NAME.UNIQUEID.cx.internal.cloudapp.net:11000/oozie</value>
A
http://ACTIVE-HEADNODE-NAME.UNIQUEID.cx.internal.cloudapp.net:11000/oozie
parte é a URL a ser usada com o comando Oozie.Edite o código para substituir o URL pelo que você recebeu anteriormente. Para criar uma variável de ambiente para a URL, use o seguinte, para que você não precise inseri-la para todos os comandos:
export OOZIE_URL=http://HOSTNAMEt:11000/oozie
Para enviar o trabalho, use o seguinte código:
oozie job -config job.xml -submit
Este comando carrega as informações do trabalho e
job.xml
as envia para o Oozie, mas não as executa.Depois que o comando terminar, ele deve retornar a ID do trabalho, por exemplo,
0000005-150622124850154-oozie-oozi-W
. Esse ID é usado para gerenciar o trabalho.Edite o código abaixo para substituir
<JOBID>
pelo ID retornado na etapa anterior. Para exibir o status do trabalho, use o seguinte comando:oozie job -info <JOBID>
Isso retorna informações como o seguinte texto:
Job ID : 0000005-150622124850154-oozie-oozi-W ------------------------------------------------------------------------------------------------------------------------------------ Workflow Name : useooziewf App Path : wasb:///tutorials/useoozie Status : PREP Run : 0 User : USERNAME Group : - Created : 2015-06-22 15:06 GMT Started : - Last Modified : 2015-06-22 15:06 GMT Ended : - CoordAction ID: - ------------------------------------------------------------------------------------------------------------------------------------
Este trabalho tem um estatuto de
PREP
. Esse status indica que o trabalho foi criado, mas não iniciado.Edite o código abaixo para substituir
<JOBID>
pelo ID retornado anteriormente. Para iniciar o trabalho, use o seguinte comando:oozie job -start <JOBID>
Se você verificar o status após esse comando, ele estará em um estado de execução e as informações serão retornadas para as ações dentro do trabalho. O trabalho levará alguns minutos para ser concluído.
Edite o código abaixo para substituir
<serverName>
pelo nome do servidor e<sqlLogin>
pelo login do servidor. Depois que a tarefa for concluída com êxito, você poderá verificar se os dados foram gerados e exportados para a tabela do banco de dados SQL usando o comando a seguir. Digite a senha no prompt.TDSVER=8.0 tsql -H <serverName>.database.windows.net -U <sqlLogin> -p 1433 -D oozietest
1>
No prompt, digite a seguinte consulta:SELECT * FROM mobiledata GO
As informações retornadas são como o seguinte texto:
deviceplatform count Android 31591 iPhone OS 22731 proprietary development 3 RIM OS 3464 Unknown 213 Windows Phone 1791 (6 rows affected)
Para obter mais informações sobre o comando Oozie, consulte Ferramenta de linha de comando Apache Oozie.
Oozie REST API
Com a API REST do Oozie, você pode criar suas próprias ferramentas que funcionam com o Oozie. As seguintes informações específicas do HDInsight sobre o uso da API REST do Oozie:
URI: Você pode acessar a API REST de fora do cluster em
https://CLUSTERNAME.azurehdinsight.net/oozie
.Autenticação: Para autenticar, use a API, a conta HTTP do cluster (admin) e a senha. Por exemplo:
curl -u admin:PASSWORD https://CLUSTERNAME.azurehdinsight.net/oozie/versions
Para obter mais informações sobre como usar a API REST do Oozie, consulte Apache Oozie Web Services API.
Interface do usuário da web do Oozie
A interface do usuário da Web do Oozie fornece uma exibição baseada na Web sobre o status dos trabalhos do Oozie no cluster. Com a interface do usuário da Web, você pode exibir as seguintes informações:
- Estado da tarefa
- Definição da tarefa
- Configuração
- Um gráfico das ações no trabalho
- Logs para o trabalho
Você também pode visualizar os detalhes das ações dentro de um trabalho.
Para acessar a interface do usuário da Web do Oozie, conclua as seguintes etapas:
Crie um túnel SSH para o cluster HDInsight. Para obter mais informações, consulte Usar túnel SSH com o HDInsight.
Depois de criar um túnel, abra a interface do usuário da Web do Ambari no navegador da Web usando o URI
http://headnodehost:8080
.No lado esquerdo da página, selecione Oozie>Quick Links>Oozie Web UI.
O padrão da interface do usuário da Web do Oozie exibe como padrão os trabalhos de fluxo de trabalho em execução. Para ver todos os trabalhos de fluxo de trabalho, selecione Todos os trabalhos.
Para ver mais informações sobre um trabalho, selecione-o.
Na guia Informações do trabalho , você pode ver as informações básicas do trabalho e as ações individuais dentro do trabalho. Você pode usar as guias na parte superior para exibir a Definição de Trabalho, Configuração de Trabalho, acessar o Log de Trabalho ou exibir um gráfico acíclico direcionado (DAG) do trabalho em DAG de Trabalho.
Log de trabalho: selecione o botão Obter logs para obter todos os logs para o trabalho ou use o
Enter Search Filter
campo para filtrar os logs.DAG de trabalho: o DAG é uma visão geral gráfica dos caminhos de dados percorridos pelo fluxo de trabalho.
Se você selecionar uma das ações na guia Informações do trabalho, ela exibirá informações para a ação. Por exemplo, selecione a ação RunSqoopExport .
Você pode ver detalhes da ação, como um link para a URL do console. Use este link para exibir as informações do rastreador de tarefas para o trabalho.
Agendar tarefas
Você pode usar o coordenador para especificar um início, um fim e a frequência de ocorrência para trabalhos. Para definir um cronograma para o fluxo de trabalho, conclua as seguintes etapas:
Use o seguinte comando para criar um arquivo chamado coordinator.xml:
nano coordinator.xml
Use o seguinte XML como o conteúdo do arquivo:
<coordinator-app name="my_coord_app" frequency="${coordFrequency}" start="${coordStart}" end="${coordEnd}" timezone="${coordTimezone}" xmlns="uri:oozie:coordinator:0.4"> <action> <workflow> <app-path>${workflowPath}</app-path> </workflow> </action> </coordinator-app>
Nota
As
${...}
variáveis são substituídas por valores na definição de trabalho em tempo de execução. As variáveis são:${coordFrequency}
: O tempo entre a execução de instâncias do trabalho.${coordStart}
: A hora de início do trabalho.${coordEnd}
: A hora de término do trabalho.${coordTimezone}
: Os trabalhos de coordenador estão em um fuso horário fixo sem horário de verão, normalmente representado usando UTC. Este fuso horário é conhecido como fuso horário de processamento do Oozie.${wfPath}
: O caminho para a workflow.xml.
Para guardar o ficheiro, selecione Ctrl+X, introduza Y e, em seguida, selecione Enter.
Para copiar o arquivo para o diretório de trabalho para este trabalho, use o seguinte comando:
hadoop fs -put coordinator.xml /tutorials/useoozie/coordinator.xml
Para modificar o
job.xml
arquivo criado anteriormente, use o seguinte comando:nano job.xml
Efetue as seguintes alterações:
Para instruir o Oozie a executar o arquivo coordenador em vez do fluxo de trabalho, altere
<name>oozie.wf.application.path</name>
para<name>oozie.coord.application.path</name>
.Para definir a
workflowPath
variável usada pelo coordenador, adicione o seguinte XML:<property> <name>workflowPath</name> <value>wasbs://mycontainer@mystorageaccount.blob.core.windows.net/tutorials/useoozie</value> </property>
Substitua o
wasbs://mycontainer@mystorageaccount.blob.core.windows
texto pelo valor usado nas outras entradas no arquivo job.xml.Para definir o início, o fim e a frequência do coordenador, adicione o seguinte XML:
<property> <name>coordStart</name> <value>2018-05-10T12:00Z</value> </property> <property> <name>coordEnd</name> <value>2018-05-12T12:00Z</value> </property> <property> <name>coordFrequency</name> <value>1440</value> </property> <property> <name>coordTimezone</name> <value>UTC</value> </property>
Esses valores definem a hora de início para 12h00 de 10 de maio de 2018 e a hora de término para 12 de maio de 2018. O intervalo para executar este trabalho é definido como diário. A frequência é em minutos, portanto 24 horas x 60 minutos = 1440 minutos. Finalmente, o fuso horário é definido como UTC.
Para guardar o ficheiro, selecione Ctrl+X, introduza Y e, em seguida, selecione Enter.
Para enviar e iniciar o trabalho, use o seguinte comando:
oozie job -config job.xml -run
Se você acessar a interface do usuário da Web do Oozie e selecionar a guia Trabalhos de coordenador , verá informações como na imagem a seguir:
A entrada Próxima Materialização contém a próxima vez que o trabalho for executado.
Como o trabalho de fluxo de trabalho anterior, se você selecionar a entrada de trabalho na interface do usuário da Web, ela exibirá informações sobre o trabalho:
Nota
Esta imagem mostra apenas as execuções bem-sucedidas do trabalho, não as ações individuais dentro do fluxo de trabalho agendado. Para ver as ações individuais, selecione uma das entradas Ação .
Próximos passos
Neste artigo, você aprendeu como definir um fluxo de trabalho do Oozie e como executar um trabalho do Oozie. Para saber mais sobre como trabalhar com o HDInsight, consulte os seguintes artigos: