Mostrando las entradas con la etiqueta Apache Hbase. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Apache Hbase. Mostrar todas las entradas

domingo, 31 de marzo de 2019

Apache Spark llega a Apache HBase con HBase-Spark


HBase-Spark  fue commiteado por primera vez a Github en julio de 2014. HBase-Spark  salió de una simple solicitud de clientes para tener un nivel de interacción entre HBase y Spark similar al ya disponible entre HBase y MapReduce. Aquí hay un breve resumen de la funcionalidad que brinda dicha librería:

Acceso completo a HBase:
  • Posibilidad de hacer una carga masiva.
  • Posibilidad de realizar operaciones masivas como put, get o delete
  • Posibilidad de ser una fuente de datos para motores SQL.

El enfoque que se le dio a la librería tiene los siguientes objetivos:
  • Hacer las conexiones HBase sin problemas.
  • Hacer la integración de Kerberos sin problemas.
  • Crear RDDs a través de acciones de escaneo o desde un RDD existente que se usando comandos Get.
  • Tomar cualquier RDD y permita que se realice cualquier combinación de operaciones HBase.
  • Proporcione métodos simples para operaciones comunes mientras permite operaciones avanzadas desconocidas sin restricciones a través de la API.
  • Soporte Scala y Java.
  • Soporta Spark y Spark Streaming con una API similar.
Estos objetivos llevaron a un diseño que tomó un par de notas de la API de GraphX en Spark. Por ejemplo, en HBase-Spark hay un objeto llamado HBaseContext. Esta clase tiene un constructor que toma la información de configuración de HBase y luego, una vez construida, le permite hacer un montón de operaciones en ella. Por ejemplo:
  • Crear RDD / DStream desde una Scaneo.
  • Poner / Eliminar el contenido de un RDD / DStream en HBase
  • Crear un RDD / DStream a partir de los contenidos de un RDD / DStream
  • Tomar el contenido de un RDD / DStream y realizar cualquier operación si se le entregó una HConnection en el proceso de trabajo.
La arquitectura básica aún se mantiene, ya que la parte central del código está diseñada para obtener un objeto de conexión HBase en cada Ejecutor Spark.

Veamos unos ejemplos por ejemplo como podemos hacer un bulk delete :

val hbaseContext = new HBaseContext(sc, config)
rdd.hbaseBulkDelete(hbaseContext,
                  TableName.valueOf(tableName),
                  putRecord => new Delete(putRecord),
                  4)

Aquí hay un ejemplo de una función de partición de mapa donde podemos obtener un objeto de conexión a medida que iteramos sobre nuestros valores:

val getRdd = rdd.hbaseMapPartitions(hbaseContext, (it, conn) => {
        val table = conn.getTable(TableName.valueOf("t1"))
        var res = mutable.MutableList[String]()
        ...
      })

MapPartitions funciona como map es decir toma un rdd y lo transforma en otro rdd.

Veamos un ejemplo completo donde guardamos los objetos con ids 1, 2, 3, 4, 5 :

// Nothing to see here just creating a SparkContext like you normally would
val sparkConf = new SparkConf().setAppName("HBaseBulkPutExample " + tableName + " " + columnFamily)
val sc = new SparkContext(sparkConf)

//This is making a RDD of
//(RowKey, columnFamily, columnQualifier, value)
val rdd = sc.parallelize(Array(
      (Bytes.toBytes("1"), Array((Bytes.toBytes(columnFamily), Bytes.toBytes("1"), Bytes.toBytes("1")))),
      (Bytes.toBytes("2"), Array((Bytes.toBytes(columnFamily), Bytes.toBytes("1"), Bytes.toBytes("2")))),
      (Bytes.toBytes("3"), Array((Bytes.toBytes(columnFamily), Bytes.toBytes("1"), Bytes.toBytes("3")))),
      (Bytes.toBytes("4"), Array((Bytes.toBytes(columnFamily), Bytes.toBytes("1"), Bytes.toBytes("4")))),
      (Bytes.toBytes("5"), Array((Bytes.toBytes(columnFamily), Bytes.toBytes("1"), Bytes.toBytes("5"))))
     )
    )

//Create the HBase config like you normally would  then
//Pass the HBase configs and SparkContext to the HBaseContext
val conf = HBaseConfiguration.create();
conf.addResource(new Path("/etc/hbase/conf/core-site.xml"));
conf.addResource(new Path("/etc/hbase/conf/hbase-site.xml"));
val hbaseContext = new HBaseContext(sc, conf);

//Now give the rdd, table name, and a function that will convert a RDD record to a put, and finally
// A flag if you want the puts to be batched
hbaseContext.bulkPut[(Array[Byte], Array[(Array[Byte], Array[Byte], Array[Byte])])](rdd,
    tableName,
    //This function is really important because it allows our source RDD to have data of any type
    // Also because puts are not serializable
    (putRecord) > {
      val put = new Put(putRecord._1)
      putRecord._2.foreach((putValue) > put.add(putValue._1, putValue._2, putValue._3))
       put
    },
    true);

Ahora, cada partición de ese RDD se ejecutará en paralelo (en diferentes subprocesos en un número de trabajadores de Spark en el clúster), algo así como lo que habría ocurrido si hiciéramos Puts en una tarea MapReduce.

Una cosa a tener en cuenta es que se aplican las mismas reglas cuando se trabaja con HBase de MapReduce o Spark en términos de rendimiento de Get y Put. Si tiene Puts que no están particionados, lo más probable es que se envíe un lote de Put a cada RegionServer, lo que dará como resultado menos registros por RegionServers por lote. La imagen a continuación ilustra cómo se vería esto con seis RegionServers:


Ahora veamos el mismo diagrama si utilizamos Spark para particionar primero antes de hablar con HBase.



miércoles, 27 de febrero de 2019

Modelo lógico de datos de Apache HBase

Vamos s revisar varios conceptos del modelo logico de datos de hbase. Como sabran Hbase no es una base de datos relacional, pero esta puede ser más flexible y escalable que las bases relacionales.

Hbase provee row keys, concepto que podemos mapear con las primary keys de las bases de datos relacionales. Nosotros podemos trabajar sin grandes operaciones de lectura y escritura, dado que las filas estan divididas en columns families y columnas. Esto soporta escalado vertical y horizontal de las tablas.

Una tabla esta compuesta por filas→ familias de columnas → columnas → celdas

Por lo tanto podemos pensar en una fila como un conjunto no vacio de familias de columnas, la familia de columnas como un conjunto no vacio de columnas y las columnas son estan formadas (made up) por celdas. Y los datos son accedidos por el row key.

Nosotros podemos o debemos consultar por row key más el column family y el nombre de la columna.


A nivel conceptual, las tablas de hbase vistas como un conjunto separado de filas pero a nivel fisico, se guardan conjuntos de columnas que son las familias de columnas.  

A nivel conceptual, una tabla HBase se puede ver como un conjunto disperso de filas, pero en el almacenamiento real, se almacena según una familia de columnas. Al definir una tabla, las columnas se pueden agregar o especificar en la ejecución en una familia de columnas. Debemos decidir el número y el nombre de la familia de columnas en el momento de la reactivación de la tabla, pero las columnas se pueden agregar según sea necesario en cualquier momento mientras se almacenan los datos, y esta es la belleza de la ausencia de esquemas cuando usamos HBase.

Una columna siempre se representa y se accede utilizando el nombre de la familia de columnas como prefijo (columnfamilyname: columnname) para que sepamos a qué familia de columnas se accede. Las columnas que no contienen valores no se almacenan. 

En las versiones anteriores de HBase, no teníamos un concepto de base de datos; sin embargo, existía el concepto de Tabla. La versión más reciente de HBase introduce un concepto llamado espacio de nombres (compatible con HBase 0.96 y versiones posteriores) que agrupa las tablas de forma lógica, lo que brinda una representación más estructurada y organizada, y un almacenamiento de tablas.




domingo, 24 de febrero de 2019

Relacional vs. HBase Schemas


No hay una asignación uno a uno de las bases de datos relacionales a HBase. En el diseño relacional, el enfoque y el esfuerzo están alrededor de describir la entidad y su interacción con otras entidades.

Pero con HBase, tiene un diseño de esquema de "consulta primero"; todas las posibles consultas deben identificarse primero, y el modelo de esquema debe diseñarse en consecuencia. Debes diseñar tu esquema HBase para aprovechar las fortalezas de HBase. Piense en sus patrones de acceso y diseñe su esquema para que los datos que se leen juntos se almacenen juntos. Recuerde que HBase está diseñado para agrupación. Por lo tanto tenemos que tener en cuenta estos 3 puntos a la hora de diseñar una estema hbase:


  • Los datos distribuidos se almacenan y se accede juntos.
  • Se centra en las consultas, así que concéntrese en cómo se leen los datos
  • Diseño para las consultas.


En una base de datos relacional, la normalización de el esquema tiene como beneficios:


  • No tiene que actualizar varias copias cuando se produce una actualización, lo que hace que las escrituras sean más rápidas.
  • Reduce el tamaño de almacenamiento al tener una sola copia en lugar de varias copias.
  • Sin embargo, esto provoca uniones o joins. Como los datos deben recuperarse de más tablas, las consultas pueden tardar más tiempo.

En un almacén de datos des-normalizado, almacena en una tabla lo que serían múltiples índices en un mundo relacional. La des-normalización puede considerarse como un reemplazo para las uniones. A menudo, con HBase, des-normaliza o duplica datos para que los datos se accedan y almacenen juntos.

Este es un ejemplo de desnormalización en HBase, si sus tablas existen en una relación de uno a varios, es posible modelarlo en HBase como una sola fila. Esto hace que las lecturas sean mucho más rápidas que unir tablas.

La clave de fila corresponde al ID de entidad principal, el Id. para HBase puede ser  una familia de columnas para los datos. Este tipo de diseño de esquema es apropiado cuando la única forma de acceder a las entidades secundarias es a través de la entidad principal.



lunes, 18 de febrero de 2019

Spark y HBase

Tuve que conectar una aplicación spark con hbase con scala y sbt y scalatra... etc...

primero vamos a ver a build.sbt : 

val ScalatraVersion = "2.6.3"

organization := "com.hexacta"

name := "Sparklatra"

version := "0.1.0-SNAPSHOT"

scalaVersion := "2.11.8"

resolvers += Classpaths.typesafeReleases
resolvers += "Cloudera Repository" at "https://repository.cloudera.com/content/repositories/releases/"
resolvers += "Cloudera Repository2" at "https://repository.cloudera.com/artifactory/cloudera-repos/"

