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

Pronósticos para el 2018

Primer post del año 2018 y es un deber para mí empezarlo deseándoles a todos un 2018 de mucho provecho, salud y éxitos tanto en lo personal como en lo profesional. Dicho esto voy a dar paso a mis pronósticos que más que predicciones son intuiciones personales que sencillamente las haré publicas:

  1. Criptomonedas, es más que obvio que el auge que han tenido las criptomonedas encabezadas por la ya muy conocida BitCoin (BTC), pero esta no es la única, hay otras cuyos proyectos lucen interesantes, sin dejar de lado la popular tecnología que da soporte a la descentralización de estas, el blockchain o cadena de bloques que seguramente en los próximos años de el pelotazo. Siguiendo con las criptomonedas no esta de más decir que son un montón y cada vez sale un proyecto nuevo, tanto es así que el gobierno de Venezuela está preparando la emisión de una moneda llamada petro sustentada en sus reservas internacionales (¿bono de deuda enmascarado?), pero no es de esta moneda que les quiero hablar sino de otras sobre las que sugiero investigar y seguir de cerca: LiteCoin (LTC), IOTA, Ethereum (ETH) y SmartCash, no solo con fines económicos y utilizarlas para la inversión ya que todas han tenido una revalorización espectacular sino también como tecnologías y la hoja de ruta de cada una de estas. Ahora mismo la transacción de LiteCoin es mucho más rápida que la de un BitCoin (BTC), así como también lo es SmartCash que pronto comenzará a trabajar con sus SmartNodes lo cual implica ir un paso más allá en la velocidad de las transacciones que junto a su InstantPay la hará mucho mas atractiva para utilizarla en el comercio electrónico (sin dejar de mencionar su compromiso en proyectos dentro de la comunidad el cual alcanza el 70% de su presupuesto). No debemos olvidar a Ethereum que con sus smartContracts de igual manera abre un mundo nuevo de posibilidades y es una plataforma interesante para conocer la cadena de bloques y por última IOTA con su nuevo modelo de blockchain que desea ser el nuevo “esqueleto” del IoT (Internet of Things) donde entre sus objetivos están las transacciones a coste 0. Claro se habla mucho de las criptomonedas sobre si es una burbuja o el mal uso que le dan algunas personas, pero yo creo que estas han llegado para quedarse y aunque no soy un experto en la materia, creo que es necesario que estas empiecen a ser utilizadas como medios de pago común para que sean tomadas más en serio, pero también porque creo que hay gente que las compra pensando que otro le seguirá y por ende comprará mas caro, es decir, un fin que pareciese algo especulativo y yo soy de los que piensa que está muy bien guardar e invertir dinero pero tarde o temprano darle a este un fin.
  2. La nube, Desde hace 1 año me convertí en un enamorado de la nube, la flexibilidad y rapidez que nos aporta para el desarrollo de nuevos proyectos me parece una maravilla, prueba de esto es que hasta he migrado mi blog desde un hospedaje tradicional a la nube de Amazon. Existen varios proveedores como son AWS, Azure, GCP por solo mencionar algunos, pero lo que a mi parecer luce como una sana competencia está derivando en un muy interesante abanico de servicios y posibilidades para el usuario, para los emprendedores y para las PyMEs y creo que lo seguirán siendo este 2018 sobre todo con las tendencias serverless, microservicios (ojo a kubernetes) y servicios de inteligencia artificial.
  3. Big Data, pienso que seguirá siendo uno de los términos de moda este año, sobre todo porque el aprendizaje automático y los modelos predictivos, se sustentan en este, además creo que ha llegado para quedarse, porque cada día es mayor la cantidad de información que guardamos y pareciera que creciese de forma exponencial con los años, además la sinergia que crea al combinarse con la nube a mi modo de ver es un caballo ganador y en el futuro cuando ya entre en juego el analizar la información de los blockchains entonces si que será un trio que nos dará de que hablar por un buen tiempo.
  4. Por último creo que los lenguajes funcionales aún no han dicho su última palabra, entre estos creo que todavía veremos cosas interesantes. Actualmente hay lenguajes de uso general que han venido pegando fuerte como lo son Go, Python, Scala, pero creo que lenguajes como Haskell, Erlang, Clojure y Rust tendrán mas cabida y podremos ver cosas verdaderamente interesantes sobre todo en cuanto a concurrencia.

