Archivo | python RSS for this section

Monitoring Oozie Coordinators Using Web API


If you work with oozie for ETL workflow executions chances are that you ended up overwhelmed when you need to monitor several workflows all at once and you found the web console of Oozie being too basic. Fear no more my friend, this time I want to share with you a little script I made for dealing with such situations.

Bear in mind before starting with the script:

  • The bellow code is available on my github repo under creative commons license if you want to check it out for yourself before looking at the explanation.
  • Oozie web API was used as the base of the script, if you’re not familiar with it, you should take a look on the reference page.
  • The script is python-web based so you should have CGI module enabled on your Apache web server before proceding (here’s a guide for install apache on windows without additional packages that are unnecessary for the purpose of this post, in GNU/Linux this should be a piece of cake).

There are two main parts of the tool:

1. Filters form

Here you find parameters for getting the results for the workflows of your choice:

Select the status: choose between oozie status for coordinators (RUNNING, SUCCEEDED, KILLED, DONEWITHERROR)

Max jobs to search in: limit the number of jobs in which to search in for the proper workflows (this is for pagination on oozie API)

Select the workflows to analyse: This is really useful if you need to monitor a bunch of workflows everyday. All you need to do is edit oozieMonitoring.html file from line 60 to add your workflows names (you should use names here as the appName is defined without any date portion i.e: cristianpark-workflow and not cristianpark-workflow_Daily_20180220)

Custom workflow name:  Enter one workflow name (only one workflow currently supported) that want to monitor (sometimes you want to monitor a workflow outside your regular list of workflows).

 

2. Results script

For this script to work you should have CGI enabled and identify the path for python on your system.

Some quick notes on this:

If there are results for your workflows in the status filtered, you should see a screen like this (grouped by workflow name)

Where you can see all the instances a workflow has in execution (or in another state according to your selection) and pretty basic info about each instance.

If there are no results, you end up with something like this:

I hope this can help someone for his/her task of monitoring several workflows. This tool is in an alpha stage so you’re more than welcome to add your two cents to it.

 

Don’t Worry…….Be Linux!!!

 

 

Anuncios

Alimentar Tabla desde CSV usando Python


Hoy me enfrenté a la necesidad de alimentar una tabla de una BD de PostgreSQL usando archivos CSV (archivos QVD de Qlikview originalmente) y lo primero que traté de hacer fue generar el archivo CSV para importarlo a PostgreSQL pero algunos archivos estaban dando problemas y cuando es muy grande el CSV a importar, se hace más lento el proceso y el debug.

Desde Qlikview se tenía que recorrer todo el archivo e insertar cada una de las filas generando el comando SQL manualmente. Recurrí a Python para hacer la tarea y el resultado fue hacer el proceso mucho más fácil y divertido. La solución es usar pandas y su conexión para postgreSQL (a través de sqlalchemy), aquí el script:

#!/usr/bin/python

import pandas
from sqlalchemy import create_engine

RUTA_CSV="/ruta/archivocsv/"
archivo="ArchivoCSV.csv"

def main():
#Usando Pandas
engine = create_engine('postgresql://USER:PASS@IP:PORT/BD')
archivocsv=pandas.DataFrame.from_csv(RUTA_CSV+archivo, sep='\t')
archivocsv.to_sql("TABLA", engine, if_exists='append', schema='esquema')

if __name__ == "__main__":
main()

Al utilizar DataFrame.from_csv se crea el dataframe de pandas usando el separador requerido.
Con la función to_sql se realiza la inserción en la BD en la TABLA especificada usando el esquema schema y con la opción if_exists=’append’ indicamos que en caso de la tabla existir en la BD y esquema especificados, se haga una inserción de datos.

De ésta forma fácilmente podemos hacer un volcado de la información de archivos planos a una BD PostgreSQL, si los archivos planos son demasiado pesados es conveniente hacer el proceso en lotes y allí pandas brinda una alternativa también.

Don’t Worry….Be Linux!!!

Descargar archivos en masa con webscrapping en python


En algún momento todos hemos tenido la necesidad de descargar archivos en masa desde páginas de internet (y no, no siempre es con ánimos de piratear cosas). En algunos casos herramientas como JDownloader han sido de ayuda para tomar varios links, pero los links no siempre son visibles y tenemos qué navegar a través de varias páginas para obtener lo que buscamos.

Buscando podcasts para aprender inglés me encontré ésta página: https://learnenglish.britishcouncil.org/en/elementary-podcasts y los materiales me gustaron aunque vi que eran 4 series, dos de 10 capítulos y dos de 20 con sus transcripciones (120 archivos en total) así que descargué los dos primeros audios y me puse el reto de hacer algo con R o python para descargar el resto.

En éste post no voy a entrar en detalles técnicos sobre el script de python pero sí voy a hablar sobre los conceptos clave que involucra hacer un webscrapping para descargar archivos de páginas web:

  1. Conocer la estructura de la página web. Este proceso no es automático totalmente por lo que saber un poco de la estructura de la página de la que se quiere descargar ayuda bastante. Por ejemplo en mi caso, la estructura de la URL de los capítulos es: https://learnenglish.britishcouncil.org/en/elementary-podcasts/series-01-episode-01 que es susceptible de estar en un ciclo de programación. También sé que quiero descargar los archivos MP3 y un transcript en PDF y al examinar el código de la página es fácil ver que hay elementos span con clase “file” donde están los links para descargar.
  2. Determinar la herramienta para el scrapping. Decidí usar python para hacer el scrapping y basado en [1] empecé a entender cómo utilizar la función BeautifulSoup de la librería bs4 de python. Mi plan sería crear carpetas por cada sesión y guardar un archivo por cada capítulo (4 sesiones, ~15 captíulos por sesión) así que busqué cómo descargar los archivos una vez tuviera los links de descarga y encontré que así como en GNU/Linux, hay un wget en python.
  3. Crear el script. Con la estrategia definida creé el script que inicialmente fue de unas 15 líneas y luego lo perfecccioné un poco con el caso específico de la págin de British Council (algunas veces tienen 5 archivos de descarga, otras 2) y básicamente busca los links en la página, descarga los archivos y los almacena en la estructura de archivos que describí en el paso 2. El script y próximamente más info estilo notebook se encuentra disponible en mi github

Este es un ejemplo para que lo ajusten a sus necesidades y ojalá lo compartan en los comentarios.

Don’t worry….Be Linux!!!

[1] https://www.dataquest.io/blog/web-scraping-tutorial-python/