libraryDependencies ++= Seq(
  "org.scalatra" %% "scalatra" % ScalatraVersion  ,
  "org.scalatra" %% "scalatra-scalatest" % ScalatraVersion % "test" ,
  "ch.qos.logback" % "logback-classic" % "1.2.3" % "runtime" ,
  "org.eclipse.jetty" % "jetty-webapp" % "9.4.9.v20180320" % "container" ,
  "javax.servlet" % "javax.servlet-api" % "3.1.0" % "provided"  ,
  "com.sun.jersey" % "jersey-core" % "1.19.4" ,
  "com.sun.jersey" % "jersey-server" % "1.19.4" ,
  "org.apache.spark" % "spark-core_2.11" % "2.3.1",
  "org.apache.spark" %% "spark-sql" % "2.3.1",
  "org.apache.spark" %% "spark-streaming" % "2.3.1" ,
  "org.apache.hbase" % "hbase-spark" % "2.1.0-cdh6.1.1" intransitive() ,
  "org.apache.hbase" % "hbase-server" % "2.1.0-cdh6.1.1"  intransitive() ,
  "org.apache.hbase" % "hbase-mapreduce" % "2.1.0-cdh6.1.1" intransitive() ,
  "org.apache.hbase" % "hbase-common" % "2.1.0" exclude("com.fasterxml.jackson.core", "jackson-databind"),
  "org.apache.hbase" % "hbase-client" % "2.1.0" exclude("com.fasterxml.jackson.core", "jackson-databind")
)

enablePlugins(SbtTwirl)
enablePlugins(ScalatraPlugin)

Ahora vamos hacer un ejemplito, de un metodo get que insertar y consultar : 

   get(s"/testSparkHbase/:key/:value") {
    val conf : Configuration = HBaseContext.getConf()
    // cree la tabla
    // create 'TableTest', 'info'
    // put 'TableTest', 'rowkey1', 'info:test', 'ejemplo'
    val connection = ConnectionFactory.createConnection(conf)

    val hbaseContext = new org.apache.hadoop.hbase.spark.HBaseContext(SparkContext.getSc, conf)

    val tableName = "TableTest"
    val columnFamily = "info"

    val rdd = SparkContext.getSc.parallelize(Array(
      (Bytes.toBytes(params("key")),
        Array((Bytes.toBytes(columnFamily), Bytes.toBytes("test"), Bytes.toBytes(params("value")))))))

    hbaseContext.bulkPut[(Array[Byte], Array[(Array[Byte], Array[Byte], Array[Byte])])](rdd,
      TableName.valueOf(tableName),
      (putRecord) => {
        val put = new Put(putRecord._1)
        putRecord._2.foreach((putValue) =>
          put.addColumn(putValue._1, putValue._2, putValue._3))
        put
      });

    Ok("ok")
  }

  get(s"/testSparkHbase/:key") {

    val conf : Configuration = HBaseContext.getConf()
    // cree la tabla
    // create 'TableTest', 'info'
    // put 'TableTest', 'rowkey1', 'info:test', 'ejemplo'
    val connection = ConnectionFactory.createConnection(conf)

    val hbaseContext = new org.apache.hadoop.hbase.spark.HBaseContext(SparkContext.getSc, conf)

    val tableName = "TableTest"
    val columnFamily = "info"

    val rdd = SparkContext.getSc.parallelize(Array(Bytes.toBytes(params("key"))))

    val getRdd = rdd.hbaseBulkGet[String](hbaseContext, TableName.valueOf(tableName), 2,
      record => {
        System.out.println("making Get"+ record.toString)
        new Get(record)
      },
      (result: Result) => {

        val it = result.listCells().iterator()
        val b = new StringBuilder

        b.append(Bytes.toString(result.getRow) + ":")

        while (it.hasNext) {
          val cell = it.next()
          val q = Bytes.toString(CellUtil.cloneQualifier(cell))
          if (q.equals("counter")) {
            b.append("(" + q + "," + Bytes.toLong(CellUtil.cloneValue(cell)) + ")")
          } else {
            b.append("(" + q + "," + Bytes.toString(CellUtil.cloneValue(cell)) + ")")
          }
        }
        b.toString()
      })

    getRdd.collect().foreach(v => println(v))

    var result = ListBuffer[String]()

    getRdd.collect().foreach(v => result += v)

    Ok(compact(render(result)))
  }

  }



miércoles, 19 de diciembre de 2018

Herramientas Open Source front-end para Apache HBase.

 Las herramientas open source que se pueden utilizar como clientes de Apache HBase son :

Hbaseexplorer: Es una herramienta gráfica para el acceso a datos almacenados en HBase que permite:
  • Visualización de datos.
  • Creación, eliminación y modificación de tablas y filas.
  • Tablas estaticas
  • Scans




Toad for Cloud Databases: Es una herramienta muy versátil para diferentes productos entre los que se encuentra hbase.

HareDB HBase Client: Es un cliente de Hbase que tiene una interfaz amigable.


Hrider: Es una aplicación super amigable que permite consultar y manipular datos de hbase.

Hannibal: Es una herramienta para monitoreo de regiones.

Performance Monitoring & Alerting (SPM): SPM es una herramienta de monitoreo, muy completa, tiene la filosofia de detección temprana de los problemas. A la vez permite monitorear una amplia gama de productos en los que podemos nombrar : Solr, Elasticsearch, Hadoop, HBase, ZooKeeper, Kafka, Storm, Redis, JVM, etc.

Apache Phoenix: Es un cliente embebido que permite consultas como si fuera un driver JDBC. Apache Phoenix permite OLTP y el análisis operativo en Hadoop para aplicaciones de baja latencia combinando lo mejor de ambos mundos: el poder de las API de SQL y JDBC estándar con capacidades de transacción ACID completa y
la flexibilidad de las capacidades de lectura y escritura de los últimos tiempos del mundo NoSQL aprovechando HBase como su tienda de respaldo; Apache Phoenix está totalmente integrado con otros productos de Hadoop como Spark, Hive, Pig, Flume y Map Reduce.

Apache Impala: Antes una herramienta de Cloudera, pero la han liberado en el marco de la organización apache. Impala es una herramienta de procesamiento de consultas en paralelo, utiliza map-reduce y se pueden hacer consultas a hbase o a archivos hdfs (como hive)

