Primeros pasos con PySpark y PyCharm

Quienes me conocen saben que soy fan de IntelliJ, ya llevo unos cuantos años desde que dejé de usar eclipse y la verdad es que estoy encantado con la decisión que tomé, para mí es la mejor herramienta para desarrollo Java, Scala (y supongo que Kotlin).

Actualmente Spark está en mi día a día ya sea a modo desarrollo programando en Scala, razón por la cual uso continuamente IntelliJ sino también en la formación tanto en Scala como en Python, hasta hace poco para las formaciones de PySpark (entiéndase Spark con el API de Python) utilizaba los Jupyter notebooks (e incluso la plataforma de Databricks pero eso da para otra entrada en el blog) pero estaba la curiosidad que poco a poco se ha convertido en una necesidad de contar con una herramienta más potente que permitiese hacer debug, que integrase Git, hacer markdown, autocompletado de código, permita estandarizar el código, etc. Si lo meditan un poco casi todo de una forma u otra se puede alcanzar con los Jupyter notebooks, pero lo que cambia es la forma de programación, ya que con un IDE sería programación al uso (sea esta funcional o no), mientras que con los notebooks sería programación literaria, es decir, un entorno más enfocado a la explicación y documentación del código y hoy en día ampliamente utilizado por científicos de datos (data scientists), mientras que el primero (IDE) más utilizado por los ingenieros de datos (data engineer).

Finalmente nos hemos puesto manos a la obra en probar varios IDEs en el equipo y yo no quise desperdiciar la oportunidad de trastear con PyCharm y hacer mis primeras pruebas de programación de PySpark y es lo que comparto ahora con ustedes.

Antes que nada hay ciertos requisitos previos:

  1. Tener instalado Spark
  2. Tener instalado Python

Está vez no les voy a mostrar como instalar Spark, ya que hay muchísimas fuentes que nos explican como hacerlo pero en cualquier caso hay que tener claro que es necesario Java 8 (al menos) y declarar las variables de entorno SPARK_HOME y HADOOP_HOME, la primera apuntando a la ruta de la instalación de Spark y la segunda a la ruta base de donde se instalará el winutils.

El otro requisito es Python, hay distintas formas de instalar python que tampoco explicaré aquí, pero resumiendo puede ser instalando el lenguaje (y luego pip si se desea o es necesario instalar otra dependencia) o mediante anaconda, yo he elegido este último ya que es un entorno que trae consigo ya instalado jupyter notebooks además de otras herramientas, en cualquier caso si alguien tiene cierta curiosidad de cuando instalar pip o anaconda les dejo este articulo de stackoverflow que no tiene desperdicio.

Anaconda y sus aplicaciones

Ya entrando en materia, el primer paso es descargar e instalar PyCharm (este podría incluso llegar a instalarse desde Anaconda, yo preferí descargarla para contar con la versión mas reciente). Yo lo hice con la versión community

Una vez instalado y ejecutado por primera vez, crearemos un nuevo proyecto y deberemos especificar nuestro entorno (environment), yo soy de los que prefiere crear un entorno por proyecto debido a que cada proyecto python (en general) puede ser diferente en cuanto a dependencias características, etc. llegando incluso a diferir la versión de python entre 2 y 3. A su vez dejo marcada la opción de que genere un main.py tal cual como aparece en las imágenes.

El IDE nos genera un main.py que hace de esqueleto de la aplicación, lo editamos con un trozo de código que genera un DataFrame y mostrará parte de su contenido mediante la invocación del método show quedando de esta manera


  # This is a sample Python script.

# Press ⌃R to execute it or replace it with your code.
# Press Double ⇧ to search everywhere for classes, files, tool windows, actions, and settings.


def print_hi(name):
    # Use a breakpoint in the code line below to debug your script.
    print(f'Hi, {name}')  # Press ⌘F8 to toggle the breakpoint.


# Press the green button in the gutter to run the script.
if __name__ == '__main__':
    print_hi('PyCharm')

    try:
        #import findspark;

        #findspark.init()
        from pyspark import SparkContext, SparkConf
    except ImportError:
        raise ImportError("Unable to find pyspark -- are you sure SPARK_HOME is set?")

    import random

    from pyspark.sql import SparkSession

    spark = SparkSession \
        .builder \
        .appName("PyCharm Example") \
        .getOrCreate()

    mi_rango = spark.range(1000).toDF("numero")
    mi_rango.show()

# See PyCharm help at https://www.jetbrains.com/help/pycharm/
Si este código tratamos de ejecutarlo (Menu Run->Run main), este falla. Esto se debe a que es necesario incluir las dependencias propias de Spark, por lo cual es necesario incluir la carpeta python de la instalación de Spark (sería $SPARK_HOME/python) y además la carpeta py4j ubicada en $SPARK_HOME/python/lib/py4j-xxx-.zip

El añadir py4j es una de las alternativas que existen para poder hacer ejecuciones en local del código. Otra alternativa es instalar py4j como dependencia del entorno (environment) y de hecho la misma herramienta te ofrece la alternativa como se refleja en la imagen a continuación

Ahora podemos darnos cuenta que ya no se resaltan (en rojo) parte del código. Procedemos de nuevo a ejecutar el código y nos damos cuenta que este se ejecuta exitosamente.

