Conteúdos

Contornando limitações do batch mode do KNIME

Conheça minha abordagem para automatizar a execução de um fluxo de trabalho


Contextualização

Recentemente, precisei desenvolver um fluxo de trabalho no KNIME Analytics Plataform para coletar as taxas de câmbio referenciais da B3.

O fluxo acessa um quadro aninhado, contido num endereço da B3 e, por meio da biblioteca Selenium do Python, extrai dados especificados por meio da linguagem de consulta XML Path Language (XPath), adiciona uma linha para o histórico (um banco de dados SQLite autocontido) e exporta tudo no formato OpenXML do Microsoft Excel diretamente para uma pasta num Google Drive.

/images/posts/knime_fluxo_b3_dolar_spot.png
O fluxo de trabalho depois de montado e organizado em múltiplos componentes

Até então, trabalhando com planejamento urbano e regional, meus fluxos de trabalho no KNIME tinham uma execução esporádica, porém, no caso dos dados da cotação do Dólar spot da BMF, o pedido que recebi era para uma extração diária e previsível.

Optei então por experimentar o modo do KNIME para execução em lote (batch mode) e descobri algumas limitações importantes, que gostaria de compartilhar a seguir.

Limitações encontradas

Primeiramente, é preciso deixar claro que o batch mode do KNIME é quase uma demonstração de generosidade dos desenvolvedores, uma vez que conflita com o KNIME Hub, que diferente do KNIME Analytics Plataform, é um produto (extremamente bem) pago.

O batch mode do KNIME nada mais é do que um modo de execução que precisa ser invocado com parâmetros mais ou menos documentados. Já como ou quando a execução vai ser feita, é um problema a ser resolvido pelo implementador, ou seja, por mim, no caso.

  • Limitação 1: no contexto do fluxo de trabalho desenvolvido, eu descobri que o KNIME precisava de uma tela do X Window System, mesmo com a execução, o que me obrigou a instalar o pacote xvfb-run no openSUSE Leap (agradeço ao meu amigo Vinícius Oliveira por ter sugerido o utilitário).

  • Limitação 2: outra limitação importante, que claramente é uma falha de programação que não vai ser corrigida tão cedo, é que o batch mode do KNIME não respeita a raiz do diretório de trabalho, insistindo numa localização padrão (~/knime-workspace), o que me obrigou a trabalhar com ligações simbólicas.

  • Limitação 3: finalmente, para garantir o funcionamento do fragmento de código em Python, foi necessário exportar as configurações do KNIME para um arquivo de texto com a extensão .epf.

Operacionalização

Para resolver os problemas encontrados, eu optei pela construção de um shell script, responsável por invocar o KNIME com variáveis, de forma a facilitar o reaproveitamento para fluxos de trabalho futuros.

Na esperança de ajudar outras pessoas, apresento abaixo uma versão genérica, mas completamente baseada no shell script que eu escrevi.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/bash
KNIME_DIR=/home/usuario/bin/knime
WS_ROOT=/home/usuario/Arquivos/Documentos/Corporativo/Empresa/knime
WF_DIR=$WS_ROOT/Asset/Modelos/b3_taxa_cambio_referencial
PREF_FILE=/home/usuario/Arquivos/Documentos/Corporativo/Empresa/knime_hostname.epf

if [ ! -d /home/usuario/knime-workspace ]; then
	ln -s --verbose $WS_ROOT /home/usuario/knime-workspace
fi

cd $KNIME_DIR
xvfb-run ./knime \
	--launcher.suppressErrors \
	-nosplash \
	-application org.knime.product.KNIME_BATCH_APPLICATION \
	-workflowDir=$WF_DIR \
	-preferences=$PREF_FILE \
	-reset

if [ -L /home/usuario/knime-workspace ]; then
	rm -I --verbose /home/usuario/knime-workspace
fi

Finalmente, para garantir uma execução periódica, eu utilizei o comando crontab -e e inseri três linhas para execução do script, adaptadas a seguir para que possam servir de modelo:

1
2
3
30 19 * * * /home/usuario/Arquivos/Documentos/Corporativo/Empresa/knime_jobs/01_asset_dolar_b3.sh
30 20 * * * /home/usuario/Arquivos/Documentos/Corporativo/Empresa/knime_jobs/01_asset_dolar_b3.sh
30 21 * * * /home/usuario/Arquivos/Documentos/Corporativo/Empresa/knime_jobs/01_asset_dolar_b3.sh

Para especificar as linhas, eu utilizei o site Crontab.guru. Como deve ser perceptível intuitivamente, o script roda diariamente às 19h30, 20h30 e 21h30. Na maior parte do tempo, eu não consigo perceber quando o KNIME está sendo executado em segundo plano, pois apesar de utilizar uma workstation antiga, costumo desfrutar de bons uptimes e um latifúndio de 40 GB de memória RAM.

Posso acompanhar o resultado por meio de mensagens internas de correio eletrônico (enviadas automaticamente pelo daemon do Cron), que podem ser lidas em programas como Claws Mail e Alpine. Em geral, porém, apenas visito a planilha, armazenada no Google Drive, em um dos três horários em que o script roda, observando se o resultado difere daquele do dia anterior.

Conclusão

Do ponto de vista de um indivíduo que utiliza Linux também na vida profissional, embora pouco elegante, o batch mode do KNIME é uma solução viável. Combinando diferentes linguagens e recursos do sistema operacional, é possível executar fluxos de trabalho sem necessidade de intervenção humana ou de interface gráfica.