Apache Zeppelin: Notebook basado en la web que permite a los datos,
Análisis de datos interactivos y documentos de colaboración con SQL, Scala y más.

martes, 11 de diciembre de 2018

¿Como esta compuesto Apache HBase? Parte 4


En la ultima parte hablaremos de 2 componentes: Client y Catalog Table :

El Client es responsable de encontrar el RegionServer, que alberga la fila particular (datos). Se realiza consultando las tablas del catálogo. Una vez que se encuentra la región, el cliente se pone en contacto directamente con RegionServers y realiza la operación de datos. Una vez que se obtiene esta información, el cliente la almacena en caché para una recuperación más rápida. El cliente puede escribirse en Java o en cualquier otro lenguaje mediante API externas.

Las catalog tables son dos tablas que mantienen la información sobre todos los RegionServers y las regiones. Estas son un tipo de metadatos para el clúster HBase. Las siguientes son las dos tablas de catálogo que existen en HBase:

  • -ROOT-: Esto incluye información sobre la ubicación de la tabla .META. 
  • .META. : Esta tabla contiene todas las regiones y sus ubicaciones.

Al comienzo del proceso de inicio, la ubicación .META se establece en la raíz desde donde se leen los metadatos reales de las tablas y la lectura / escritura continúa. Por lo tanto, cada vez que un cliente desea conectarse a HBase y leer o escribir en la tabla, estas dos tablas se remiten y la información se devuelve al cliente para lectura directa y escritura en los RegionServers y las regiones de la tabla específica.

¿Como esta compuesto Apache HBase? Parte 3

Ahora hablaremos del RegionServer que con ese nombre suena importante.

De la misma manera que en clúster de Hadoop, un NameNode administra los metadatos y un DataNode mantiene los datos sin procesar. Del mismo modo, en HBase, un maestro HBase contiene los metadatos y los RegionServers los datos. Estos son los servidores que contienen los datos de HBase, ya que es posible que sepamos que en el clúster Hadoop, NameNode administra los metadatos y DataNode contiene los datos reales. Del mismo modo, en el clúster HBase, RegionServers almacena los datos reales sin procesar. Como puede suponer, un RegionServer se ejecuta o se aloja sobre un DataNode, que utiliza los DataNodes subyacentes en el sistema de archivos subyacente, es decir, HDFS.


RegionServer realiza las siguientes tareas:
• sirve las tablas asignadas a él
• Manejo de solicitudes de lectura / escritura del cliente
• Vaciar caché a HDFS
• Mantener HLogs
• Realizar compacciones.

Los siguientes son los componentes de RegionServers:

  • Registros de escritura anticipada o Write-Ahead logs (WAL):  Cuando los datos se leen / modifican a HBase, no se escriben directamente en el disco, sino que se guardan en la memoria durante un tiempo (umbral, que podemos configurar según el tamaño y el tiempo). Mantener estos datos en la memoria puede ocasionar una pérdida de datos si la máquina se apaga repentinamente. Entonces, para resolver esto, los datos se escriben primero en un archivo intermedio, que se denomina archivo de registro de escritura anticipada y luego en la memoria. Entonces, en el caso de una falla del sistema, los datos se pueden reconstruir usando este archivo de registro.
  • HFile: estos son los archivos reales donde los datos sin procesar se almacenan físicamente en el disco. Este es el archivo de la tienda real.
  • Store: Aquí se almacena el HFile. Corresponde a una familia de columnas para una tabla de HBase.
  • MemStore: este componente está en el almacén de datos de memoria; esto reside en la memoria principal y registra la operación de datos actual. Por lo tanto, cuando los datos se almacenan en WAL, RegionServers almacena el valor clave en el almacén de memoria.
  • Región: Estas son las divisiones de la tabla HBase; la tabla se divide en regiones según la clave y están alojados por RegionServers. Puede haber diferentes regiones en un RegionServer


viernes, 7 de diciembre de 2018

¿Como esta compuesto Apache HBase? Parte 2

Ahora hablaremos del HMaster. Pero antes les tengo que recordar que un cluster Hadoop y Hbase, esta concebido sobre el paradigma maestro y esclavo. Es decir hay un maestro que es el encargado de coordinar las tareas de los nodos esclavos.

HMaster es el componente del cluster HBase que se puede considerar como el nodo maestro a la vez, actúa como un maestro para los Servidores de Región que se ejecutan en diferentes máquinas. Es responsable de monitorear todos los RegionServers en un cluster HBase y también proporciona una interfaz para todos los metadatos de HBase para las operaciones cliente.

También maneja el failover de RegionServer y las divisiones de región. Puede haber más de una instancia de HMaster en un clúster HBase esto lo configuraremos así para tener alta disponibilidad. Si tenemos más de un maestro, solo un maestro está activo a la vez; en el momento de la puesta en marcha, todos los maestros compiten para convertirse en el maestro activo en el cluster. Un nodo maestro ganara y todas las demás instancias maestras permanecen pasivas hasta que el maestro activo se bloquea, se apage o ZooKeeper lo decida. En resumen, HMaster es un componente de coordinación en un cluster HBase, que también administra y nos permite realizar una tarea administrativa en el cluster.

Discutamos ahora que pasa cuando inicia el servidor HMaster:

  1. Se bloquea (no atiende solicitudes) hasta que se active HMaster.
  2. Finaliza la inicialización.
  3. Atiende peticiones.
  4. Limpia los registros al finalizar.
