domingo, 17 de junio de 2018

Apache Cassandra, una base consistente?

Habíamos dicho que cassandra era :

Apache Cassandra es una base de datos de código abierto, distribuida, descentralizada, elásticamente escalable, de alta disponibilidad, tolerante a fallas, tuneablemente consistente y orientada a filas que basa su diseño en Dynamo de Amazon y su modelo de datos en Bigtable de Google.
Creado en Facebook, ahora se usa en algunos de los sitios más populares en la Web.

Algo que talvez no se entiende es el termino tuneablemente consistente, es decir que podemos decirle que tan consistente queremos que sea, por medio de configuración. En realidad el clinte de la base le indica el nivel de consistencia.

Antes que nada definamos consistencia: la consistencia es la capacidad que tiene una base de retornar el mismo valor si es consultado 2 o más veces y este no ha sido modificado. Esta característica es innata en base de datos relacionales pero en bases distribuidas esto se vuelve más complejo. 

Tal vez no se entienda bien el problema, al ser una base distribuida pueden cambiar un dato y esto se debe sincronizar en todos los servidores haciendo que el guardado de datos algo lento.

La consistencia en una base de datos distribuida no es un tema fácil de abordar. Una técnica es aplicar los cambios por medio de tiempos o relojes, se lo puede ver como los cambios de GIT. De esta manera cada cambio es a un tiempo determinado y si alguien modifica un dato que fue modificado ese dato esta en conflicto y debemos solucionar el conflicto para poder aplicar el cambio.

Muchas veces hemos escuchado que Apache cassandra es "eventualmente consistente" eso significa que en algún momento puede ser consistente. Y esto en realidad no es tan así, dado que lo podemos configurar el nivel de concistencia.

La consistencia eventual es uno de varios modelos de consistencia disponibles para utilizar. Echemos un vistazo a estos modelos para que podamos entender las ventajas y desventajas:

  • Consistencia Estricta: Esto a veces se llama coherencia secuencial y es el nivel de consistencia más estricto. Requiere que cualquier lectura siempre devuelva el valor escrito más reciente. Pero como desventaja tenemos que coordinar los servidores para que todos tengan el mismo valor. La unica forma es tener un reloj global
  • Consistencia Casual: Esta es una forma ligeramente más débil de consistencia estricta. Elimina la fantasía del reloj global único que puede sincronizar mágicamente todas las operaciones sin crear un cuello de botella insoportable. En lugar de confiar en las marcas de tiempo, la coherencia causal toma un enfoque más semántico, intentando determinar la causa de los eventos para crear cierta consistencia en su orden. Significa que las escrituras potencialmente relacionadas deben leerse en secuencia. Si dos operaciones diferentes, no relacionadas, repentinamente escriben en el mismo campo, entonces se deduce que las escrituras no están causalmente relacionadas. Pero si una escritura ocurre después de otra, podríamos inferir que están causalmente relacionadas. La coherencia causal dicta que las escrituras causales deben leerse en secuencia.
  • Consistencia Eventual: La consistencia eventual significa que todas las actualizaciones se propagarán a través de todas las réplicas en un sistema distribuido, pero esto puede llevar algo de tiempo. Eventualmente, todas las réplicas serán consistentes.



jueves, 14 de junio de 2018

Machine Learning Yearning

Sigo publicando Machine Learning Yearning:

AI is the new electricity

Machine Learning Yearning

Dear friends,
Last week, we discussed what happens when your training set and dev/test set have different data distributions. How can you tell if your algorithm’s performance is not generalizing well to a different distribution than what it was trained on? We call this problem data mismatch.
This week, you’ll how learn to diagnose data mismatch, as opposed to bias and variance. Once you’ve identified it, you will also learn how to address data mismatch with techniques such as artificial data synthesis. Read on to learn more!
Read Chapters 40-43

In Case You Missed It: Stanford CS230 (Deep Learning) Poster Session

