viernes, 22 de junio de 2018

Instalando un cluster de Cassandra


Ahora vamos a instalar varios nodos de Cassandra, 3 para ser exactos.

Ingredientes:

  • Muchos servidores (en este caso 3)
  • apache-cassandra-3.11.x 


Antes de empezar vamos a tener que instalar Cassandra en cada uno de los nodos como lo indicamos aquí. Y luego los nodos se pueden ver (debemos bajar firewall) o cualquier cosa que puede interferir en la comunicación.

Bajamos los nodos de Cassandra (en el caso que lo hayamos levantado). Ojo si subimos los nodos vamos a tener que borrar el contenido de las carpetas:

/data/data/system
/data/commitlog

Ahora debemos editar el archivo Cassandra.yaml que esta en conf :

cluster_name: El nombre del cluste (y si!)
seeds: acá le metemos los nombres o las ips de los servidores separados por coma.
listen_address: es la ip con que nuestro servidor se hace conocido, por defecto esta localhost, pero tenemos que poner la ip del servidor.
rpc_address: similar a listen_address, va la ip del servidor. Esta es la dirección IP para llamadas de procedimiento remoto.
endpoint_snitch: es el modo en que casandra se entera de los nuevos servidores o servidores caidos. Le debemos poner : GossipingPropertyFileSnitch
auto_bootstrap: Esta directiva no está en el archivo de configuración, por lo que debe agregarse y establecerse en falso. Esto hace que los nuevos nodos utilicen automáticamente los datos correctos. Es opcional si agrega nodos a un cluster existente, pero es necesario cuando está inicializando un cluster nuevo, es decir, uno sin datos.

Y listo!

Vamos levantando los nodos. Para probar el cluster utilizamos la herramienta nodetool de esta manera :

$ nodetool status
Datacenter: dc1
===============
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address        Load       Tokens       Owns (effective)  Host ID                               Rack
UN  192.168.0.105  190.31 KiB  256          64,9%             667fc687-3ef7-4470-af47-c72e328f33c8  rack1
UN  192.168.0.108  133.77 KiB  256          65,0%             72d61827-9b4b-415c-9fdc-43426452f087  rack1
UN  192.168.0.102  165.93 KiB  256          70,1%             f4d7357c-2bf5-4bd1-bae9-c63ab0a02c3f  rack1

Y si esto funciona, ya tenemos nuestro cluster.

miércoles, 20 de junio de 2018

Hacer un cliente Java que se conecte con Apache Cassandra.


Vamos a hacer un cliente java para conectarnos con Cassandra con Apache Maven.

Creemos un proyecto común con maven:

mvn -B archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=com.tuCompania.example -DartifactId=cassandra-client

De esta manera creamos el proyecto. Ahora necesitamos las librerías clientes de Cassandra, vamos a utilizar las que provee datastax, agregando la siguiente entrada en el pom.xml :

<dependency>
  <groupId>com.datastax.cassandra</groupId>
  <artifactId>cassandra-driver-core</artifactId>
  <version>3.5.0</version>
</dependency>

Y bueno, ahora hacemos:

mvn clean install

Y podemos escribir nuestro código:

package com.tuCompania.example;

import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.Row;
import com.datastax.driver.core.Session;

public class App
{
    public static void main( String[] args ) {

        Cluster cluster = null;
        try {
            cluster = Cluster.builder()
                    .addContactPoint("127.0.0.1") //ip de cassandra
                    .build();
            Session session = cluster.connect();

            ResultSet rs = session.execute("select release_version from system.local");
            Row row = rs.one();
            System.out.println(row.getString("release_version"));
        }finally {
            if (cluster != null) cluster.close();
        }

    }
}

Para conectarnos a Cassandra  necesitamos un cluster (dado que Cassandra fue pensado para correr en varios servidores) y con el cluster obtenemos una conexión y luego una sesión y con esta sesión podemos hacer una consulta (en el ejemplo consultamos la versión de Cassandra) y esto nos retorna un Resulset (que es similar a el Resultset de jdbc) y listo!

Machine Learning Yearning

Sigo publicando Machine Learning Yearning:

AI is the new electricity

Machine Learning Yearning

Dear friends,
What is the shared AI design pattern that is used to debug speech recognition systems, machine translation systems, and reinforcement learning systems?

There is a trick I had learned working on reinforcement learning for autonomous helicopter flight (fun videos here http://heli.stanford.edu) with my former PhD students Pieter Abbeel and Adam Coates, that turns out to be useful for improving all of these AI systems. Read on!
Read Chapters 44-46

Stanford's CS230 (Deep Learning) Project Posters Are Online

You can check out the posters from last week’s CS230 Deep Learning Poster Session here: https://cs230.stanford.edu/proj-spring-2018.html
While we’re on the subject of Stanford, here are a few pictures from the commencement ceremony on Sunday. Congrats to all the graduates!
Top secret: Most of us faculty can never remember whether the tassle on our caps goes on the left or right. We have an annual tradition of googling it at the last minute in the hopes of getting it right. Err, I mean left.  

Pun of the Week

I don’t watch much TV (Carol and I don’t even own a TV), but this is a station I would gladly tune in to!
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.

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/