Dentro de 1 año revisaré este post y analizaré cuan acertado o errado estuve pero lo que realmente me llenará es haber podido dedicar este año al estudio de estas tecnologías.

¿Tienes algún pronostico tecnológico para este año? lo compartirías con nosotros

Mi receta para aprobar la certificación CCA Spark and Hadoop Developer

Hola de nuevo mi gente, como ya es costumbre tenía tiempo sin escribir, de hecho la última vez fue para anunciarles que había aprobado la certificación de solution architect de AWS y comentarles mi receta para aprobarla, bueno en esta ocasión les traigo mi receta para aprobar la certificación CCA Spark and Hadoop Developer (CCA175) de Cloudera. Bueno primero comentarles que esta certificación me resulto fascinante, por distintas cosas, la primera fue que tenía un completo desconocimiento sobre la forma como sería el examen, la segunda es que es totalmente práctica y el contenido dependiendo de como se mire puede ser amplio o no, de acuerdo a cuanto se desee profundizar.

Algunos aspectos del examen: tiene una duración de 2 horas, se aprueba con el 70% y pueden ser entre 8 y 12 preguntas (en mi caso fueron 9). El examen se lleva a cabo de forma online a través de un máquina virtual a la que accederás desde el navegador (chrome), de tu ordenador y será estrictamente necesario tener una webcam mediante la cual un vigilante (proctor) estará atento a que no hagas trampa, también tendrás a disposición una serie de enlaces de documentación referente a las herramientas que puedes utilizar en el examen, como pueden ser la documentación oficial de sqoop, spark, hive, cloudera, por mencionar algunas. En el examen no te veras obligado a utilizar una herramienta en especial, es decir, lo que importa es el resultado final, si este lo consigues con Pig, Hive, Spark, impala, Flume, pues perfecto, lo que esta claro es que hay herramientas que terminan siendo más adecuadas que otras dependiendo del caso.

Dada mi experiencia les sugiero estudiar los siguientes tópicos:

  • Importar y exportar usando sqoop y en ambos casos considerar el uso y cambio de delimitadores de campos así como de lineas. En el caso particular de la importación tener en cuenta compresión (por ejemplo Gzip) y formatos de archivo (texto, avro, parquet), a su vez conocer como y cuando utilizar los argumentos, -m, -split-by, -where, -query, -columns, -warehouse-dir, -target-dir, por mencionar algunos.
  • Crear una tabla en Hive cuya fuente de datos sean ficheros de texto, o que los datos estén serializados en Parquet, ORC o AVRO (tener en cuenta evolución del schema) y que a su vez estén comprimidos. CTAS (Create Table as Select) y exportar desde hive un fichero tanto a HDFS como al FileSystem producto de una consulta.
  • Haciendo uso de Spark hacer Lectura de datos en distintos formatos (texto, json, orc, parquet o avro) e incluso comprimidos y a partir de estos llevar a cabo una transformación de los datos y exportar el resultado a uno de los posibles formatos mencionados anteriormente.
  • La Máquina virtual trae consigo eclipse y sublime, les sugiero hacer scripts en sublime y guardarlos para poder volver a ellos en caso de ser necesario. En el caso de spark al yo tener más experiencia con scala lo que hice fue lanzar los scripts con la spark-shell con el siguiente comando spark-shell -i script.scala  o sino desde la consola usando :load script.scala.
  • En el caso de spark al ser la versión 1.6 preferí trabajar con dataframes a tener que hacer la operativa con RDDs.
  • Hacer muchos ejercicios, prácticos. En mi caso creé un repositorio en Github donde hice unos cuantos ejercicios, unos inventados por mí y otros del sitio web itversity.
  • Es importante hacer una buena gestión del tiempo, sugiero tomar un par de minutos para leer las preguntas e ir a por las más sencillas al comenzar y si en algún momento te bloqueas, pues pasar a la siguiente de inmediato, de igual forma mientras se esté ejecutando una operación (puede que tarde 1 min + o -) aprovechar para al menos leer el enunciado siguiente.
  • Muy importante mucho cuidado con los datos fuentes y de ser posible respaldarlos.
  • La consola de la máquina virtual tiene un tamaño de fuente algo pequeño por lo que no es mala idea hacer un zoom in.