Stanford’s CS230 class had a total of ~800 students this past academic year (including 350 in the most recent offering). I think this is the fastest a class has grown from 0 to 800 students in Stanford history!
Saturday’s projects included applications from disease diagnosis to bitcoin prediction to a Pokémon HP predictor. If you are interested in reading about these student projects, we will be posting the posters online soon and will let you know when they’re up.

Pun of the Week

If you have a great AI pun, tweet it to me @AndrewYNg using #AIpun. I'll share my favorite in next week's email!

Catch up on Machine Learning Yearning

Miss last week's email?
Access all released chapters
Copyright © 2018 Andrew Ng, All rights reserved.
You are receiving this because you opted in to receiving emails about Andrew's upcoming book.

Our mailing address is:
Andrew Ng
353 Serra Mall
StanfordCA 94305

Add us to your address book


Want to change how you receive these emails?
You can update your preferences or unsubscribe from this list.

domingo, 10 de junio de 2018

¿Por qué Apache Cassandra?


Apache Cassandra es un sistema de almacenamiento de datos distribuido gratuito y de código abierto que difiere notablemente de los sistemas de administración de bases de datos relacionales (RDBMS).

Cassandra comenzó como un proyecto de incubadora en Apache en enero de 2009. Poco después, los committers, dirigidos por el Presidente del Proyecto Apache Cassandra, Jonathan Ellis, lanzaron la versión 0.3 de Cassandra, y desde entonces han liberado versiones constantemente.

Cassandra está siendo utilizado en producción por algunas de las compañías más grandes en la Web, incluyendo Facebook, Twitter y Netflix.

Su popularidad se debe en gran parte a las excelentes características técnicas que ofrece. Es duradero, perfectamente escalable y perfectamente consistente. Realiza escrituras increíblemente rápidas, puede almacenar cientos de terabytes de datos, y está descentralizado y simétrico, por lo que no existe un único punto de falla. Está altamente disponible y ofrece un modelo de datos basado en el Lenguaje de consulta de Cassandra (CQL).

miércoles, 6 de junio de 2018

Instalar Apache Cassandra en Linux con un nodo



Vamos a instalar Apache Cassandra en Linux, en este caso CentOs. Bueno, en realidad no lo vamos a instalar. Vamos a trabajar con la extracción de cassandra, ojo! tengo la jdk instalada :

yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel

$ java -version
openjdk version "1.8.0_171"
OpenJDK Runtime Environment (build 1.8.0_171-b10)
OpenJDK 64-Bit Server VM (build 25.171-b10, mixed mode)

Vamos a hacer un directorio:

mkdir cassandra
cd cassandra

Luego bajamos Apache Cassandra:

wget http://apache.dattatec.com/cassandra/3.11.2/apache-cassandra-3.11.2-bin.tar.gz

ahora vamos a extraer el tar: 

$ tar -zxf apache-cassandra-3.11.2-bin.tar.gz 

$ mv apache-cassandra-3.11.2 cassandra

ahora vamos a setear las variables de entorno: 

$ nano /home/app/.bash_profile

y agregamos : 

export CASSANDRA_HOME=<dir_de_casandra>/cassandra
export PATH=$PATH:$CASSANDRA_HOME/bin

Ahora vamos a correr a cassandra: 

$ cassandra

Y luego en otra consola vamos a ejecutar el cliente cqlsh

$ cqlsh
Connected to Test Cluster at 127.0.0.1:9042.
[cqlsh 5.0.1 | Cassandra 3.11.2 | CQL spec 3.4.4 | Native protocol v4]
Use HELP for help.
cqlsh> 

Y Listo!!

Ahora tenemos que ver que podemos hacer con esta base :S






martes, 5 de junio de 2018

Machine Learning Yearning

Sigo publicando Machine Learning Yearning:

AI is the new electricity

Machine Learning Yearning

Dear friends,
What happens when the data in your training set does not come from the same distribution as your dev/test set? We are acquiring larger and larger datasets to train our cat detectors...erm...learning algorithms.