En HBase, hay una tabla llamada .META. (nombre de la tabla en el sistema de archivos), que conserva toda la información sobre las regiones a las que HMaster hace referencia para obtener información sobre los datos. De forma predeterminada, HMaster se ejecuta en el número de puerto 60000 y su interfaz de usuario web HTTP está disponible en el puerto 60010, que siempre se puede cambiar por medio de configuración. 

Resumiendo, HMaster es encargado de : 

  • Supervisa los servidores regionales
  • Maneja el failover de los servidores de región.
  • Maneja los cambios de metadatos.
  • Asignación / desasignación de regiones
  • Interfaces todos los cambios de metadatos
  • Realiza balanceo de recarga en tiempo de inactividad
  • Publica su ubicación al cliente utilizando ZooKeeper.
  • La interfaz de usuario web de HMaster proporciona toda la información sobre el clúster HBase (tabla, regiones, RegionServers y así sucesivamente)

¿Como esta compuesto Apache HBase?


Bueno, Apache HBase esta compuesto por :
  • ZooKeeper
  • Hmaster
  • RegionServer
  • Client
  • Catalog Table


Empecemos con ZooKeeper:
ZooKeeper es un sistema de coordinación para aplicaciones distribuidas. El cual provee una sincronización de recursos distribuidos y un grupo de servicios para HBase.

Esto permite centrarnos en la lógica del nuestro negocio y no en la coordinación de los clusters. Este tambien provee un conjunto de APIS que permiten entre otras cosas desarrollar tareas de coordinación.

En HBase, ZooKeeper es usado para elegir el master de un cluster para mantener que servidor esta disponible y meta-informcación del cluster.

ZooKeeper provee Apis para :

  • Consistencia, orden y durabilidad
  • Sincronización
  • Concurrencia para clusters distribuidos. 

Zookeeper fue desarrollado por yahoo research y su nombre esta relacionado con que se encuadra en el marco del proyecto Hadoop, el cual sus subproyectos son todos animales. Es decir ZooKeeper es el encargado de cuidar estos animales.
ZooKeeper no solo simplifica el desarrollo sino que también es una capa de abstracción que facilita la mejor accesibilidad a los componentes del sistema.
ZooKeeper mantiene un árbol con datos llamados internamente znode. Esto puede ser de dos tipos:

  • Efímero, que es bueno para las aplicaciones que necesitan entender si un recurso distribuido específico está disponible o no.
  • El persistente se almacenará hasta que un cliente no lo elimine explícitamente y también almacene algunos datos de la aplicación.
ZooKeepers se basan en un principio de mayoría (quorum); requiere que tengamos un quórum de servidores para estar activo, donde el quórum es  (n / 2) + 1, para un conjunto de tres nodos significa que dos nodos deben estar funcionando en cualquier momento, y para un conjunto de cinco nodos, un mínimo de tres nodos debe estar arriba. También es importante para la elección del maestro ZooKeeper. 



 

martes, 4 de diciembre de 2018

Arquitectura de Apache HBase y los árboles LSM


Apache HBase almacena el archivo utilizando el árbol LSM, pero que es un árbol LSM?

En ciencias de la computación, el árbol de combinación estructurado de registro (o árbol LSM) es una estructura de datos con características de rendimiento que lo hacen atractivo para proporcionar acceso indexado a archivos con un alto volumen de inserción, como los datos de registro transaccional. Los árboles LSM, al igual que otros árboles de búsqueda, mantienen pares clave-valor. Los árboles LSM mantienen los datos en dos o más estructuras separadas, cada una de las cuales está optimizada para su respectivo medio de almacenamiento subyacente; los datos se sincronizan entre las dos estructuras de manera eficiente, en lotes.

Una versión simple del árbol LSM es un árbol LSM de dos niveles. Como lo describe Patrick O'Neil, un árbol LSM de dos niveles comprende dos estructuras en forma de árbol, llamadas C0 y C1. C0 es más pequeño y reside totalmente en la memoria, mientras que C1 reside en el disco. Los nuevos registros se insertan en el componente C0 residente en la memoria. Si la inserción hace que el componente C0 exceda un cierto umbral de tamaño, un segmento contiguo de entradas se elimina de C0 y se combina en C1 en el disco. Las características de rendimiento de los árboles LSM se derivan del hecho de que cada componente está sintonizado con las características de su medio de almacenamiento subyacente, y de que los datos se migran eficientemente a través de medios en lotes sucesivos, utilizando un algoritmo que recuerda el ordenamiento de fusión.



La mayoría de los árboles LSM utilizados en la práctica emplean múltiples niveles. El nivel 0 se mantiene en la memoria principal y puede representarse mediante un árbol. Los datos en el disco se organizan en series ordenadas de datos. Cada ejecución contiene datos ordenados por la clave de índice. Una ejecución se puede representar en el disco como un solo archivo, o como una colección de archivos con rangos de claves que no se superponen. Para realizar una consulta en una clave en particular para obtener su valor asociado, se debe buscar en el árbol de nivel 0 y cada ejecución.

Una clave en particular puede aparecer en varias ejecuciones, y lo que eso significa para una consulta depende de la aplicación. Algunas aplicaciones simplemente quieren el par más reciente de clave-valor con una clave dada. Algunas aplicaciones deben combinar los valores de alguna manera para obtener el valor agregado adecuado para devolver. Por ejemplo, en Apache Cassandra, cada valor representa una fila en una base de datos, y las diferentes versiones de la fila pueden tener diferentes conjuntos de columnas.

Para mantener bajo el costo de las consultas, el sistema debe evitar una situación en la que haya demasiadas ejecuciones.

