Translate

jueves, 10 de mayo de 2018

Apache Spark Streaming



Con el procesamiento de datos en streaming podemos analizar los datos en tiempo real, lo cual es muy útil en muchas situaciones. Apache Spark provee una librería para procesar streaming, que como no era necesarío un nombre difícil o original lo bautizaron Apache Spark Streaming.

El procesamiento de streaming se utiliza para analizar información que viene de sensores, iot, busquedas, logs de paginas web, el trafico a servidores, etc. Ejemplos de su uso podrian ser: monitorización de servidores o del comportamiento de usuarios en paginas web, etc.

Spark Streaming es una extensión de Apache Spark API y como ya digimos Apache Spark Streaming hace facil la creación de procesos tolerante a fallos para procesar información en tiempo real.

Desde la versión 2.0, Spark streaming soporta una nueva librería de streaming llamada 
Structured Streaming, el cual ofrece un procesamiento de streaming escalable y tolerante a fallos basado en Spark SQL. Podemos utilizar dataset and la Api de dataframe en Scala, Java, Python o R para escribir agregaciones de streamings. Structured Streaming provee un camino para el procesamiento sin que tengamos que razonar mucho sobre el procesamiento.

Spark Streaming funciona dividiendo la transmisión en pequeñas porciones de datos  (llamados micro-batches) en un intervalo predefinido (N segundos) y luego convierte cada micro-batch en un RDD. Nosotros podemos procesar estos RDD con las operaciones : map , reduce , reduceByKey , join , y window. Los resultados de estas operaciones RDD se devuelven en lotes. Por lo general, almacenamos estos resultados en un almacén de datos para un análisis posterior, para generar informes, o para enviar alertas basadas en eventos.

Es importante configurar correctamente el intervalo de tiempo para Spark Streaming, en función del caso de uso y los requisitos de procesamiento de datos. Si el valor de N es demasiado bajo, entonces los micropaquetes no tendrán suficientes datos para dar resultados significativos durante el análisis.

Los datos de streaming pueden ser procesados desde diferentes fuentes :
  • Kafka,
  • Flume,
  • Twitter,
  •  ZeroMQ,
  •  Amazon’s Kinesis, and
  •  TCP sockets
Otra ventaja de utilizar Apache Spark es que podemos combinar procesamiento batch con procesamiento streaming. También podemos utilizar otros subproyecto somo Spark mlib o graphX.


martes, 8 de mayo de 2018

UNION vs UNION ALL


Principalmente el problema es que ambos tienen funcionalidades distintas. El UNION y el UNION ALL parecen funcionar igual pero tienen una pequeña diferencia. El UNION descarta los resultados en común entre los dos SELECT, en cambio, el UNION ALL no hace ningún tipo de verificación.

Por este motivo, el UNION ALL es más eficiente que el UNION.

Si sabemos que las 2 consultas a unir no van a tener repetidos es buena práctica usar el UNION ALL

LAG y LEAD en Oracle

Tenemos que relacionar un registro con su anterior o su posterior en una sola sentencia y devolver ese registro también.

Estas dos funciones “LAG y LEAD” lo permiten sin tener que realizar una self join.

LAG() devuelve el valor de la anterior fila y LEAD() el valor de la siguiente fila.

SELECT DNI,
LEAD(DNI) OVER (ORDER BY DNI) POSTERIOR,
LAG(DNI) OVER (ORDER BY DNI) ANTERIOR
FROM PRUEBA;

DNI     POSTERIOR    ANTERIOR         
0001          0002                                 
0002          0003               0001             
0003          0004               0002             
0004          0005               0003             
0005          0006               0004             
0006          0007               0005

domingo, 6 de mayo de 2018

Probando Ubuntu Budgie 18

Salio Ubuntu 18, la versión más esperada de ubuntu. Ya son conocidos las nuevas propiedades del sistema operativo. Justo al empezar a usar el sistema te encontrarás con una nueva pantalla de bienvenida que te guiará por algunas de las novedades. Casi al final te presentará con algunas opciones de software que puedes instalar en un click.

A mi entender la mejor característica es la librería de aplicaciones snap. Podemos instalar con un solo click : Spotify, Slack, Skype, Telegram, Steam, y hasta el mismo tema de la comunidad que cambia la apariencia por una más moderna, pueden instalarse de la forma más sencilla posible.