Sometimes this means living with a training set whose distribution is different from the test set. When is this a good idea, and how can your algorithms still do well on the data distribution you care about? Read this week’s chapters to learn more!
Read Chapters 36-39

Pun of the Week

As CEO of an AI+Mental health company, my friend Alison Darcy over at Woebotreally liked this one:
If you have a great AI pun, tweet it to me @AndrewYNg using #AIpun. I'll share my favorite in next week's email!

Catch up on Machine Learning Yearning

Miss last week's email?
Access all released chapters
Copyright © 2018 Andrew Ng, All rights reserved.


Want to change how you receive these emails?
You can update your preferences or unsubscribe from this list.

Microsoft adquiere GitHub por $7.5 Billones de dolares



Creo que todo el mundo ya conoce la noticia pero bueno no quiero ser el único blog que no hable de esto.

Microsoft compro Github. Y que se yo... No se si es bueno o malo, no se pero creo que es una gran apuesta. Y apuesta de todos de los que tenemos repositorios de código ahí y de microsoft.

No soy de los que corren a gitlab, creo que vamos a tener que esperar. Tal vez es una buena noticia, microsoft nos ha desconcertado estos tiempos...

Dejo links:
https://www.infoq.com/news/2018/06/microsoft-acquire-github
https://www.clarin.com/tecnologia/microsoft-compra-github-plataforma-codigo-abierto-popular-mundo_0_ByBNVgmxX.html


domingo, 3 de junio de 2018

¿Qué es MongoDB?


MongoDB es una base de datos orientada a documentos de código abierto.

Facilita el desarrollo proveyendo alta performance, alta disponibilidad y fácil escalabilidad.

El motor almacena N cantidad de bases de datos, cada una de las cuales almacena un set de colecciones y cada colección almacena un set de documentos. Un documento es un par clave-valor.

Los documentos son dinámicos.

Un documento en MongoDB es un registro cuya estructura de datos se compone de pares clave-valor.

Estos documentos son similares a un objeto JSON.

El siguiente es un ejemplo de un documento:


A MongoDB document.



Los datos en MongoDB tienen un esquema flexible. Las colecciones en MongoDB no deben cumplir con una estructura definida, lo que facilita mapear un documento a una entidad u objeto.

El desafío a la hora de modelar datos está en balancear las necesidades de la App, las características de performance del motor de base de datos y los patrones de recuperación de datos.

La decisión sobre el diseño de los modelos de datos para MongoDB se resuelven alrededor de la estructura de los documentos y de cómo la App representa las relaciones entre los datos.

Existen dos herramientas que permiten a las Apps representar estas relaciones:

Referencias : Almacenan las relaciones entre los datos incluyendo links desde un documento a otro.
La Apps pueden resolver esas referencias accediendo a los datos relacionados.
En términos generales, estos son los modelos de datos normalizados.

Documentos Embebidos: Capturan las relaciones entre los datos almacenando la información relacionada en una única estructura documental.

Los documento en MongoDB hacen posible embeber estructuras en un campo o arrays dentro de un documento.

Este modelo de datos desnormalizado permite a las Apps obtener y manipular datos relacionados en una única operación.

Crecimiento del Documento: algunas actualizaciones sobre los documentos pueden incrementar el tamaño de los mismos. 

Atomicidad: Las operaciones son atómicas. Lo que significa que una operación no puede cambiar más de un documento. Operaciones que modifican más de un documento en una colección se ejecutan sobre un documento a la vez.

Sharding: MongoDB utiliza el sharding para proporcionar escalabilidad horizontal. Esto permite particionar una colección dentro de la base de datos para distribuir los documentos de una colección a través de una serie de instancias de MongoDB.

Índices:  Los índices son usados para mejorar la performance. Se pueden crear índices a partir de los campos de uso común dentro de las queries que se manejan en la App. Además MongoDB crea índices únicos para el campo _id.