Yo he de confesar que de las 9 preguntas que me salieron solo respondí 8, porque no me dio tiempo he allí la razón por la que hago hincapié en la buena gestión del tiempo. El examen no resulta difícil si has estudiado, pero al contar con solo 2 horas es necesario haber practicado antes para no perder mucho tiempo buscando en la documentación.

Por último desearles mucha suerte y reiterar mi fascinación con esta certificación, he aprendido muchísimo y el examen en sí me genero una sensación de satisfacción increíble al conseguir aprobarla, sobre todo esa buena vibra de poner en practica todo aquello practicado.

 

Mi receta para aprobar la AWS Certified Solutions Architect – Associate

Hacía casi un año de la última vez que escribí, de hecho he de confesar que hecho de menos compartir más cosas a través de este blog, pero ahora mismo el tiempo es algo que no me sobra y desde que me convertí en padre es que paso muchisimo tiempo con mi hija y como es normal disfruto más el pasar tiempo con mi hija y mi señora.

Volviendo a lo tecnologico, a finales del mes de Julio presente y aprobé una de las certificaciones de amazon especificamente la AWS Certified Solution Architect – Associate y me gustaría compartir con ustedes mi receta para tal logro.

  • El curso para la certificación de la gente de acloud guru y OJO este mismo curso esta disponible en Udemy y pueden llegar a conseguir ofertas para adquirirlo por tan solo 10€, más interesante aun es que al adquirir el curso por Udemy pueden efectuar una migración del curso hacia acloud.guru y de esta manera tendrán acceso al curso mediante las 2 plataformas y a sus respectivos foros. Otra cosa interesante es que el curso al tenerlo en Udemy pueden aprovechar de descargar la app para iPad y iPhone y visualizar los videos desde estos incluso en modo offline.
  • En linea con lo anterior paprticipar activamente así sea como lector en los foros, seguramente te encontrarás con las mismas dudas salvo que estas ya estarán resueltas.
  • Adquirir los examenes de prueba de la misma gente a través de Udemy y aunque no es imprescindible si recomiendo comprar la guia de preparación para los examenes de certificación de amazon de la gente de acloud.guru.
  • Hacer el examen de muestra de Amazon para esta certificación, esto te dará una idea bastante cercana sobre el tipo y el estilo de las preguntas a las que te enfrentarás en el examen. He aquí las respuestas.
  • Imprescindible revisar las F.A.Q. y limitantes de los servicios más importantes como S3, Glacier, IAM, SQS, SNS, EC2, API Gateway, AWS Lambda, VPC, CloudFront, Route53, CloudWatch, RDS, EMR y Kinesis.
  • Por (pe)último no dejar de revisar los papers como por ejemplo el referente a Well Architected Framework, sobre estos encontrarán preguntas sobre escenarios de la vida real donde deberíamos aplicar lo especificado en los papers, estos están disponibles para descargar como pdf desde el site de amazon e incluso para descargar en kindle.
  • Ahora si finalizando, no dejar de leer sobre las características del examen, este es un examen un poco pecualiar donde se aprueba/desaprueba a partir de 67% de acierto en las preguntas según tengo entendido se basa en una campana de Gauss, por lo cual buscar como objetivo obtener como mínimo un 70% de aprobación.

 