Un sabor nuevo es Ubuntu Budgie que es una distribución oficial del proyecto Ubuntu, que utiliza el entorno de escritorio Budgie, basado en GNOME. Esta distribución ofrece una interfaz sencilla y fluida, que tiene un bajo consumo de recursos.

Y me sentí obligado a probarla:






Dejo video:


Dejo link: https://ubuntubudgie.org/

Ejemplo de Apache Spark Sql - parte 2

En el ejemplo anterior, el esquema se deduce utilizando reflexión. También podemos especificar mediante programación el esquema del dataset. Esto es útil cuando las clases personalizadas no se pueden definir con anticipación porque la estructura de los datos está codificada en una cadena.

El siguiente ejemplo de código muestra cómo especificar el esquema utilizando las clases de tipo de datos StructType, StringType y StructField.

//
// Programmatically Specifying the Schema
//
// Create SQLContext from the existing SparkContext.
val sqlContext = new org.apache.spark.sql.SQLContext(sc)

// Create an RDD
val rddCustomers = sc.textFile(“/home/emanuel/eje.csv”)

// The schema is encoded in a string
val schemaString = “customer_id name city state zip_code”

// Import Spark SQL data types and Row.
import org.apache.spark.sql._
import org.apache.spark.sql.types._;

// Generate the schema based on the string of schema
val schema = StructType(schemaString.split(“ “).map(fieldName => StructField(fieldName, StringType, true)))

// Convert records of the RDD (rddCustomers) to Rows.
val rowRDD = rddCustomers.map(_.split(“,”)).map(p => Row(p(0).trim,p(1),p(2),p(3),p(4)))

// Apply the schema to the RDD.
val dfCustomers = sqlContext.createDataFrame(rowRDD, schema)

// Register the DataFrames as a table.
dfCustomers.registerTempTable(“customers”)

// SQL statements can be run by using the sql methodsprovided by sqlContext.
val custNames = sqlContext.sql(“SELECT name FROM customers”)

// The results of SQL queries are DataFrames and support all the normal RDD operations.
// The columns of a row in the result can be accessed by ordinal.
custNames.map(t => “Name: “ + t(0)).collect().foreach(println)

// SQL statements can be run by using the sql methods provided by sqlContext.
val customersByCity = sqlContext.sql(“SELECT name,zip_code FROM customers ORDER BY zip_code”)

// The results of SQL queries are DataFrames and support all the normal RDD operations.
// The columns of a row in the result can be accessed by ordinal.
customersByCity.map(t => t(0) + “,” + t(1)).collect().
foreach(println)

También podemos cargar los datos de otras fuentes de datos como archivos de datos JSON, tablas Hive o incluso tablas de bases de datos relacionales que utilizan la fuente de datos JDBC.
Spark SQL proporciona una agradable interfaz SQL para interactuar con datos que se cargan desde diversas fuentes de datos, utilizando la conocida sintaxis de consulta SQL.
Esto es especialmente útil para miembros de proyectos no técnicos, como analistas de datos y DBA.

Ejemplo de Apache Spark Sql

Para este ejemplo, cargaremos datos de clientes de un archivo de texto y crearemos un objeto DataFrame a partir del conjunto de datos. Entonces podemos ejecutar las funciones de DataFrame como consultas específicas para seleccionar los datos.

Veamos el archivo customers.txt.

100,John Smith, Austin, TX, 78727
200,Joe Johnson, Dallas, TX, 75201
300,Bob Jones, Houston, TX, 77028
400,Andy Davis, San Antonio, TX, 78227
500,James Williams, Austin, TX, 78727

El siguiente código muestra los comandos Spark SQL que podemos ejecutar en la consola del shell Spark.

// Create the SQLContext first from the existing Spark Context
val sqlContext = new org.apache.spark.sql.SQLContext(sc)

// Import statement to implicitly convert an RDD to a DataFrame
import sqlContext.implicits._

// Create a custom class to represent the Customer
case class Customer(customer_id: Int, name: String, city: String, state: String, zip_code: String)

// Create a DataFrame of Customer objects from the data set text file.
val dfCustomers = sc.textFile(“/home/emanuel/eje.csv”).map(_.split(“,”)).map(p => Customer(p(0).trim.toInt, p(1), p(2), p(3), p(4))).toDF()

// Register DataFrame as a table.
dfCustomers.registerTempTable(“customers”)