Volviendo a Hbase, Apache HBase almacena el archivo utilizando el árbol LSM, que mantiene los datos en dos partes separadas que están optimizadas para el almacenamiento subyacente. Este tipo de estructura de datos depende de dos estructuras, una actual y una más pequeña en la memoria y una más grande en el disco persistente, y una vez que la parte en la memoria se vuelve más grande que un cierto límite, se fusiona con la estructura más grande que se almacena en el disco que utiliza un algoritmo de clasificación de mezcla y un nuevo árbol en memoria se crea para las solicitudes de inserción más nuevas. Transforma el acceso aleatorio a los datos en un acceso secuencial a los datos, lo que mejora el rendimiento de lectura, y la fusión es un proceso en segundo plano, que no afecta el procesamiento en primer plano.

Ventajas y desventajas de una base de datos orientada a columnas

Cassandra y HBase son las base de datos orientadas a columnas más utilizadas en el software libre, para saber si aplican a mi proyecto debemos saber las ventajas y desventajas de las base de datos orientada a columnas:

Entre las ventajas tenemos:

  • Tiene tiene soporte incorporado para la compresión eficiente de datos.
  • Es compatible con la recuperación rápida de datos.
  • La administración y configuración simplificada. Es fácil escalar horizontalmente.
  • Es buena para hacer consultas con agreegación (SUM, COUNT, AVG, MIN, etc)
  • Es buena para particionar datos, se puede contar con varios datacenter distribuidos
Como desventajas tenemos:
  • No soporta joins o no esta optimizadas para esto. 
  • Puede ser difícil diseñar modelos eficientes, ya que no aplica el modelo relacional al que estamos acostumbrados. 
  • Registra y elimina muchas actualizaciones y tiene que realizar compactaciones frecuentes y también se divide. Esto reduce su eficiencia de almacenamiento.

domingo, 2 de diciembre de 2018

Bases de datos orientadas a filas vs orientadas a columnas



Notemos que bases de datos como HBase o Cassandra nos proponen un modelo basado en columnas mientras que nosotros venimos de un modelo basado en Filas. Por esa razón esta bueno confrontar estos modelos. 


Filas
Columnas
Es eficiente para agregar o modificar datos
Es eficiente para leer datos
Leen páginas que contienen filas enteras.
Sólo leen las columnas que es necesitan
Son las mejores para OLTP
No están tan optimizadas para OLTP todavía
Los datos de la fila se almacenan en páginas contiguas en la memoria o en el disco
Las columnas se almacenan en páginas en memoria o en disco.


Supongamos que los registros de una tabla se almacenan en las páginas o registros de la memoria. Cuando es necesario acceder a ellas, estas páginas se llevan a la memoria primaria, si aún no están presentes en la memoria.
Si una fila ocupa una página y necesitamos todas las columnas específicas, como el salario o la tasa de interés de todas las filas para algún tipo de análisis, cada página que contenga las columnas debe ingresarse en la memoria; por lo que esta página en la página de salida dará como resultado una gran cantidad de entradas y salidas, lo que puede resultar en un tiempo de procesamiento prolongado.
En las bases de datos orientadas a columnas, cada columna se almacenará en páginas. Si necesitamos recuperar una columna específica, habrá menos entradas y salidas, ya que solo las páginas que contienen la columna especificada deben incluirse en la memoria principal y leer, y no es necesario que aparezcan y lean todas las páginas que contienen filas / registros. De ahora en adelante en la memoria. Por lo tanto, el tipo de consultas en las que solo necesitamos obtener columnas específicas y no registros o conjuntos completos se realiza mejor en una base de datos orientada a columnas, lo que es útil para el análisis en el que podemos recuperar algunas columnas y realizar algunas operaciones matemáticas, como la suma y media.

martes, 27 de noviembre de 2018

Comparando HBase con una base de datos relacional



Base de datos relacional
Apache HBase
Escala de forma horizontal
Escala de forma vertical
Usa SQL para leer registros en la tabla
Usa una API y Mapreduce para resolver las consultas
Esta organizada en tablas donde cada fila tienen el mismo numero de columnas que todas las filas de la tabla.
Esta organizada en tablas pero cada fila puede tener un numero variable de columnas.
La cantidad de datos que se pueden guardar dependen de la capacidad de un server
La cantidad de datos que se pueden guardar dependen de la capacidad del cluster de servidores
Tiene un esquema restrictivo
Tiene un esquema flexible
Soporta ACID, es decir soporta transacciones
No soporta ACID, no soporta transacciones
Es ideal para datos estructurados
Es ideal para datos estructurados y no estructurados.
Centralizada
Distribuida
Soporta joins
No soporta joins
Soporta integridad referencial
No soporta integridad referencial





Por lo visto son cosas totalmente diferentes, pensadas para casos de uso diferentes. Por lo tanto lo peor que podemos hacer es tomar un problema que se resuelve con una base de datos relacional y tratar de utilizar HBase.

martes, 13 de noviembre de 2018

Apache HBase vs HDFS



Apache HBase esta ligada directamente con Hadoop, dado que funciona sobre el sistema de archivos HDFS. Dada esta relación HBase utiliza todas las ventajas y características de Hadoop. Es tolerante a fallos, utiliza map-reduce, distribuido, escala de forma horizontal, etc, etc.


Pero que ventajas tiene utilizar Apache HBase comparado con utilizar HDFS solo:


Hadoop/HDFS
HBase
Provee un file system distribuido. Provee un almacén de datos basado en columnas
Está optimizado para el almacenamiento de archivos de gran tamaño sin lectura/escritura aleatoria de estos archivos Esto está optimizado para datos tabulares con facilidad de lectura/escritura aleatoria
Utiliza archivos planos. Usa pares de datos clave-valor
El modelo de datos no es flexible. Esto utiliza almacenamiento tabular con soporte incorporado de Hadoop MapReduce
Está principalmente optimizado para escritura de una sola lectura Está optimizado para leer/escribir muchas veces