Aqui les dejo algunos enlaces a sitios con preguntas tipo examen:

http://recurze.be/2015/06/06/certified-solutions-architect-sample-questions/

http://www.accelerated-ideas.com/exams/practice-exam.aspx?group=aws&fq=1&qmax=15

https://blog.cloudthat.com/sample-questions-for-amazon-web-services-certified-solution-architect-certification-aws-architect-certification-part-i/

https://blog.cloudthat.com/sample-questions-for-amazon-web-services-certified-solution-architect-certification-aws-architect-certification-part-ii/

https://markosrendell.wordpress.com/2013/12/12/aws-certified-solutions-architect-sample-questions-answered-and-discussed/

https://quizlet.com/144321056/aws-certified-solutions-architect-associate-practice-questions-flash-cards/

No dejes de preguntar cualquier duda al respecto o incluso una vez hayas presentado deja aqui tus impresiones del examen y comparte con nosotros sobre que cosas preguntaron mas en el examen. Mucha suerte y exito por si te entusiasmas a presentar el examen.

 

 

Convertir fichero csv o tsv a parquet con apache Drill

Apache parquet es un formato de almacenamiento columnar para ecosistemas hadoop, independiente del framework de procesamiento de datos o del lenguaje de programación. Este es similar a otros formatos columnares como RCFile. Este formato provee una compresión eficiente y mejora el desempeño de las consultas. Parquet tiene 3 opciones para la compresión de sus ficheros y son snappy, gzip o ninguno, donde la opción seleccionada influye en el tamaño resultante de los ficheros y en el tiempo que tardará en convertir los ficheros al formato parquet.

Apache Drill tiene la capacidad de leer y escribir en formato parquet y lo demostraré en el siguiente ejemplo. Lo primero que haremos para poder realizar una comparación de uno de los beneficios de parquet (compresión) será utilizar un fichero tsv de un tamaño considerable.

Del sitio http://www.gdeltproject.org/data.html#rawdatafiles descargaremos un fichero zip que dentro de si contiene un TSV de  6,58 GB (el cual cambiaremos de extensión de TXT a tsv). Entonces basándonos en lo visto en el articulo anterior accederemos al fichero usando el plugin dfs. Si queremos darle un vistazo al fichero y sus campos podemos realizar la siguiente consulta:

Luego para comenzar con la conversión lo primero que haremos será modificar el formato de almacenamiento de apache drill, de la siguiente manera:

La sentencia anterior creará una tabla a la que accederemos utilizando la ruta especificada, será a su vez en esa ruta (en mi caso /tmp/data/parquet_example/) donde podremos observar el resultado de la conversión, un conjunto de ficheros en formato parquet que ahora en su totalidad suman unos 2,6 GB, disminuyendo el espacio ocupado en más de la mitad (el formato de compresión por defecto es snappy). En el caso de haber utilizado gzip la conversión hubiera durado un poco más pero en contraposición los ficheros resultantes ocuparían menor tamaño, en mi caso el resultado fue de 1,3 GB, es decir, apenas un 20% de lo que ocupa el tsv y lo único necesario para utilizar este formato de compresión es cambiar el formato antes de crear la tabla de la siguiente forma:

Una vez culminada la conversión ya podremos efectuar consultas sobre la tabla recién creada (en formato parquet)

drill-parquet-query

drill-parquet-query

Cómo conectar Apache Drill con MySQL

Hoy de nuevo les traigo a ustedes un post relacionado con Apache Drill. Como les comenté en el post anterior, apache drill funciona con plugins, donde en cada uno de estos se define como se establece la conexión. Por ende en este caso nosotros deberemos crear un plugin para conectarnos con MySQL. De nuevo utilizaremos el modo embebed de la herramienta por lo cual para iniciar deberemos ir a la carpeta bin dentro de la instalación de apache drill y ejecutar el archivo drill-embedded en el caso de aquellos que estén utilizando Windows deben ejecutar sqlline.bat.