// Display the content of DataFrame
dfCustomers.show()

// Print the DF schema
dfCustomers.printSchema()

// Select customer name column
dfCustomers.select(“name”).show()

// Select customer name and city columns
dfCustomers.select(“name”, “city”).show()

// Select a customer by id
dfCustomers.filter(dfCustomers(“customer_id”).equalTo(500)).show()

// Count the customers by zip code
dfCustomers.groupBy(“zip_code”).count().show()

Apache Spark Sql - JDBC Data Source


Spark sql contiene un origen de datos jdbc. Con él podemos leer una base de datos relacional. Este enfoque es preferible al uso de JdbcRDD porque el origen de datos devuelve los resultados como un DataFrame que puede procesarse en Spark SQL o mezclarse con datos de otras fuentes de datos.

Veamos un ejemplo:

import org.apache.spark.sql.SQLContext

val sqlContext = new org.apache.spark.sql.SQLContext(sc)

val url = "jdbc:mysql://127.0.0.1:3306/amarokdb"

val df = spark.read.format("jdbc").option("url", url).option("dbtable", "albums").option("user", "root").option("password","pass").load()

df.printSchema() // Looks the schema of this DataFrame.
df.show()
df.count()

jueves, 3 de mayo de 2018

Apache Spark Sql


Como habíamos dicho en un ambiente Spark SQL, los 2 componentes más importantes son el DataFrame y el SQLContext.

DataFrame: Un dataframe es una colección de datos distribuida organizada dentro de nombres de columnas. Esto basado en el concepto de dataframe del Lenguaje R y similar al concepto de tablas de las base de datos relacionales.

SchemaRDD, que se encuentra en versiones anteriores de Spark SQL API y se ha renombrado como DataFrame.

DataFrames puede ser convertido en un RDDs, por medio de un método de RDD, el RDD resultante tiene las filas del DataFrames.

Los DataFrames pueden ser creados dados los siguientes origenes de datos:

  • RDDs existentes
  • un archivo estructurado
  • un Json
  • una tabla HIVE
  • y una base de datos externa. 

Spark SQL y DataFrame APIs esta disponible en Scala, Java, Python y R. 

Además de DataFrame, Spark también proporciona la API Dataset. Un Dataset es una colección distribuida de datos similar a los RDD pero que utiliza un codificador para serializar los objetos. La API Dataset está disponible en Scala y Java. Spark SQL admite métodos para convertir RDD existentes en conjuntos de datos.

SQLContext: Spark SQL proporciona SQLContext para encapsular toda la funcionalidad relacional en Spark. Se crea el SQLContext a partir del SparkContext existente, veamos un ejemplo: 

val sqlContext = new org.apache.spark.sql.SQLContext(sc)

También hay HiveContext, que proporciona un superconjunto de la funcionalidad proporcionada por SQLContext. Se puede usar para escribir consultas usando el analizador HiveQL y para leer datos de tablas de Hive.

Notemos que no necesitamos un entorno Hive existente para usar HiveContext en los programas Spark.

miércoles, 2 de mayo de 2018

Lecciones aprendidas instalando Hadoop en un cluster

Instale un cluster de hadoop y tuve unos problemas, 2 para hacer exactos:


  • Use linux Ubuntu, y por algún motivo te pone como nombre de servidor en /etc/hosts el ip 127.0.1.1 eso trae muchos quilombos no se porque. Comenta la linea y listo
  • Y luego, tuve problema porque en tutorial, decia que tenia que poner los slaves (o esclavos) y el archivo se llamaba workers 


No se si hice bien, pero los puse en workers y anda.

Alguien tiene idea si esto cambio?

martes, 1 de mayo de 2018

Machine Learning Yearning


No me acuerdo cuando pero hice un curso de machine learning en coursera, bueno el profesor de este curso Andrew Ng esta sacando un libro. Por lo tanto ha compartido unos capítulos y los manda por mail.

Y yo quiero compartirlos con ustedes. 

Dejo los links:
https://gallery.mailchimp.com/dc3a7ef4d750c0abfc19202a3/files/0e40554e-8eae-416c-85dc-9bdaf433347a/Ng_MLY01.pdf
https://gallery.mailchimp.com/dc3a7ef4d750c0abfc19202a3/files/91f11a9a-09d8-475f-9cfa-6d0e98e17b5e/Ng_MLY02.pdf