Ya estamos a punto de terminar pero falta un pequeño detalle, el IDE todavía nos marca unos warnings, por ejemplo el código comentado y esto se debe a que por defecto PyCharm ya aplica PEP8 como estándar al código y por ende todo aquello que no cumpla con el estándar definido será resaltado para su corrección como se muestra en la imagen.

Incluso si hacemos clic en el símbolo de warning (cuidado) ubicado en la parte superior derecha, nos listará las cosas a mejorar que cumplan con el estándar. Una vez listado los warnings procedo mejorar el código quedando de la siguiente manera

Finalmente el código (aunque es muy simple) ya cumple con el estándar PEP8 y nos ha resultado relativamente sencillo poder ejecutar nuestro código desde el mismo IDE, además la herramienta nos permite sin salir de ella acceder a linea de comandos, hacer control total de Git (pull, push, commit, comparación entre ramas y más), poner breakpoints y realizar debug del código. Otra cosa a comentar es que aun cuando no hayamos definido el SPARK_HOME (cosa que no recomiendo) y el HADOOP_HOME, estas variables podemos definirlas antes de ejecutar el código mediante Edit Configurations.

Ha sido un ejemplo muy simple pero creo que refleja parte del potencial de la herramienta, aunque no todos son buenas noticias, por ejemplo la versión community no permite abrir y ejecutar jupyter notebooks cosa que si permite la versión de pago, llegando incluso a permitir la ejecución celda a celda y esta es una característica muy deseada que algunas herramientas si lo permiten como es el caso de VSCode, sin embargo esto no empaña para nada las capacidades que tiene y puede aportarnos de cara a la productividad.

Spark Scala con Maven en IntelliJ

Este es un post que la verdad no había tenido en mente crear pero últimamente se me ha convertido en una necesidad y la verdad he disfrutado hacer y es que en estos ya casi 5 años involucrado en temas relacionados con Big Data y la nube la verdad es que he podido notar como construir un proyecto Spark desde cero se convierte en algo fácil pero netamente basado en copiar y pegar de proyectos anteriores, pero … y qué sucede cuando no hay un proyecto anterior jejeje, pero no es el único caso y qué sucede con aquellos que están aprendiendo, es cuestión de indagar por Internet y encuentras 30 formas distintas de armar un proyecto desde cero de Spark con Scala con Maven y en un IDE en este caso IntelliJ, pero cual es la idónea, cual es la que verdaderamente funciona.

Pues he decidido crear un esqueleto de proyecto (el cual espero poder ir evolucionando y mejorarlo) que seguramente no es la mejor pero desde mi humilde punto de vista es funcional.

Configurar el IDE

Lo primero antes que nada es instalar el jsdk (1.8 como mínimo), luego en la instalación o inmediatamente después es asegurarnos de contar con los plugins de Maven y Scala, para ello en la ventana de inicio vamos a los plugins.

Buscamos el plugin de Scala para verificar que este instalado si no lo está lo instalamos y luego en la misma ventana en la parte superior junto a Marketplace hacemos clic en installed y verificamos que el plugin de maven por defecto este habilitado.

Creamos el proyecto

Seleccionamos la opción de crear un nuevo proyecto.

Ventana de inicio de IntelliJ

Acto seguido seleccionamos la opción de proyecto maven y marcamos la opción de Create from archetype. Seleccionamos el archetype net.alchim31.maven:scala-archetype-simple y pulsamos el botón “Next”. Si el archetype no existe pulsamos el botón de Añadir Archetype (Add Archetype) cumplimentamos la información con los siguientes datos:
GroupId: net.alchim31.maven
ArtifactId: scala-archetype-simple
Version: 1.7

Una vez añadido lo seleccionamos y como habíamos indicado antes pulsamos el botón “Next”.

Indicamos el archetype en caso de no estar presente en la lista
Lista de archetypes para crear el proyecto

Inmediatamente después le daremos nombre a nuestro proyecto y si queremos ser más específicos indicamos el GroupId, ArtifactId y versión de nuestro proyecto (OJO esto último es opcional), pulsamos “Next” y por último en la ventana resumen pulsamos “Finish”.

Configuración de nuestro artifact

Lo primero que deberemos hacer para que nos facilite la tarea será habilitar la autoimportación de las dependencias maven como señalamos en la imagen.

Habilitamos la autoimportación de dependencias

El construir el proyecto a partir de un archetype (arquetipo) maven consiste en armar el esqueleto de un proyecto a partir de una plantilla definiendo una estructura minima por defecto, por lo cual veremos un fichero pom.xml (gestión de dependencias maven) con algunas dependencias y una estructura de carpetas para el código fuente y pruebas unitarias, con ficheros incluidos.

Estructura del proyecto reciéntame creado

Aprovechamos de dar un vistazo a la clase App y a las pruebas unitarias que por defecto nos añade al proyecto e incluso podemos compilar el proyecto para contrastar que todo está de maravilla y para ello solamente necesitamos hacer clic en la pestaña maven ubicado en la parte derecha, donde aparece el nombre de nuestro proyecto desplegar lifecycle y hacer doble clic en compile y esto iniciará el proceso de compilación terminando exitosamente.

Añadimos dependencias

Ya estamos llegando al final, ahora lo que haremos será añadir al fichero pom.xml las dependencias spark que utilizaremos para este ejemplo. Empezaremos por editar las propiedades quedando estas así:

Añadimos las dependencias de spark al conjunto de dependencias existentes

Por último modificaremos nuestra clase App quedando esta así:

Para de nuevo volver a compilar el proyecto, que deberá culminar exitosamente.

Ejecución

La forma que indicaremos para la ejecución de los jobs desde IntelliJ no es la mejor pero es una forma sencilla y funcional para probar cosas y sobre todo para quien comienza a hacer tests sin necesidad de empaquetar y crear un jar y desplegarlo en una máquina virtual o en un cluster. ¿Cuál sería entonces la mejor forma? A mi modo de ver las cosas la mejor forma sería mediante prueba unitarias y de integración donde podamos probar todo el job de inicio a fin y para explicarles como ya tengo en mente preparar otro post paso a paso indicando como hacerlo y las herramientas para lograrlo. Continuando con la configuración de la ejecución, si sencillamente con botón derecho del ratón hacemos clic en Run ‘App’ nos arrojará el error.

Exception in thread “main” java.lang.NoClassDefFoundError: org/apache/spark/sql/SparkSession$
at com.josedeveloper.App$.main(App.scala:13)
at com.josedeveloper.App.main(App.scala)
Caused by: java.lang.ClassNotFoundException: org.apache.spark.sql.SparkSession$
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
… 2 more

Error ejecutando la clase App

El error se debe a que no encuentra las clases con las que fue compilado previamente y eso se debe a que las dependencias de spark las hemos añadido con el alcance “provided”.
¿Por qué provided? Debido a que en un entorno empresarial esas dependencias no debemos agregarlas ya que las provee la infraestructura Big Data de la empresa.

Entonces para solventar el error sencillamente debemos ir al menu “Run” y hacemos clic en “Edit Configurations” y allí marcamos la opción de incluir dependencias provided (Include dependencies with “Provided” scope).

Marcamos la opción que incluya las dependencias con alcance “Provided”

Hecho eso volvemos a ejecutar la clase App y veremos como si se logra ejecutar la aplicación. Sin más espero que les haya servido de ayuda y les comento que mi próximo paso será crear un archetype (arquetipo) y a su vez explicarles como hacerlo para que cada quien pueda construir uno acorde con las necesidades de su organización y así dotamos de más profesionalidad y agilidad nuestro trabajo y evitamos el copiar+pegar donde en ocasiones terminamos añadiendo mas dependencias y plugins innecesarios así como también arrastrando problemas y errores (de haberlos).

Aquí les dejo el video

Repo GitHub

Migrar Blog WordPress a AWS Lightsail Pt. I

Como algunos de ustedes ya saben he migrado este blog desde una plataforma tradicional a la nube de Amazon, específicamente a un servicio llamado Lightsail y es lo que vengo a contarles.

¿Qué es Lightsail?

Es un servicio de AWS que nos permite crear un VPS (Virtual Private Server) con solo unos pocos clics, haciendo un poco más fácil la gestión y hospedaje de un sitio Web y a bajo coste ya que a partir de 5$/mes podemos tener hospedado un sitio.

Lightsail es un servicio que hace más amigable la administración de un sitio pero aún permitiéndonos acceder a la instancia via ssh. Con Lightsail podemos crear una instancia no solo para hospedar un sitio con WordPress, sino también con Magento, Joomla, Drupal o una instancia con un stack LAMP, MEAN, Node.js y otros más. Solo basta clicar el botón “crear instancia” y a continuación:

  • Seleccionar la región y zona donde estará ubicada la instancia.

Ubicación de la instancia

Ubicación de la instancia

  • Seleccionar la plataforma (Linux/Unix o Windows).
  • Seleccionar únicamente el sistema sistema operativo o el sistema operativo junto a las aplicaciones a instalar.

Seleccionar un plan

Seleccionar un plan

  • Seleccionar el plan de la instancia: 5$, 10$, 20$, 40$ u 80$.

Seleccionar el plan de almacenamiento de la instancia

Seleccionar el plan de almacenamiento de la instancia

  • Darle un nombre a la instancia.

Crear instancia

Crear instancia

  • Pulsar el botón crear.

Antes de seguir debo hacer mención a par de articulos que utilicé como referencia mientras llevaba a cabo la migración:

https://www.elpuas.com/como-instalar-wordpress-en-amazon-lightsail/

http://www.adrianmilne.com/migrating-wordpress-blog-amazon-aws-lightsail/

Una vez creada la instancia esta tendrá todo el entorno de WordPress montado incluso con su usuario administrador y podremos visitar el site sencillamente viendo el detalle de la instancia recién creada específicamente su IP pública.

Luego así como lo indica el blog de Adrian Milne me descargué la clave privada para acceder desde mi ordenador por ssh (no fuera tan importante para la administración del sitio sino fuese porque via ssh es que podremos obtener la contraseña de administración de WordPress). Luego utilicé el plugin de WordPress UpdraftPlus y lo instalé en el WordPress recién creado y en el que deseaba migrar y realicé un primer backup y ese mismo lo utilicé para llevar a cabo la restauración en la instancia recién creada.

Una vez comprobada que la restauración se había llevado a cabo, ya me faltaba solo un paso, probar llegando desde una URL y no usando la IP pública, para esto utilicé un dominio que me había comprado hacía cerca de un año mientras me preparaba para la certificación de solution architect de amazon estudiando el servicio Route 53.