Desde un navegador web nos vamos a la dirección

http://localhost:8047/storage

Ruta donde están los plugin de antemano definidos. Para crear nuestro nuevo plugin para conectarnos con MySQL nos iremos a la parte inferior y en el campo de texto le daremos el nombre del nuevo plugin a crear, en nuestro caso lo llamaremos mysql y pulsaremos el botón “Create”.

create plugin

create plugin

Inmediatamente después en el campo “Configuration” introducimos el siguiente json eliminando el null que trae por defecto y pulsamos el botón “Create”

donde:

username: será el nombre de usuario que utilizamos para conectarnos a MySQL.

password: será el password que utilizamos para conectarnos a MySQL.

url: El host y el puerto al que nos conectamos en MySQL.

configuración del plugin

configuración del plugin

El siguiente paso es colocar jar driver mysql en la ruta <drill_installation_directory>/jars/3rdparty

Hay un último paso a llevar a cabo en la configuración, para que la definición del plugin se mantenga una vez hayamos reinciado el ordenador o iniciado una nueva sesión con drill.

Editaremos el fichero <drill_installation_directory>/conf/drill-override.conf y especificaremos la ruta donde se almacenarán las configuraciones (definiciones) que hagamos de los plugins por ejemplo:

Una vez hecho esto si reiniciamos drill veremos en los storage el plugin de mysql. Por último para comprobar la definición del plugin solo necesitaremos efectuar una consulta por ejemplo utilizando el UI de apache drill de la forma:

SELECT * mysql.database_name.table_name

Al igual que con el post anterior una vez definido el plugin de mysql podremos efectuar consultas del tipo join que involucren una tabla en MySQL, un fichero CSV, un fichero JSON y otros.

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

Estadística simple con Spark V2

Sigo con mi pruebas con lo nuevo (y no tan nuevo de Spark 2), hoy comparto con ustedes una versión 2 de mi anterior post Estadística simple con Spark, pero en esta ocasión realizado con Spark 2.

¿Que tiene de nuevo esta versión?

Primeramente utiliza el módulo spark-csv lo cual nos hace más simple la carga del fichero en un Dataset. Segundo, que no manipulamos en ningún instante RDD alguno, sino que por el contrario estamos trabajando con DataFrames representados mediante la clase Dataset. Entre las cosas nuevas que contempla esta versión hecha en Spark 2 es que mientras antes al realizar un groupBy sobre un DataFrame esto nos devolvía un GroupedData ahora nos devuelve un RelationalGroupedData, esto debido a un cambio de nombre que se le ha dado a partir de esta nueva versión de Spark.

Esta nueva versión realizada con SparkSQL con Datasets tiene varias ventajas, la primera es simplicidad, es mucho mas simple, mas fácil de entender el código además de mas corto, de hecho con menos lineas obtuve más información que con la versión elaborada con RDD’s, es decir, es mas versátil. Por otro lado aunque hay que tener algo de nociones de conjuntos lo interesante es que esta versión esta libre de código SQL.

Sin más dilación he aquí el código y el enlace al proyecto en Github.

Para que comparen los resultados obtenidos aquí con respecto a la entrada anterior dejo un pantallazo de lo obtenido al ejecutarlo en mi local.

promedios por distrito

promedios por distrito

Otras agregaciones por distrito

Otras agregaciones por distrito

Total personas por distrito

Total personas por distrito

Enviar correo de GMAIL con Java

Este es otro post que quería compartir desde hace tiempo, entre otras cosas por su sencillez ya que en un proyecto anterior una solución de este tipo nos ayudó a resolver un problema puntual. Les pongo en contexto, debíamos desde nuestra empresa enviar una información que recabábamos diariamente, como es de suponer estábamos alejados fisicamente y en otra red y como no podía ser de otra forma no había permisos para por FTP o SSH hacer llegar la información, es por ello que dado las exigencias y con el poco tiempo que contábamos se nos ocurrió la idea “¿y si enviamos la información por email?”  y así hicimos, construimos un pequeño programa Java el cual se ejecutaba periódicamente para enviar unos ficheros adjuntos que sacábamos diariamente.