domingo, 11 de noviembre de 2018

Como se organiza una base Apache HBase?


Una tabla Apache HBase esta compuesta de filas, familia de columnas, columnas y celdas. La clave de fila es  única e identifica a la fila, familia de columnas son un grupo de columnas, la columna es un campo de la fila y la celda es el valor que tiene esa fila en esa columna determinada.

Características de Apache HBase


Apache HBase como habrán leído anteriormente es una base NoSql, la cual es orientada a columna.

Pero que características la hacen una base tan especial:

  • Balanceador de carga y recuperación de errores automático: HBase corre sobre el sistema de archivos de Hadoop, hdfs, el cual puede recuperarse dado a que cuenta con bloques de recuperación y servidores de replicación. 
  • Fragmentación automática: HBase maneja el concepto de región lo que permite tener replicaciones en una región determinada y compartir la información con dicha región. 
  • Integración con Hadoop: HBase corre sobre el sistema de archivos de Hadoop, por lo que cuenta con  una muy buena integración con el ecosistema Hadoop. 
  • Map-reduce: HBase utiliza Hadoop map-reduce framework para resolver problemas en paralelo. 
  • Java Api: los clientes java pueden utilizar toda la potencia de la jdk, ya que hbase fue escrito en java. 
  • Thrift o rest web services: HBase brinda 2 caminos para exponer funcionalidad una REST API o servicios Thrift
  • Soporta monitoreo: Igual que Hadoop, soporta software de monitoreo el cual nos indicara la salud de nuestra base de datos. 
  • Distribuida: Puede correr en varios servers. 
  • Escalabilidad lineal: es decir que podemos prever que va a crecer su performance agragando un servidor o cuanto cae si quitamos un servidor. 
  • Orientado a Columna: esto no es una ventaja es solo una característica. Pero quería hacer la lista larga. 
  • Soporta comandos de shell: Se puede administrar HBase totalmente desde una consola . 
  • Soporta versiones: soporta diferentes versiones, a la vez permite hacer snapshot, de versiones anteriores. A la vez soporta multilples versiones de un solo registro por medio de la snapshot que utiliza internamente


sábado, 27 de octubre de 2018

Quien usa Apache HBase y por qué?

Hbase es una base de datos escalable de forma horizontal, distribuida, open source y Mapa ordenado. La cual corre sobre el sistema de archivos HDFS. Hbase es una base de datos noSql, libre de esquema.

Pero quien usa Hbase y por que?


  • Adobe : Tienen alrededor de 30 nodos que ejecutan HDFS, Hadoop y HBase en grupos que van de 5 a 14 nodos tanto en producción como en desarrollo.
  • Yahoo! : Tienen un grupo de unos pocos nodos que ejecutan HDFS, MapReduce, y HBase. La tabla contiene millones de filas; lo utiliza para consultar documentos duplicados con tráfico en tiempo real.
  • Apache : para su Wiki
  • Facebook : Facebook usa HBase para alimentar su infraestructura de mensajes.
  • Mozilla : movieron el proyecto Socorro a Hbase.
  • Mendeley : Mendeley está creando una plataforma para que los investigadores colaboren y compartan sus investigaciones en línea. HBase nos está ayudando a crear la colección de documentos de investigación más grande del mundo y se está utilizando para almacenar todos nuestros datos importados sin procesar.
  • Twitter : Twitter ejecuta HBase en todo su clúster de Hadoop. HBase proporciona una copia de seguridad distribuida de lectura / escritura de todas las tablas mysql en el backend de producción de Twitter, lo que permite a los ingenieros ejecutar trabajos de MapReduce sobre los datos mientras se mantiene la capacidad de aplicar actualizaciones periódicas de filas (algo que es más difícil de hacer con el HDFS de vainilla).


Dejo link: http://hbase.apache.org/poweredbyhbase.html

domingo, 7 de octubre de 2018

Insertar datos en Apache HBase con Scala y Scalatra


Vamos hacer un ejemplo de una API Rest con scalatra que inserte datos en HBase.

Primero hacemos un proyecto en scalatra como ya hemos explicado:
https://emanuelpeg.blogspot.com/2018/08/haciendo-un-proyecto-con-scalatra.html

Luego agregamos las dependencias de hbase, en el archivo build.sbt agregando :

libraryDependencies ++= Seq(
  "org.apache.hbase" % "hbase-common" % "2.1.0" ,
  "org.apache.hbase" % "hbase-client" % "2.1.0"
)

Luego en la clase de ejemplo generamos el método get que inserta datos en la base hbase :

 get(s"/guardar/:rowKey/:str") {

    val conf : Configuration = HBaseConfiguration.create()
    // Se debe agregar en el archivo host el nombre de la base
    conf.set("hbase.zookeeper.quorum", "mybase")
    conf.set("hbase.zookeeper.property.clientPort", "2181")

    // seteamos los puertos de hbase.
    conf.set("hbase.master.port", "60000")
    conf.set("hbase.master.info.port", "60010")
    conf.set("hbase.regionserver.info.port", "60030")
    conf.set("hbase.regionserver.port", "60020")
    // cree la tabla
    // create 'TableTest', 'info'
    // put 'TableTest', 'rowkey1', 'info:test', 'ejemplo'
    val connection = ConnectionFactory.createConnection(conf)
    val table = connection.getTable(TableName.valueOf( "TableTest" ) )

    // Put example
    val put = new Put(Bytes.toBytes(params("rowKey")))
    put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("test"), Bytes.toBytes(params("str")))

    table.put(put)

    Ok("ok")
  }

}