Lightsail dentro de sus funciones también incluye alguna de Route 53 como es la gestión de DNS, lo que en Route 53 sería la gestión de zonas hospedadas, en Lightsail sería crear zona DNS, entonces continuando con la migración los siguientes pasos fueron:

  • En la página de inicio de Lightsail, ir a redes y luego clicar el botón “Crear una IP estática”. Aquí se asociará la instancia a una IP estática pública.
  • En el mismo apartado de redes, clicar el botón “Crear zona DNS”. Allí indicaremos nuestro dominio (sin importar que este no haya sido registrado en Route 53) y pulsaremos el botón “Crear zona DNS” como aparece en la imagen.

crear zona DNS

crear zona DNS

  • Añadimos los registros de DNS como aparece en la imagen pero usando vuestro dominio y para cada subdominio en el campo “IP DE DESTINO” seleccionamos nuestra instancia (que de antemano ya la asociamos a una dirección IP estática).

crear zona DNS

crear zona DNS

  • Finalmente deberemos esperar unos pocos minutos y ya podremos visitar nuestro sitio usando el dominio.

Esto es todo chicos, en la próxima entrega les indicaré como migrar un dominio registrado con otro registrador, que fue un paso adicional que realicé ya que mi dominio josedeveloper.com lo había registrado con godaddy.com

Primeros pasos con Apache Drill

¿Qué es apache drill?

Es un motor de consultas open-source para exploración de fuentes de datos con grandes volúmenes de datos. Apache drill nos permite realizar análisis de alto rendimiento sobre datos semiestructurados sin dejar de ofrecer la familiaridad y el ecosistema de la norma ANSI SQL. Apache drill a su vez posee integración con Hive y HBase.

Apache drill a menudo es comparado con Hive y con Impala, por su alto rendimiento por trabajar con ficheros .csv y .json, así como también porque por medio de estas podemos efectuar consultas en HBase, pero hay un aspecto donde drill sobresale y es que puede conectarse a otros gestores de bases de datos como por ejemplo MySQL y MongoDB.

¿Cómo conocí Apache drill?

Me topé con apache drill por casualidad en el 2015, debido a las circunstancias y dificultades con las que trabajábamos, teníamos ordenadores plataformas que no nos permitían instalar nada y como tarea teníamos que hacer cruce de información de grandes ficheros .csv con sistemas de bases de datos relacionales. Los ficheros .csv eran tan grandes que ni siquiera podíamos visualizarlos con excel ni con atom y apache drill termino siendo una herramienta estupenda para poder realizar exploración sobre los datos y eso que lo utilizamos en modo embebido en nuestro ordenadores.

Instalación

Apache drill tiene 2 tipos de instalación dependiendo si será en un cluster o si será en un único nodo, nosotros haremos la de un único nodo, la cual es muy sencilla ya que solo es necesario descomprimir el fichero descargado y ejecutar el  fichero ./drill-embebed el cual esta en la carpeta /bin de nuestra instalación.

Este último paso abrirá una consola donde podremos ejecutar sentencias sql y además se levantará un cliente web al que podremos acceder desde cualquier navegador en la ruta http://localhost:8047

apache drill web client

apache drill web client

Ahora vamos a empezar a jugar con drill, para ello crearemos un fichero json que denominaremos cliente_banco.json con los siguientes datos:

También crearemos un fichero csv con los datos de los clientes y lo llamaremos clientes.csv:

Ahora que empiece la diversión, lo primero que haremos será consultar los datos del fichero clientes.csv como si fuera una tabla con SQL utilizando el cliente Web de drill, para ello será necesario ir a la ruta http://localhost:8047/query

Una vez allí ejecutaremos la siguiente sentencia:

SELECT * FROM dfs.ruta_fichero/clientes.csv

resultado query csv en drill

resultado query csv en drill

El resultado no se puede apreciar muy bien además que se ve que asume la cabecera del fichero csv como si fuese un registro, para mejorar esto, será necesario hacer una pequeña modificación en la configuración. Apache drill funciona con plugins donde se almacena toda la configuración de las conexiones con ficheros del filesystem, de gestores de bases de datos, tipo mongoDB, MySQL, etc. por ende será necesario que editemos la configuración del plugin de filesystem para que tome en cuenta la cabecera del fichero csv (NOTA: Aquí también podríamos configurar el tipo de separador ya sea “,”o “;” o “|” entre otros).

Para realizar la actualización de la configuración deberemos ir a la ruta http://localhost:8047/storage y hacer clic en el botón “Update” del plugin dfs.

storage

storage

Allí veremos un json utilizado para la configuración y buscaremos el elemento “csv” dentro del objeto “formats” y le añadiremos el atributo “skipFirstLine”: true como se muestra en la siguiente imagen y procederemos a actualizar el plugin pulsando el botón “Update”.

configurando plugin dfs

configurando plugin dfs para que no tome en cuenta la primera linea del csv

Si intentamos de nuevo la consulta veremos como es obviada la cabecera del fichero csv, aunque aún no vemos el resultado como una tabla, para eso utilizaremos alias para identificar a cada columna al momento de efectuar la consulta de la siguiente forma:

SELECT columns[0] as ID, columns[1] as NOMBRE, columns[2] as APELLIDOS, columns[3] as PROVINCIA FROM dfs.ruta_fichero/clientes.csv

Obteniendo lo siguiente:

resultado de la consulta

resultado de la consulta

Vamos a profundizar aún más y ahora realizaremos un join entre los datos del fichero csv y del fichero json, ejecutando la siguiente consulta:

SELECT tablaCSV.columns[0] as ID, tablaCSV.columns[1] as NOMBRE, tablaCSV.columns[2] as APELLIDOS, tablaCSV.columns[3] as PROVINCIA, tablaJSON.BANCO FROM dfs.ruta_fichero/clientes.csv tablaCSV
LEFT JOIN dfs..ruta_fichero/cliente_banco.json tablaJSON
ON tablaCSV.columns[0] = tablaJSON.ID

Obteniendo:

resultado del left join

resultado del left join

Apache drill nos ofrece a su vez más posibilidades como por ejemplo crear tablas en formato parquet  a partir de un json o de un fichero csv. Apache drill es una herramienta que me gusta mucho pero también cuenta con algún aspecto a mejorar, por ejemplo me gustaría poder utilizar la cabecera de un fichero csv como nombre de columna al efectuar consultas y esto no funciona del todo bien, de hecho hice unas pruebas y fue así como me percate de este pequeño error que estoy seguro (y espero) se solucione pronto.

Para que la cabecera de un archivo csv sea tomada en cuenta como nombre de columna de una tabla es necesario modificar la configuración del plugin dfs, al igual que lo hicimos antes para que no tomase en cuenta la primera fila del archivo, editando el formato csv así como en la siguiente imagen.

config dfs plugin

configurando dfs plugin para que reconozca la cabecera de los ficheros csv

De nuevo repitamos la consulta que hacíamos al principio:

SELECT * FROM dfs.ruta_fichero/clientes.csv

Vemos como de inmediato sin haber utilizado alias en la consulta el resultado es devuelto como una tabla

Si ahora repetimos la consulta veremos como la salida de los resultados ha cambiado, dándonos una perspectiva de que tenemos una tabla, utilizando la cabecera del fichero csv como la cabecera de la tabla de resultados

consulta de todos los campos

consulta de todos los campos

Además al igual que con ejemplos anteriores podemos efectuar join con otras tablas independientemente en el formato o fuente que se encuentren (son, csv, parquet, mysql, etc…), el problema (o error) esta cuando intentamos consultar por un campo en especifico alguno puede que no devuelva nada como por ejemplo si efectuamos la siguiente consulta:

SELECT ID, NOMBRE FROM dfs.ruta_fichero/clientes.csv

consulta de ID y NOMBRE

consulta de ID y NOMBRE

 

Esto me pareció tan extraño que intente jugar con distintos parámetros de configuración e incluso con la forma de realizar la consulta y no pude solventar este comportamiento por lo que publiqué  este error en stackoverflow por si estaba haciendo algo mal y alguien podía echarme una mano.

No quiero que lo último los desanime a probar la herramienta ya que esta cuenta con muchas bondades que dan para redactar unas cuantas entradas más, espero que hayan podido seguir todos los ejemplos y tener una perspectiva de lo que podemos alcanzar con la herramienta.

ACTUALIZACIÓN 28-09-2016:

Al haber quedado con la inquietud del mal funcionamiento al ejecutar la consulta sobre el csv indicando como columnas la cabecera del fichero, me decidí a escribir a lista de usuarios de apache drill por si en dado caso me estaba topando con un bug (cosa extraña porque llevaría así al menos 3 releases) y ellos me han dado la respuesta, el problema estaba en el espacio en blanco inmediatamente después de la coma, por lo cual al reformular la consulta y hacerla de la siguiente manera funcionó a la perfección:

SELECT ID, ‘ NOMBRE’ FROM dfs.ruta_fichero/clientes.csv

Pero otra forma quizás más elegante aún es que se eliminase el espacio después de la coma en la cabecera del archivo csv, de esa manera  basta con que coloquemos los nombres de las columnas sin necesidad de encerrarlas entre comillas al momento de formular la consulta.

SELECT ID, NOMBRE FROM dfs.ruta_fichero/clientes.csv

Tablas en memoria en MySQL

Algunas semanas atrás en el trabajo nos topamos con un problema, realizábamos una consulta que consistía en hacer un join entre una tabla muy grande contra un par de tablas pequeñas que contenían únicamente descripciones. Como ustedes ha de imaginarse teníamos nuestra base de datos normalizada y para exportar los datos con el conjunto de descripciones era necesario realizar este cruce.

Para que la consulta fuese bien (que no arrojase un timeout en el mejor de los casos) habíamos agregado índices a las tablas secundarias (aquellas que contenían las descripciones) y la consulta de lograr ejecutarse llegó a tardar unos 25 segundos. Estas tablas eran de tipo InnoDB y los índices eran de tipo B-Tree (es el único tipo de índice para las tablas de tipo InnoDB). La consulta llegaba a tardar en el mejor de los casos (que no devolviese un timeout) 25 segundos. Es por esta razón que buscando una alternativa abordamos las tablas en memoria.

Las tablas en memoria son almacenadas en la memoria HEAP razón por la cual son tablas temporales ya que una vez se haya reiniciado o apagado la máquina estas perderán los datos, es decir se mantiene la estructura de la tabla mas no su contenido. Las tablas en memoria en MySQL pueden tener 2 tipos de índices B-Tree o Hash.

¿Cuando utilizar cada tipo de índice?