domingo, 29 de abril de 2018

Los 5 lenguajes más odiados


Lei un articulo sobre los 5 lenguajes más odiados y en parte le doy la razon en parte no.

Los lenguajes son :

  1. Perl
  2. Delphi
  3. VBA
  4. Objective-C
  5. PHP
Voy a empezar con las criticas, primero Delphi no es un lenguaje de programación el lenguaje es object pascal, que como lenguaje no es tan malo, en realidad me resulta mejor que c++. 

Segundo, no se como han listado los lenguajes, porque hay muchos que son más odiables como COBOL o el lenguaje que usaba Clarion.  

Lo positivo es que coincido con casi todos, Perl es inhumano e inentendible, VBA y Objective-C nunca los pude aprender o programar decentemente. 

Pero banco a muerte a Object Pascal y a PHP. Me han dado de comer y pasamos ratos agradables juntos. En mi opinion, se podría hacer un lindo lenguaje totalmente orientado a objeto como Ruby o Scala inspirado en Object Pascal y la rompería. 

Como leerán esto es solo una opinión, y a ustedes que lenguaje no les gusta?

Azure Sphere, el sistema operativo de Microsoft con kernel Linux


A esta altura no me sorprende nada, ya el carton esta lleno. Microsoft presento un sistema operativo con kernel Linux, lo llama Azure Sphere y el objetivo principal es que sea un sistema operativo para internet de las cosas.

Según rumores el principal motivo de utilizar Linux es la seguridad. No existe nada más seguro que un kernel linux.

Dejo un video:


Dejo link: https://www.microsoft.com/en-us/azure-sphere/

jueves, 26 de abril de 2018

Google abre convocatoria para becas de investigación en Latinoamérica: Lara


Quiero hacerme eco de esta noticia. Por las dudas si un pichon de investigador me lee.

Google lanzó la quinta versión de su programa de becas de investigación para Latinoamérica.

El gigante de internet lanzó recientemente la quinta versión de su programa de becas Latin America Research Awards (Lara por sus siglas en inglés). Este programa tiene como objetivo principal solucionar algunos de los desafíos actuales a través de la tecnología.  La convocatoria estará abierta hasta el próximo 25 de mayo de 2018 y solo podrán participar las personas que actualmente sean estudiantes de maestría o doctorado en Latinoamérica, así como aquellos que se desempeñen como profesores o tutores.

Si te interesa, tenes que dejar de leer este blog y leer este :
https://latam.googleblog.com/2018/04/registrate-en-lara-2018-premios-de-investigacion-de-google-para-america-latina.html

Apache Spark Sql

Spark Sql es parte de Spark y permite consultar datos en Spark, utilizando un lenguaje estructurado similar a SQL. Podemos exportar datos a xml, json, etc.

Spark Sql nos permite consultar archivos batch, conjunto de datos Json o tablas Hive. Spark Sql trae características muy útiles y en las ultimas versiones ha agregado importantes mejoras en las que podemos nombrar:

DataFrames: es una abstracción que permite que funcione como SQL query engine distribuido.
Una Api de origen de datos (datasource) que permite conectarse con orígenes de datos de diferente estructura.
Un servidor JDBC que hace fácil conectarnos con base de datos relacionales y permite procesar datos de igual manera que una herramienta BI tradicional.

En un ambiente Spark SQL, los 2 componentes más importantes son el DataFrame y el SQLContext. Que los veremos en próximos posts!!

martes, 24 de abril de 2018

Eclipse Photon is coming...


Eclipse Photon, la decimoséptima versión anual del Proyecto Eclipse, se lanzará el 27 de junio de 2018, por lo visto trae varias mejoras. Entre las que podemos nombrar:


  • Mejoras gráficas y mejor soporte para temas oscuros (que estan de moda)
  • Mejor soporte a java 9 y 10. Por ejemplo, al crear un proyecto de Java 9 (o superior), ahora hay una opción para crear un archivo module-info.java.
  • Todas las rutas de archivos (incluidos los duplicados) se muestran en el cuadro de diálogo Abrir recurso.
  • Todos los archivos se actualizan automáticamente cuando se accede, sin intervención manual.

En fin muchos buenos cambios. Esperamos con ganas esta versión.

Dejo link: https://projects.eclipse.org/releases/photon