Talend 6.0 (e comentários)

A nova versão 6.0 do Talend já está disponível há quase um mês e após ter realizado alguns testes, segue uma pequena lista das mudanças de maior destaque e algumas considerações:

  • Interface com o usuário redesenhada
  • Pesquisa de componentes baseada em descrição e não apenas no nome (ou seja, o usuário não precisa mais saber exatamente o nome do componente que procura, e sim sua característica)
  • Nova funcionalidade para monitoramento uso de memória e CPU dentro do Studio (auxilia a analisar a performance de execução)
  • Componentes para acesso e manipulação no Google Drive, dentre outros diversos componentes focados na nuvem
  • Suporte a Java 8 (Studio)
  • Suporte a driver ODBC removido. Agora a conexão com bases Access é realizada via JDBC. Conexões genéricas ou com SQL Server ainda podem ser realizadas, porém só funcionará com o Java 7

Ponto de Atenção

Devido ao bug TDI-33503 (https://jira.talendforge.org/browse/TDI-33503), não recomendo que seja feita migração em ambientes de produção sem que antes seja solicitado patch para este bug através do canal de suporte.

Conclusão

A nova versão trouxe diversas melhorias principalmente quanto à interface da ferramenta e diversidade de componentes. No que diz respeito à usabilidade, não dá pra deixar de mencionar que o que já era fantástico, ficou muito melhor. O desenvolvimento com o Talend vem se tornando cada vez mais ágil e o que ficou difícil foi para a concorrência em atingir tal estado da arte.

Todavia, assim como em toda nova versão, convém realizar extensivos testes em seu ambiente antes de implantar ou migrar para a mesma. A versão 5.6.1 continua sendo uma ótima opção, tendo em vista que a versão 6.0.1 está prevista para meados deste mês de Setembro.

Referências

Página de Download e Notas de Release
http://www.talend.com/download/talend-open-studio#t4

Notas de release e discussões no fórum oficial
https://www.talendforge.org/forum/viewtopic.php?id=44935

Anúncios

Definição de variáveis via globalMap

Nós já demonstramos como utilizar variáveis de contexto aqui, e como obter melhores resultados utilizando grupos de contexto e contextos de execução aqui. Hoje irei demonstrar o uso de variáveis globais.

Variáveis globais, no Talend, são variáveis armazenadas em um local denominado globalMap. Através do globalMap podemos definir variáveis de basicamente qualquer tipo e em qualquer momento durante a execução de um job. As variáveis globais são definidas seguindo o conceito key/value.

Mas por quê utilizar variáveis globais e não variáveis de contexto? Eis alguns motivos:

– Variáveis globais são dinâmicas, variáveis de contexto devem ser declaradas previamente.

Não é possível declarar variáveis de contexto programaticamente, em tempo de execução. Com as variáveis globais fica fácil definir variáveis em tempo de execução, dando maiores possibilidades ao desenvolvedor.

– Variáveis de contexto são acessíveis “fora” do job.

Quando você define uma variável de contexto, ela tem um comportamento de “parâmetro de execução”, ou seja, quem executa o job pode alterar o conteúdo das variáveis de contexto, podendo assim alterar o comportamento do job.

E quando não declarar/utilizar variáveis via globalMap?

– Quando você precisar de variáveis compartilhadas em todo o repositório.

– Quando o conteúdo pode ou deve ser parametrizado. Por exemplo, alterar o login de acesso a um database, especificar uma data seleção dos dados, etc.

Mão na Massa

Vamos criar um job simples que executa uma query para obter o MAX() de uma coluna e projeta o resultado. Vamos supor que você necessite do maior ID ou a data da última transação armazenada para então executar uma nova query selecionando os dados com o valor obtido anteriormente, por exemplo. Este é um cenário típico em processos de carga incremental.

etl_globalMap

1. No primeiro componente – nomeado “DW” – é executada uma query simples para obter o MAX() de uma coluna;

2. No tSegGlobalVar_1 armazenamos o valor obtido:

etl_globalMap_setGlobalVar

Simples assim, definimos uma variável denominada “MAX_ID” (Key) e atribuímos o valor retornado na query do passo anterior (Value). Observe que row1 é o nome da linha que traz o resultado da query anterior e que ID é o alias da coluna que definimos no schema do componente anterior.

3. No tJava_1 à frente imprimimos o conteúdo da nova variável criada, assim:

System.out.println( (Long) globalMap.get(“MAX_ID”) );

Destaquei em negrito o que realmente importa. Utilizamos o método get() do globalMap para retornar o conteúdo de qualquer variável, passando como argumento o nome da mesma, neste caso “MAX_ID”.

Aqui é importante um detalhe: Como você pode armazenar qualquer tipo de objeto no globalMap, o método get() não tem como “saber” o tipo do retorno da chave (Key) especificada e por isso ele retorna um Object, que é um tipo que “aceita qualquer coisa”. Você precisa especificar o que aquele método está retornando naquele momento e por isso acrescentamos um (Long) antes de mais nada, que é exatamente o mesmo tipo que definimos no schema do primeiro componente onde executamos o select.

4. Por fim selecionamos os dados na query executada no componente “ORACLE” aplicando o mesmo conceito, e então partimos para a carga dos dados. A query fica assim:

“SELECT
*
FROM TABELA_ORIGEM
WHERE ID > ” + (Long)globalMap.get(“MAX_ID”)

Apenas concatenamos a variável à query e voilà!

Um abraço!

Talend Contextualizado

Olá pessoal! Após o sucesso absoluto das Canecas Talend Brasil e depois de muito tempo sem tutoriais iremos falar sobre algo essencial dentro do Talend: variáveis de contexto e contextos de execução. Pegue sua caneca Talend Brasil, tome um café e se prepare – ou caso você ainda não tenha uma, não perca tempo e adquira já!

Variáveis de contexto são variáveis de acesso global dentro de um job, cujo conteúdo pode variar de acordo com o contexto de execução.

No Talend, os Contextos são organizados em três níveis, os quais iremos conferir hoje:

Variáveis de Contexto -> Grupos de Variáveis -> Contextos de Execução

– Variáveis de contexto representam o menor nível na definição de contextos. Podemos entendê-las como variáveis simples, mas que podem armazenar conteúdos diferentes de acordo com o Contexto de Execução.

– Grupos de Variáveis, como o próprio nome sugere, são grupos de variáveis criados para proporcionar maior organização ao projeto, agrupando variáveis correlacionadas (exemplo: variavéis que formam a conexão com um Mysql).

– Contextos de Execução são os contextos em si. Exemplos de contexto podem ser “Produção” e “Homologação“, ou “Servidor A” e “Servidor B“.

Contexto01
Além disso, você pode definir Grupos de Variáveis armazenados em repositório – desta forma você poderá reaproveitar o mesmo conjunto de variáveis em vários jobs.

Para começar, vamos criar um job e definir uma variável de contexto chamada “Servidor“, do tipo String – vá até a aba Contexts e clique no ícone com um “+”:

Contexto02
Agora iremos definir os contextos de execução do job.
Clique em Values as tree ou Values as table na aba Contexts.
Em seguida clique em Configure Contexts… (botão destacado na imagem abaixo):
Contexto03
E então iremos atribuir valores diferentes para cada contexto:
Contexto04
E como acessar as variáveis de contexto?

Simples! Todas as variáveis de contexto são acessadas da mesma forma:

context.NOME_DA_VARIÁVEL

Vamos dar um exemplo: Adicione um componente tJava ao job e acrescente o seguinte código ao mesmo:

System.out.println(context.Servidor);
Contexto05
Na sequência iremos executar o job. Na aba Run, experimente alterar os contextos a cada execução e observe o que acontece!
Contexto06

Agora você já sabe definir variáveis dentro de um job, mas e se você quiser reutilizá-las em outros jobs?

Vamos até a árvore do repositório e criaremos um Grupo de Variáveis, ou Context Group:

Contexto07
Em seguida vamos definir uma Variável de Contexto chamada arquivo:
Contexto08
E então iremos definir os Contextos:
Contexto09

Por fim, atribuímos os valores a cada contexto:

Contexto10

Dê um Finish e pronto.

Para importar o grupo de variáveis criado para dentro do job que estávamos trabalhando, vá até a aba Contexts e selecione o grupo de variáveis a importar, conforme nas imagens abaixo:

Contexto11

Contexto11

Contexto12

E como o Talend associa tudo isso?

Como você deve ter percebido, é possível criar variáveis sem grupos, grupos sem variáveis, contextos sem variáveis… Não há uma “amarração” muito forte entre os três. Essa é uma flexibilidade que pode ajudar mas também confundir.

É importante compreender como variáveis, grupos e contextos são interligados entre si e a resposta mais simples é: através dos contextos.

Você pode ter tantas variáveis e grupos de variáveis dentro de um job quanto forem necessários. Mas sejam eles importados do repositório ou locais, os nomes de seus contextos de execução deverão coincidir – só assim o Talend poderá compreender em qual contexto executar o job. Observe na imagem anterior: tanto a variável local “Servidor” quanto o grupo denominado “Contexto” possuem dois contextos de execução iguais: Default e Desenvolvimento.

Se você importar um grupo de variáveis cujos contextos de execução são “Servidor A” e “Servidor B” e outro grupo de variáveis cujos contextos de execução são “Desenvolvimento” e “Producao”, não haverá como o Talend compreender em qual contexto executar o job, pois ele terá 4 contextos de execução diferentes.

Dica de boas práticas: variáveis de contexto tem acesso global e funcionam como parâmetros dentro de um job. Seus valores podem ser alterados por quem irá executá-lo e por isso tenha cuidado. Quando for preciso declarar variáveis que influenciam no comportamento de um job e não for sua intenção expor isso, opte por utilizar o globalMap, pois variéveis declaradas lá não ficam expostas externamente à modificações. Como declarar variáveis via globalMap ficará para outro dia… 😉

Muitos usos podem ser feitos das variáveis de contexto, o limite é a criatividade e o motivador é a necessidade – como sempre. Você pode utilizá-las como variáveis de controle de fluxo – como elas tem acesso global dentro do job e seu valor pode ser alterado via parâmetro, você pode utilizá-las para modificar os passos de execução de um job.

Até a próxima!

Caneca Talend Brasil

Buscando facilitar suas integrações e garantir aquele cafezinho a cada F6, criamos a Caneca Talend Brasil!

Caneca_Talend_Brasil_Zazzle

 (clique na imagem para ir até a nossa loja)

A caneca Talend Brasil possui diversos formatos, tamanhos e cores disponíveis, que você escolhe durante a compra. Você pode comprar uma para o cafezinho e outra para tomar aquele chopp no happy hour… 🙂

A minha já está aqui:

Caneca_Talend_Brasil

Não perca tempo e peça já a sua na nossa loja da zazzle! (clique na imagem acima ou aqui)

Um abraço e boas integrações!

Retornando valores entre jobs

Neste pequeno tutorial vou demonstrar como retornar valores de jobs “filhos” utilizando o componente tRunJob sem “fluxo de dados”, ou seja, sem utilizar o schema deste componente.

A passagem de parâmetros entre jobs no Talend é feita através de variáveis de contexto. Geralmente os parâmetros do job pai são transferidos para o job filho e quando este precisa retornar algo, são dados cujos metadados são definidos no schema do componente tRunJob. Na forma como foi implementado, o Talend possibilita transferir parâmetros do job pai para o filho através de variáveis de contexto, mas não o contrário. Também não é possível transferir parâmetros entre jobs através do globalMap, pois cada job possui sua própria área de globalMap.

Porém, algumas vezes você pode desejar retornar valores de um job filho que não estão necessariamente em um fluxo de dados. Como fazer isso?

Vamos criar dois jobs de exemplo para demonstrar como retornar valores de subjobs:

Em ambos os jobs, defina uma variável de contexto com tipo Object, vamos chamá-la aqui de SUBJOB_CONTEXT.

pass_param_subjob (1)

Vamos começar pelo job filho. Adicione um componente tJava ao mesmo, e na guia Advanced adicione as seguintes linhas para importar as bibliotecas necessárias:

import java.util.Map;
import java.util.HashMap;

pass_param_subjob (2)

Ainda no componente tJava, na guia Basic, adicione as seguintes linhas:

//Imprime o parâmetro recebido do job pai
System.out.println("param=" + ((Map<String, String>)context.SUBJOB_CONTEXT).get("param"));

//Define uma nova variável, denominada "retVal" e atribui o valor "Ok" à mesma
((Map<String, String>)context.SUBJOB_CONTEXT).put("retVal", "Ok");

pass_param_subjob (3)

O job filho está concluído. Salve.

Agora no job pai, acrescente um componente tJava, importe as mesmas bibliotecas Map e HashMap, conforme no job filho e na guia Basic acrescente as seguintes linhas:

//Instancia um HashMap na variável de contexto definida
context.SUBJOB_CONTEXT = new HashMap<String, String>();

//E então atribui "valor" à uma chave denominada "param" (poderia ter qualquer nome, funciona exatamente como o globalMap)
((Map<String, String>)context.SUBJOB_CONTEXT).put("param", "valor");

pass_param_subjob (6)

Agora arraste o job filho do repositório para o job pai e no campo “Context Param” lembre-se de acrescentar à variável SUBJOB_CONTEXT e atribuir o valor context.SUBJOB_CONTEXT à mesma. Neste exemplo você pode optar também por marcar a opção “Transmit whole context”.

pass_param_subjob (8)

Agora acrescente outro tJava e na guia Basic cole a seguinte linha:

//Imprime o retorno do job filho
 System.out.println("retVal=" + ((Map<String, String>)context.SUBJOB_CONTEXT).get("retVal"));

pass_param_subjob (7)

Ligue os três componentes através da trigger OnSubJobOk.

pass_param_subjob (4)

Execute:

pass_param_subjob (5)

Agora você já viu como é possível retornar valores de jobs filhos utilizando poucas linhas de código. Embora esse seja um exemplo muito simples, é apenas uma porta para várias possibilidades.

Até a próxima!

Fonte: http://bekwam.blogspot.com.br/2011/05/passing-parameters-and-variables-to.html

Lançado o Talend Open Studio 5!

Foi lançada a mais nova versão estável da suite de ferramentas Talend. Dentre as novidades desta versão 5, estão a nova nomenclatura da suite de código aberto, facilitando a percepção do que é pertencente à comunidade de software livre e o que é pertencente à suite comercial.

– Talend Open Studio for Data Integration será agora o nome utilizado para a suite de ETL e integração de dados.
– Talend Open Studio for Data Quality será o nome do anteriormente chamado Open Profiler, a ferramenta de qualidade de dados da Talend.
– Talend Open Studio for MDM será o nome utilizado pelo anteriormente chamado MDM Community Edition, a ferramenta de Master Data Management da Talend.
– Talend Open Studio for ESB será o novo nome do Talend ESB Studio Standard Edition, a ferramenta de ESB baseada nos projetos de integração Apache Software Foundation.

Dentre as novas funcionalidades da versão 5, estão:

Data Integration

– Suporte a Big Data, ampliando o acesso a tecnologia Hadoop com novos componentes para HDFS, Hive e HBAs, para tirar proveito de tecnologias MapReduce sem a complexidade. Novos componentes HDFS de fluxo de dados de entrada e saida HDFS, Aproveitando o poder de processamento do cluster.

– Mapeamento e manuseio de conteúdo XML aprimorado, permitindo a criação de ‘data services’ complexos e transformaão de XML em estruturas relacionais.

Data Quality

– Adição de jobs de demonstração exemplificando soluções comuns para problemas envolvendo qualidade de dados através de profiling, análises, padronizações e correspondências.

– API Google de Geocodificação permitindo a validação de endereços. A API Google irá corrigir endereços e enriquecer os dados com informações de geocodificação, como latitude e longitude.

Master Data Management

– Designer de Fomulários Customizados permitindo aplicação de javascript ou CSS.

– Master Data Search, permitindo pesquisas por todo o hub MDM em menos de um segundo.

– Gerenciador de hierarquia aprimorado, permitindo gerenciamento recursivo e “arrastar e soltar” através dos nós. Através de um clique em um nó será possível visualizar uma visão composta em uma interface única.

– Importação e exportação de dados através da interface web, permitindo ao usuário importar ou exportar dados para o hub.

Enterprise Service Bus

– IDE Eclipse, agora para Web services, aplicações REST, ‘data services’ e ‘messaging routes’; Permitindo desenvolver, construir, testar e publicar web services java seguros, aplicações REST, ‘data services’ e rotas de mensagens através de um ambiente unificado e de fácil uso.

– Console de deploy, permitindo um rápido deploy de web services, data services, aplicações REST e rotas de mensagens – tudo através de um console centralizado pelo próprio navegador/browser.

Para obter o Talend em sua nova versão, vá até a página de download no site da Talend clicando aqui.

Arquivos mdb (MS Access) sem ODBC

Trabalhar com arquivos MDB do Microsoft Access no Windows pode ser um tanto fácil via ODBC, mas o mesmo não é verdade em outros sistemas operacionais. Garantir a portabilidade do projeto ao se trabalhar com esse tipo de tecnologia é um desafio que vamos explorar nesse artigo.

A maioria do conteúdo que se encontra pela web tenta trabalhar com arquivos .mdb criando uma ponte JDBC-ODBC e embora você possa encontrar bons drivers ODBC, o único gratuito que encontrei para Linux foi o libmdbodbc (via repositório apt: apt-get install libmdbodbc mdbtools), porém o mesmo não suporta result set, impedindo o seu uso com o Talend/Java. Apesar disso, em conjunto com o pacote mdbtools essa é uma boa ferramenta para explorar arquivos mdb, permitindo executar queries, listar tabelas… tudo fora do Talend, claro.

Há também a possibilidade de obter drivers puramente JDBC, como o desenvolvido pela HXTT, porém esta não é uma solução gratuita. Você pode fazer o download de um trial por 30 dias, mas o result set das queries tem um limite de 1000 registros.

Assim sendo, utilizaremos um método não JDBC, tampouco ODBC, através da biblioteca Jackcess. Esta biblioteca contém uma série de funcionalidades que nos permite trabalhar com este tipo de tecnologia. Demonstrarei agora como utilizar algumas destas funcionalidades e ler o conteúdo de tabelas em arquivos access.

Primeiramente você deve ir até o site do projeto Jackcsess e realizar o download da biblioteca. Feito isso vamos carregar esta biblioteca em nosso job. Para isso utilizamos o componente tLibraryLoad, conforme na imagem abaixo:

Demonstração do componente tLibraryLoad

Observe que para carregar uma biblioteca que não está na listagem do componente, basca clicar no botão à direita da combo box e apontar para o arquivo com extensão .jar desejado. Além disso, observe também que temos três componentes tLibraryLoad neste job, isto se deve ao fato da biblioteca Jackcess possuir duas dependências: as bibliotecas commons-logging.jar e commons-lang-2.6.jar, ambas já existentes na listagem de bibliotecas do Talend.

Agora que já carregamos as bibliotecas necessárias, partiremos para a leitura dos dados do arquivo. Suponha que desejamos carregar estes dados em um Mysql. Utilizaremos então dois componentes: tJavaFlex e tMysqlOutput.

O componente tJavaFlex possui uma funcionalidade mesclada dos componentes tJava e tJavaRow. Através dele você pode trabalhar o código em três partes diferentes: Begin, Main e End. Mas antes que possamos compreender isto vamos definir o schema da tabela que pretendemos ler. Se você está em um ambiente Windows pode simplesmente abrir o Microsoft Access para obter os metadados da tabela, mas caso esteja em um ambiente Linux e tenha instalada a ferramenta mdbtools, pode executar o comando:

mdb-schema arquivo.mdb

Este comando irá listar os metadados de todas as tabelas existentes neste arquivo, e então você poderá utilizar o resultado deste comando para definir o schema do componente tJavaFlex.

Feito isso, vamos ao código que irá ler uma das tabelas e mapear o conteúdo obtido com as colunas definidas em nosso schema. Primeiramente, vamos importar as classes utilizadas, nós já carregamos as bibliotecas com os componentes tLibraryLoad, mas temos que dizer ao Java quais classes especificamente pretendemos utilizar destas bibliotecas. Para isso vá até o componente tJavaFlex e na aba Advanced:

Classes a serem importadas

Tendo importado as classes acima, vá até a aba Basic do componente tJavaFlex:

Esta aba será dividida basicamente em três partes: Start code, Main code e End code. Todo o código escrito dentro de Start code é executado uma única vez em um fluxo de dados: no início. Já o código escrito em Main code será executado linha a linha, permitindo que realizemos transformações ou meramente propaguemos dados obtidos. E por fim o código escrito em End code será executado uma única vez ao finalizar o fluxo de dados.

Esta abordagem nos permite definir no Start code o cabeçalho de um loop enquanto no Main code teremos basicamente o “corpo” do loop, onde estamos propagando o conteúdo das colunas obtidas para o fluxo “row3” que é aquele “levando” dados para o componente tMysqlOutput. Observe como no campo End code meramente fechamos o corpo do loop for com uma chave.

Além disso, no campo Start code criamos um objeto do tipo Table que recebe o resultado do método getTable, que por sua vez foi executado em um objeto do tipo Database obtido através do método Database.open(). Este objeto do tipo Table é o que nos permite executar um loop e obter os campos desejados de cada registro da tabela especificada, conforme você pode notar na declaração do loop for e no campo Main code.

Esta foi uma breve solução, você pode obter muito mais com a biblioteca Jackcess, existe uma boa documentação da API aqui.

Até a próxima.