El índice B-Tree puede utilizarse con operadores del tipo =, >, >=, <, <= o BETWEEN, de igual manera puede ser usado con el operador LIKE, mientras que el índice Hash es usado únicamente para comparaciones de igualdad como =, >= o <=. Así que de realizar comparaciones de igualdad es recomendable utilizar el índice Hash ya que es muy rápido mientras que cuando se realicen comparaciones del tipo >, <, LIKE, BETWEEN u optimizar operaciones de ORDER BY la opción es utilizar B-Tree.

En nuestro caso únicamente realizábamos operaciones de igualdad ya que comparábamos en base a un código así que utilizamos índices de tipo Hash, obteniendo excelentes resultados, tanto es así que nunca llegamos a obtener un timeout y el tiempo de respuesta de nuestras consultas se redujeron a 5 segundos.

¿Cómo crear una tabla en memoria?

La creación de una tabla en memoria es muy sencilla, es igual a la creación de cualquier otra tabla del tipo InnoDB, lo único es sencillamente cambiar el tipo de “engine” e indicar “MEMORY”, por ejemplo:

Por último ¿Como hacer para que se carguen los datos de la tabla en memoria al arrancar?

Por muy tonto que parezca para nosotros esto era importante ya que nos asegurábamos de que de reiniciarse el ordenador (era windows :-s ) estando o no nosotros, las tablas en memoria estarían creadas y cualquier consulta que se efectuase no daría error. Para que la tabla en memoria se llene de datos al arrancar el servidor MySQL es bastante sencillo, lo único que debemos hacer es editar el fichero my.ini o my.cnf y debajo de donde dice [mysqld] agregar la siguiente linea

Donde script.sql tendrá las sentencias sql de inserción por ejemplo

Espero que esto les pueda servir para optimizar el consultas en base de datos o sencillamente resolver cualquier inconveniente.

¿Has trabajado antes con tablas en memoria? Compartirías con nosotros tu experiencia.

Gephi una herramienta de visualización de redes

Esta semana en el Master empezamos con una nueva materia denominada “Análisis de redes sociales”, el inicio ha sido bastante interesante, de hecho me pareció chévere, pero lo que quiero compartir con todos ustedes es la herramienta que vimos el primer día, esta se llama Gephi, es una herramienta open source hecha en Java para la visualización  de redes y pues nosotros empezamos analizando nuestra red social Facebook.

Visualización de mi red social Facebook

Visualización de mi red social Facebook

 Para que la herramienta funcione correctamente en Mac OSX hay que ser una serie de “trucos” y apaños (como ejecutarlo en Java 6) porque en caso contrario seremos incapaces de ni siquiera arrancar la aplicación. Aquí les dejo el enlace donde aparecen los pasos necesarios de configuración para poder ejecutarlo en Mac OSX.

La imagen de mas arriba es una perspectiva de todos los nodos que forman parte de mi red social Facebook. Para poder visualizar mi red de Facebook tuvimos que descargarnos un fichero de extensión .gml desde esta página donde podemos indicar que información queremos obtener de nuestra red de contactos, como sexo, lenguaje, entre otros.

Me gusto la herramienta no solo por lo versátil al momento de visualizar el diagrama y los resultados que obtuve (como las agrupaciones de nodos que son fácilmente identificables), sino porque tenia (y tengo) en mente hacer una visualización de mi red de Twitter, pero con Java y Neo4j, aunque ya compañeros del master me han hecho llegar un proyecto que genera el fichero .gml, por lo cual quizás visualice antes en Gephi mi red de Twitter. Sin mas dilación aquí les dejo el componente gigante de mi red donde señalo sus agrupaciones.

Componente gigante de mi red de Facebook

Componente gigante de mi red de Facebook

¿Alguno de ustedes ha hecho un análisis de alguna de sus redes sociales? ¿Que herramienta utilizaste? Si te animas a analizar alguna de tus redes sociales con Gephi, no dudes en compartir tu resultados con nosotros

Mi CV en formato mapa mental

Hacia mucho tiempo que venia con esta idea de hacer una versión de mi CV (currículum vítae) en formato mapa mental, pero no lo hice antes entre otras cosas porque no me había tomado el tiempo de buscar una aplicación que de forma sencilla me ayudara a realizarlo y porque en realmente no sabia como empezar, ya que los que había visto todos variaban entre sí no solo en estilo sino en contenido, pero esto cambio hace par de días cuando revisando algunas aplicaciones de la Mac Store vi SimpleMind (la versión gratuita) la instale y de inmediato me gusto su sencillez y que lo poco que hace a mi parecer lo hace bien y bueno lo demás fue “un tiro al piso” (quiero decir muy sencillo, imposible de fallar), fue ponerme a jugar con la herramienta y empiezo a fluir la inspiración, ese boceto de como quería que fuera mi CV y bueno he decidido no solo compartirlo con ustedes sino que he hecho una página en mi sección personal (menu “Yo”) únicamente para mostrar  el mapa con la intención de esporádicamente ir actualizandolo.

CV en formato mapa mental

CV en formato mapa mental

Sinceramente me gusto como quedo pero por momentos dude en si agregar o no, par de nodos adicionales, como “objetivos” (sobretodo educacionales, aprender nuevas tecnologías, herramientas, etc..) y “hobbies” o “intereses” (como ya he indicado antes en la página acerca de mí) donde colocaría fútbol, running, estar actualizado en cuanto a la tecnologías, pero finalmente decidí no añadirlos aunque no descarto agregar estos nodos en una actualización mas adelante.

Alguna sugerencia, ¿quitarias o pondrías algún tipo de información adicional?