Primero que nada es necesario que desde la cuenta de GMAIL habilitemos el acceso de aplicaciones menos seguras. Para ello es necesario que ingresemos a nuestra cuenta de GMAIL y una vez dentro vayamos a la parte superior derecha donde este el icono de nuestra cuenta, hacemos clic en el icono y posteriormente al botón “Mi cuenta”. Allí veremos la siguiente imagen

mi cuenta de GMAIL

mi cuenta de GMAIL

Como vemos en la imagen de arriba (resaltado en rojo), debemos hacer clic en el apartado de “Inicio de sesión y seguridad”. Y allí nos desplazamos hasta la parte inferior y habilitamos/activamos la opción “Permitir el acceso de aplicaciones menos seguras”, como en la imagen de abajo.

habilitar acceso de aplicaciones menos seguras

habilitar acceso de aplicaciones menos seguras

Hecho esto, vamos al programa, el cual hace uso de Java Mail. El programa es bastante sencillo consta de un fichero de configuración del siguiente tipo:

gmail.account: La cuenta de GMAIL desde la cual enviaremos el correo electrónico.

gmail.password: El password de la cuenta de GMAIL desde la cual enviaremos el correo electrónico.

emaildestinations: Lista de direcciones de correo electrónico separadas por punto y coma (“;”) a donde será enviado el correo.

attachmentfiles: Lista de rutas donde están ubicados los ficheros a adjuntar separados por punto y coma (“;”).

A continuación el programa Java encargado del envío del correo electrónico.

El ejemplo es bastante sencillo, pero nos muestra como indicar el asunto del email, el texto del mensaje así como adjuntar ficheros. Espero que les pueda ser de utilidad. Aquí el enlace al proyecto en Github.

Primeros pasos con Apache Spark 2

Hace pocos días salió la esperada versión 2 de Apache Spark y como algunos de ustedes saben es un framework que ahora mismo atrae mucho mi atención y como no pudo ser de otra forma hice un pequeño proyecto donde quiero ir colocando ejemplos sencillos de Spark con las nuevas (y no tan nuevas) cosas de Spark.

Para empezar comentarles que yo todavía no he utilizado sbt sino por el contrario uso maven como herramienta de construcción de proyectos. He aquí los primeros cambios necesarios para trabajar con spark 2, las dependencias correspondientes a la versión (indicadas en el pom.xml).

Entre los nuevos cambios de spark está que el punto de entrada para los programas spark ya no serán el hiveContext o sqlContext sino que han sido subsumidas en una clase llamada SparkSession. Las clases HiveContext y SQLContext se han mantenido para proporcionar retrocompatibilidad. Ejemplo

Con el SparkSession haremos lo mismo que hacíamos con sqlContext por ejemplo obtener un Dataset

O por el contrario obtener un DataFrame

Otro punto importante ha sido la unificación de las clases Dataset y DataFrame (para Java y Scala) a partir de la versión 2.¿Qué significa esto? pues sencillamente que ahora solo existirá la clase Dataset, pero proporcionará la misma funcionalidad que nos daba la clase DataFrame, de hecho basta con comparar la API en la versión 1.6.2 y 2.0.0 y ver como los métodos de la clase DataFrame están ahora incluidos en la clase Dataset.

Dataset y Dataframe en Spark 2

Dataset y Dataframe en Spark 2

Aquellos interesados en leer más acerca de Dataset y Dataframe  visitar este link

Estos no son los únicos cambios en Spark, de hechos son muchos más, que se corresponden a optimizaciones a nivel de compilación y ejecución así como también a un nuevo parseador SQL, para leer mas acerca de lo nuevo en Spark 2 clic aquí.

Aqui les dejo en enlace al proyecto donde ire añadiendo clases y seguiré probando mas cosas nuevas de Spark.