El método inserta los datos pasados por parámetro en la URL. Donde pasamos una key y un dato. De esta manera insertamos datos en una tabla TableTest.

Algo importante que se puede ver es que seteo los puestos dado que en las ultimas versiones cambiaron de  600X0 a 160X0. Depende de la versión de Hbase, hay que usar uno u otro, yo estoy usando HBase de la maquina virtual de cloudera.

Y Listo!!



miércoles, 5 de septiembre de 2018

HBase, la base de datos distribuida de Hadoop


Apache HBase es una base de datos noSQL distribuida y escalable para almacenar grandes volúmenes de datos.

Algunas características:
  • Random Access.
  • Acceso en tiempo real
  • Datos distribuidos
  • Versionado de datos
  • No relacional
  • Basada en Bigtable de Google
Los datos se almacenan en tablas, compuestas por filas y columnas.

No se debe confundir con el modelo de tablas de una BD relacional, en cambio, se lo debe pensar como un mapa multidimensional.

  • Tabla: Consiste de múltiples filas.
  • Fila: Consiste de una clave y una o más columnas asociadas a la clave. Las filas se ordenan alfabéticamente por clave, por eso es importante un buen diseño de la clave.
  • Columna: Consiste de una familia y un índice (qualifier), delimitado por ‘:’
  • Familia: Agrupa datos que son físicamente almacenados juntos por razones de performance.
  • Identificador de columna: Se agrega a la familia de la columna para identificar un conjunto de datos.
  • Celda: Combinación de fila, familia de columna, índice. Contiene un valor y un timestamp.
  • Timestamp: Identifica la versión de un valor.

En el teorema CAP, Hbase esta ubicado en CP es decir que se preocupa por la consistencia. 

Es de la organización Apache por lo que tiene licenca Apache 2 y se distribuye de forma gratuita. 

domingo, 3 de septiembre de 2017

Que es Apache Kafka?

Apache Kafka se ha vuelto cada vez más popular, pero porque utilizar kafka?

Apache Kafka es generalmente utilizado en arquitecturas real-time que utilizan Stream de datos, para proporcionar análisis en tiempo real. Kafka es un sistema de mensajería publicación-suscripción rápido, escalable, duradero y tolerante a fallos.

Kafka se usa en casos de uso donde JMS, RabbitMQ y AMQP no pueden ni siquiera ser considerados debido al volumen y a la capacidad de respuesta. Kafka tiene mayor rendimiento, fiabilidad y características de replicación, lo que hace que sea aplicable para cosas como el seguimiento de las llamadas de servicio (rastrea cada llamada) o el seguimiento de los datos de sensores IoT donde una MOM tradicional puede no ser considerada.

Kafka puede trabajar con Flume / Flafka, Spark Streaming, Storm, HBase, Flink y Spark para la consumo, análisis y procesamiento en tiempo real de los datos de transmisión. Kafka es un flujo de datos utilizado para alimentar bases que utiliza Hadoop para análisis BigData. Además, Kafka Streaming (un subproyecto) se puede utilizar para análisis en tiempo real.

Kafka se utiliza para procesamiento de secuencias, seguimiento de actividades de sitios web, recopilación y monitoreo de métricas, agregación de registros, análisis en tiempo real, CEP, carga de datos en Spark, administración de datos en Hadoop, CQRS, computación en memoria (microservicios).

Kafka es una plataforma de streaming distribuida que se utiliza para sistemas stream publicar-suscribirse. Kafka se utiliza para el almacenamiento tolerante a fallos. Kafka replica particiones de registro de temas en varios servidores. Kafka está diseñado para permitir que tus aplicaciones procesen registros a medida que ocurren. Kafka es rápido y utiliza IO de forma eficiente mediante el batching y la compresión de registros. Kafka se utiliza para desacoplar flujos de datos. Kafka se utiliza para transmitir datos en lagos de datos, aplicaciones y sistemas de análisis de flujo en tiempo real.

Y para colmo es compatible para varios lenguajes como C#, Java, C, Python, Ruby (entre otros)...

Kafka permite construir en tiempo real de flujo de tuberías de datos. Kafka habilita micro-servicios en memoria (es decir actores, Akka, Baratine.io, QBit, reactores, reactivos, Vert.x, RxJava, Spring Reactor). Kafka le permite crear aplicaciones de streaming en tiempo real que reaccionan a los flujos para hacer análisis de datos en tiempo real, transformar, reaccionar, agregar, unir flujos de datos en tiempo real y realizar procesamiento de eventos complejos (CEP).

Puede utilizar Kafka para ayudar en la recopilación de métricas / KPIs, agregando estadísticas de muchas fuentes e implementando la generación de eventos. Puede utilizarlo con microservices (en memoria) y sistemas de actor para implementar servicios en memoria (log de confirmación externa para sistemas distribuidos).

Puede utilizar Kafka para replicar datos entre nodos, volver a sincronizar para nodos y restaurar estado. Aunque Kafka se utiliza principalmente para el análisis de datos en tiempo real y el procesamiento de secuencias, también puede utilizarse para la agregación de registros, mensajería, seguimiento de clics, pistas de auditoría y mucho más.

En un mundo donde la ciencia de los datos y el análisis es cada vez mas utilizado, la captura de datos para alimentar las bases de datos y sistemas de análisis en tiempo real también es un gran problema. Y aqu{i es donde Kafka se vuelve muy relevante.

Dejo link: https://dzone.com/articles/what-is-kafka?edition=316422&utm_source=Zone%20Newsletter&utm_medium=email&utm_campaign=big%20data%202017-08-17
https://kafka.apache.org/