MI CV en formato mapa mental

Mejorando mi blog WordPress, Parte II

Revisando un articulo sobre como mejorar la velocidad de un blog WordPress encontré un enlace donde listaban un conjunto de herramientas online gratuitas que realizan una serie de pruebas (tests) y de acuerdo a los resultados emiten unos informes y dan en algunos casos sugerencias a mejorar. He realizado pruebas con 3 de ellas con el plugin W3 Total Cache inhabilitado y luego de nuevo con el plugin habilitado para poder observar si hay mejoras en cuanto a rendimiento. A continuación los resultados de los tests con el plugin inhabilitado:

Pingdom

pingdom_antes

 

 

 

Google Page Insights

page_movil_antes page_desktop_antes

Gtmetrix

gtmetrix_antes

 

 

 

 

 

Ahora voy con los resultados una vez habilitado el plugin W3 Total Cache

pingdom_despues

 

 

 

page_desktop_despues page_movil_despues

 

gtmetrix_despues

 

Conclusión

Esta verificado que el plugin me proporciona mejoras en cuanto a rendimiento, ya que de hecho en mayor o menos medida las 3 diferentes herramientas así lo han corroborado, lo cual es positivo, aunque hay algo que les confieso me ha dejado aun un poco inconforme y ha sido el resultado arrojado por la aplicación de google, ya que incluso cuando he habilitado la minimización del Javascript, de las CSS y del HTML además de la compresión en los ajustes del plugin de WordPress, el test de velocidad de google me sugiere llevar a cabo lo antes citado (minimización de los js, css y html). Supongo que quizás es alguna afinación en los ajustes que me falta por hacer y de hecho espero que así sea. De todas formas si logro hallar la manera de solventar ese inconveniente lo compartiré con ustedes como una actualización de esta entrada, por otro lado si ustedes conocen la respuesta POR FAVOR HAZMELA LLEGAR!, pero independientemente de eso lo importante es que he podido (y espero que ustedes también) llevar a cabo una mejora en cuanto al rendimiento del blog.

Actualización

He descubierto, que las sugerencias que me planteaba la herramienta Google PageSpeed Insights, que consistían en minimizar el JS (JavaScript), HTML y CSS de la página tanto para la versión de escritorio (que alcanzaba una valoración de 80/100), como para la versión para móviles (con una nota de 74/100), se deben a lo siguiente:

En la versión de escritorio se debe casi en su totalidad a código proveniente de los anuncios de amazon que aparecen en mi página, mientras que en la versión de móviles se debe al JavaScript utilizado para mostrar el mensaje de las cookies al cargar la página y al plugin WPtouch Mobile, el cual es el encargado de mostrar una versión algo minimalista de la página para dispositivos móviles, pero que a su vez me permite conseguir una nota de 99/100 en experiencia de usuario en móviles (razón que me hace compensar el por ahora no tener un mejor rendimiento), lo cual ahora que conozco la razón no me preocupa, ya que no me extrañaría que pronto salga una actualización en alguno de los plugins involucrados (WPtouch Mobile y W3 Total Cache) que permita mejorar la compresión del Javascript y CSS de la página.

Mejorando mi blog WordPress

Hace aproximadamente un mes, inicie esta mejora del blog, motivado en un principio por la ley de cookies española, como les conte en mi última entrada, aunque el paso definitivo que me empujo a llevar a cabo estas mejoras fue el darme cuenta que todas las entradas que incluían segmentos de código se veian mal, sin estilo, en fin,  sencillamente horribles, puedo decirles que me avergüenza ya que ni siquiera tengo una idea de cuanto tiempo llevaban las entradas en dicho estado. Profundizando un poco mas en el asunto creo que tendría alrededor de 2 años o mas sin buscar algún plugin novedoso o revisar algún tema nuevo, pero al menos me contenta decirles que estoy satisfecho con el tiempo dedicado, el resultado obtenido y compartirlo con ustedes.

Antes de empezar y para no alargarme mucho quiero aclarar que no soy un experto ni mucho menos, pero pienso que puede haber personas que al igual que yo no sabrían por donde empezar a la hora de buscar que plugins agregar a su blog WordPress, ni siquiera con que objetivo empezar a buscar e igualmente siempre da un poco de confianza tener una referencia de un plugin antes de descargarlo aunque este tenga 4 estrellas de rating.

Les detallo a continuación que plugins instale:

Plugin para adecuar el blog a la ley de cookies española.

akismetPara evitar el spam en los comentarios, instale Akismet, el cual es un servicio que en el caso de ser utilizado para una web personal es gratis aunque siempre te agradecerán cualquier donación que puedas aportarles, entre otras cosas además de quitarte el dolor de cabeza de los spam te aporta estadísticas al respecto. No dejes de instalarla no te arrepentiras te lo aseguro. Para mejorar aun más la gestión de los comentarios de mis entradas active el plugin SI CAPTCHA Anti-Spam el cual añade un captcha que el usuario ha de ingresar correctamente para poder añadir un comentario.

Con respecto al resaltado de código y su visualización, instale el plugin Crayon Sintax Highlighter, lo cual me sorprendió muy gratamente ya que al activarlo una vez desactivado  el resaltador de sintaxis que tenia previamente, ya se visualizaba el código con un look & feel fantástico, ya que el plugin le aplica un estilo a todo lo contenido dentro de etiquetas <pre></pre>, el único trabajo que tuve que realizar adicionalmente para añadir atributos a la etiqueta como por ejemplo