Las Colecciones pueden contener un gran número de Documentos. De ser posible, hay que evitar que se dé esta condición por motivos de performance. Es aconsejable juntar estos objetos más pequeños mediante alguna lógica que los agrupe. De esta manera habrá pocas copias de los campos comunes y habrá pocas entradas claves para el correspondiente índice.

Optimización de Almacenamiento para pequeños Documentos: Cada documento en MongoDB contiene algún tipo de sobrecarga la cual es normalmente insignificante, pero se torna lo contrario si los documentos son pequeños (uno o dos campos máximo).

Dejo link: https://www.mongodb.com/






R en Spark


Podemos utilizar R en Spark.

Primero debemos instalar R, yo lo voy a instalar en ubuntu:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9

sudo add-apt-repository 'deb [arch=amd64,i386] https://cran.rstudio.com/bin/linux/ubuntu xenial/'

sudo apt-get update

sudo apt-get install r-base

sudo -i R

con este ultimo comando inicializamos R, ahora vamos a instalar txtplot para poder graficar en la consola.

install.packages('txtplot')

podemos probar esto con la siguiente linea:

library('txtplot')
txtplot(cars[,1], cars[,2], xlab = "speed", ylab = "distance")

Ahora salimos de r con q()

Nos ubicamos en el directorio bin de spark y ejecutamos

./sparkR

y si todo fue bien veras algo así:

Welcome to
    ____              __
   / __/__  ___ _____/ /__
  _\ \/ _ \/ _ `/ __/  '_/
 /___/ .__/\_,_/_/ /_/\_\   version  2.2.1
    /_/


 SparkSession available as 'spark'.

Y bueno, ahora a probarlo!!

podemos probar con el mismo codigo que probamos la instalación de r :

library('txtplot')
txtplot(cars[,1], cars[,2], xlab = "speed", ylab = "distance")

pero no vamos a estar utilizando la potencia de spark.

Vamos a leer un archivito que se llama customers.txt y tiene los siguientes datos:

$ cat 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

Que corresponden a la estructura:

customer_id: Int, name: String, city: String, state: String, zip_code: String


> csvPath <- “../../customers.txt”
> df <- read.df(csvPath, "csv", header = "false", inferSchema = "true", na.strings = "NA")
> df
SparkDataFrame[_c0:int, _c1:string, _c2:string, _c3:string, _c4:double]

Leímos el archivo como no tiene cabecera, los campos nos quedan como "_c0", "_c1" ... De igual manera para el ejemplo nos sirve.

Vamos contar cuentos clientes tenemos por zip y luego lo imprimimos :

> groupByZip <- summarize(groupBy(df, df$"_c4"), count = n(df$"_c4"))
>  head(groupByZip)
    _c4 count
1 75201     1
2 77028     1
3 78227     1
4 78727     2

Dejo link:
https://spark.apache.org/docs/latest/sparkr.html

sábado, 2 de junio de 2018

Entendiendo el plan de ejecución de una consulta SQL


Muchas veces tenemos problemas de performance y como unos campeones vamos a ver el plan de ejecución pero no entendemos nada :(

¿Qué debo buscar primero?

Todos los motores de bases de datos deberían indicar al menos dos cosas en el plan de ejecución sobre la consulta que estamos investigando:

  • Costo
  • Cantidad de registros

Es importante buscar el costo y la cantidad de registros en cada parte de la consulta porque nos va a dar una idea donde trabajar..

Depende de la herramienta que usen, es más fácil encontrar uno u otro, por ejemplo Oracle directamente en el EXPLAIN PLAN tenes la columna Cost y Rows.

En SQL Server, si vemos el plan de ejecución en el Management Studio podemos ver el Subtree Cost que es el acumulado de la tarea actual más todas las tareas anteriores que ejecutó (en esa rama). Además, el grosor de la flecha (viendo el plan gráficamente) muestra la cantidad de registros que se mueven en esa consulta.



¿Por qué hay un Sort en mi plan si no hago Order By en la query?

Usualmente esto puede suceder cuando el JOIN se resuelve con el algoritmo MERGE (o sort-merge join). En SQL Server se ve está manera:



El Sort es costoso cómo se ve, pero es peor que resolverlo con un “Loop”. Esto se soluciona con índices ya que con un índice, el ordenamiento es mucho más simple.

¿Que cosas NO deberían aparecer en el plan de ejecución?

En bases de datos relacionales (me refiero a las OLTP y no a los DW donde se hace adrede), no deberíamos jamás encontrarnos con un “Table Scan”. Si aparece un table scan, es porque esa tabla no tiene un Cluster Index (y probablemente tampoco una PK). Cuando las tablas no tienen un Cluster Index no se guardan de manera ordenada y por lo tanto, para hacer una búsqueda el motor se ve obligado a escanear la tabla entera.

¿La base está eligiendo el plan correcto?

Si pensas que existe la posibilidad de que la base no esté eligiendo el plan de ejecución correcto, es porque seguramente tenes que actualizar la estadísticas. No pretendan forzar a la base de datos a elegir un índice específico (aunque puedas hacerlo). Si la base no elige tu índice, seguro tiene un motivo.

Spark Streaming API

Spark Streaming viene con un conjunto de métodos que facilitan el procesamiento de datos. Hay operaciones que son compatibles con RDD como : map , flatMap ,filter , count , reduce , groupByKey , reduceByKey , sortByKey y join. A la vez provee un conjunto de métodos basados en ventanas y operaciones stateful como :  window , countByWindow , reduceByWindow , countByValueAndWindow , reduceByKeyAndWindow y updateStateByKey.

Spark streaming soporta a scala, java y python.

Vamos a ver los pasos típicos para hacer una aplicación con Spark Streaming:

El primer paso es generar el contexto el cual tiene 2 parámetros en el constructor. Uno es el contexto de spark (que lo tenemos) y el otro es el sliding-interval time, este intervalo es el intervalo en el cual los datos van a ser actualizados, es decir es estamos definiendo en que intervalo se van a buscar los datos. Una vez que se inicializa el contexto, no se pueden definir ni agregar nuevos cálculos al contexto existente. Además, solo un objeto StreamingContext puede estar activo en cualquier momento.

Luego tenemos que definir el origen de datos de entrada esto lo hacemos definiendo un DStream de entrada.

Teniendo el origen de datos definimos los cálculos que se realizarán en la entrada DStream utilizando la API de transformaciones Spark Streaming.

Después de definir la lógica de cómputo de transmisión, podemos comenzar a recibir los datos y procesarlos usando el método de inicio en el objeto StreamingContext.

Finalmente, esperamos que el proceso de transmisión de datos se detenga utilizando el método awaitTermination del objeto StreamingContext.


martes, 29 de mayo de 2018

Machine Learning Yearning

Sigo publicando Machine Learning Yearning:

AI is the new electricity

Machine Learning Yearning

Dear friends,
Learning algorithms are surpassing human-level performance in more and more areas, ranging from speech recognition to image recognition (in narrow domains). Competing against human-level performance has become a new sport in the deep learning world, but it is also a valuable endeavor for many businesses.

Why should you refer to human-level performance to speed up ML development? What happens when you surpass human-level performance? Read this week's chapters to find out!
Read Chapters 33-35

AI + X-rays: Enter the MURA Bone X-ray Deep Learning Competition!

For those of you looking for important ML applications to work on, my Stanford lab just released MURA, a large dataset of musculoskeletal X-rays. Applying deep learning to this dataset can advance diagnoses and improve healthcare in parts of the world where access to skilled radiologists is limited.

Enter our competition to see if your model can detect abnormalities in bone X-rays as well as a human radiologist! 
Join the deeplearning competition

Pun of the Week

If you have a great AI pun, tweet it to me @AndrewYNg using #AIpun. I'll share my favorite in next week's email!

Catch up on Machine Learning Yearning

Miss last week's email?
Access all released chapters
Copyright © 2018 Andrew Ng, All rights reserved.


Want to change how you receive these emails?
You can update your preferences or unsubscribe from this list.