<pre class=”lang:java”> indicando que el código a mostrar es Java

crayon

Sin lugar ha dudas este plugin ha de estar en este momento en el top 3 de resaltadores de sintaxis, además de la gran cantidad de lenguajes que soporta entre los que puedo nombrarles, C/C++, Java, HTML/XML, CSS …

Para mejorar las funciones de SEO, añadí Google Analytics for WordPress, el cual esta considerado ahora mismo el número 1 en la materia.

yoast seo

Mucho cuidado con tener otro plugin de características similares instalado y activado, ya que puede interferir y dar error al intentar visitar el sitemap.xml de la página.

Para dar características de Social Media, instale Juiz Social Post Sharer, el cual permite compartir en las principales redes sociales y posee un estilo sobrio y sencillo como pueden ver a continuación en la siguiente imagen.

social media

Para aportar esta característica al blog existen muchas otras opciones, yo también estuve probando Social Media Feather, el cual esta muy bien ya que cubre las principales redes sociales y a su vez da la opción de seguir además de la de compartir, aunque yo me decante por la primera por razones de estilo.

Además de las antes mencionadas, añadí el plugin que hasta el momento estaba siendo considerado como el plugin mas popular, el Contact Form 7, este permite de una forma muy sencilla crear formularios de contacto, los cuales recibiríamos por correo electrónico, este es un plugin simple pero que hace muy bien su trabajo.

Era necesario que también llevara a cabo mejoras en cuanto a rendimiento y carga de paginas, sobretodo en estos tiempos donde la navegación a través de dispositivos móviles representa un factor importante y para eso instale W3 Total Cache, el cual además de crear una cache, mejora de forma considerable la velocidad de carga haciendo una compresión de las CSS y el código javascript del blog.

Para finalizar yo siempre me pregunte como hacían los editores de blog related postpara en todos sus entradas hubieran referencias a otras entradas relacionadas entre si (dios que iluso fui), y para ello existen varios plugin aunque yo me decante por Yet Another Related Posts Plugin, que funciona de maravilla, con solo instalarlo ya me doto de esta característica a la mayoría de las entradas de mi blog.

Para aquellos que al igual que yo esten un poco desconectados en las novedades los plugins WordPress espero que esta entrada les haya sido de utilidad y para los que ya estén mas actualizados ¿Han hecho alguna mejora a su blog? ¿Que otro plugin podrían sugerirnos para tener nuestro blog actualizado a las nuevas tendencias?

Plugins WordPress para la ley de cookies española

Transcurría el mes de agosto del año pasado cuando por un tuit me entere de que existía una “ley de cookies”, el tuit hacia referencia a una publicación donde indicaban que ya existía una demanda en contra de una empresa “grande” en España y todo porque alguien (entiendo que un astuto) había introducido la demanda ya que el sitio Web de la empresa no indicaba que introducía cookies en las computadoras de los usuarios que visitaban dicho sitio. Recuerdo también que dicho articulo comentaba que el ente jurídico español no multaría (según sus fuentes) con una cifra escandalosa a la empresa para la compensación del o los usuarios pero si estaban tomando ese caso para elaborar una especie de borrador para que a su vez bloggers y empresas tuviesen una referencia al momento de adaptar sus sitios Web así como también ellos tener una referencia a la cual apegarse a la hora de determinar si un sitio cumplía con la ley o no.

Esta ley de cookies fue aprobada en el año 2012, pero ciertamente creo que éramos pocos los que sabíamos o habíamos empezado a acatar dicha legislación que si no me equivoco es a nivel europeo. Yo particularmente no estoy muy de acuerdo que se diga con dicha ley, de hecho considero que antes de multar empresas y personas e invertir dinero en toda una legislación que vigile su cumplimiento, etc.., preferiría que tales recursos se dedicaran a la educación del internauta para que conozca acerca de las cookies, o sea, me parece bien que se informe al usuario pero no con el hecho de ser tan riguroso hasta llegar al punto de multar (y mas en estos tiempos que corren) a la persona (jurídica y natural) dueña del sitio Web que no informe acerca de las cookies que guarda la página Web en los navegadores de los internautas.

Ha sido hasta este momento que por fin me he dignado a adaptar el sitio y buscar al respecto, y bueno comparto brevemente con ustedes lo que encontré que me ha resuelto el problema. Hay realmente varios pulgins en el sitio Web de WordPress.org pero los dos que les listare a continuación fueron los que mas me gustaron:

  • Ley cookie: Esta muy bien y es sencillo, pero aun esta en etapa de desarrollo, pero lo bueno es la disposición que tiene su creador en mejorarlo con ayuda de la comunidad.
  • Asesor de cookies para normativa española: Muy sencillo y sinceramente (hasta donde llega mi conocimiento en la materia) cumple con lo necesario y realmente hace todo y en menos de 5 min tuve el sitio ya adaptado para el cumplimiento de la ley de cookies. En un principio he dejado todo lo generado por defecto para a su vez hacer algo de justicia a su desarrollador y referencia al plugin entre otras cosas.

Ahora cuéntanos ¿ya tienes tu sitio Web de empresa o blog preparado para el cumplimiento de la ley de cookies?

Algo de información valiosa al respecto

http://www.davidrabaez.com/ley-de-cookies-5-puntos-a-tener-en-cuenta/