Translate
miércoles, 27 de febrero de 2019
Modelo lógico de datos de Apache HBase
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.
jueves, 21 de febrero de 2019
Amazon Corretto
Amazon me esta sorprendiendo y para bien, ultimamente.
Amazon permite bajar su OpenJDK: Amazon Corretto. La cual no tiene costo, es multiplataforma y lista para producción.
Corretto viene con soporte a largo plazo que incluirá mejoras de rendimiento y correcciones de seguridad. Para el que no la conocía, Amazon ejecuta Corretto internamente en miles de servicios de producción y Corretto está certificado como compatible con el estándar Java SE. Con Corretto, puede desarrollar y ejecutar aplicaciones Java en sistemas operativos populares, incluidos Linux, Windows, macOS y hasta Docker.
Actualmente podemos bajar la version 8 o la preview de la 11 :
Installation Guides for Corretto 8
Installation Guides for Corretto 11 Preview
Dejo link: https://aws.amazon.com/corretto/
martes, 19 de febrero de 2019
AdoptOpenJDK
El código de Java es de código abierto y está disponible en la OpenJDK. AdoptOpenJDK proporciona binarios OpenJDK creados previamente a partir de un conjunto de código totalmente abierto de scripts de compilación e infraestructura.
Con AdoptOpenJDK podemos obtener imágenes de Docker en Docker Hub, con la open que necesitemos. A la vez podemos obtener las últimas versiones. Y se pueden obtener Nightly builds.
Las plataformas que son soportadas son:
Linux x64
jdk8u202-b08
Windows x32
jdk8u202-b08
Windows x64
jdk8u202-b08
macOS x64
jdk8u202-b08
Linux s390x
jdk8u202-b08
Linux ppc64le
jdk8u202-b08
Linux aarch64
jdk8u191-b12
Solaris sparcv9
jdk8u202-b08
AIX ppc64
jdk8u202-b08
Docker
Official Image
Dejo link: https://adoptopenjdk.net/releases.html
lunes, 18 de febrero de 2019
Apache ZooKeeper
Ya hablamos de Apache ZooKeeper varias veces, pero de costado. Es decir hablando de otros productos relacionados con el mundo hadoop, y a la vez hablamos de él. Y por que tantas veces tuvimos que hablar de este producto? porque este producto, como lo indica su nombre, se encarga de cuidar las bestias que son todos los productos hadoop.
ZooKeeper tiene integración con todos los productos, dado que es es encargado de monitoriar su trabajo. ZooKeeper es un servicio centralizado para mantener la información de configuración, asignar nombres, proporcionar sincronización distribuida y proporcionar servicios de grupo. Todos estos tipos de servicios son utilizados de una forma u otra por las aplicaciones distribuidas. Cada vez que se implementan, hay un montón de trabajo que consiste en solucionar estos problemas. Debido a la dificultad de implementar este tipo de servicios, al principio las aplicaciones generalmente los escatiman, lo que los hace frágiles este tipo de aplicaciones frente al cambio y difíciles de administrar. Incluso cuando se realizan correctamente, las diferentes implementaciones de estos servicios conducen a la complejidad de la administración cuando se implementan las aplicaciones.
ZooKeeper apunta a destilar la esencia de estos diferentes servicios en una interfaz muy simple a un servicio de coordinación centralizado. El servicio en sí es distribuido y altamente confiable. El servicio implementará los protocolos de consenso, administración de grupos y presencia para que las aplicaciones no tengan que implementarlas por su cuenta. Los usos específicos de la aplicación consistirán en una mezcla de componentes específicos de ZooKeeper y las convenciones específicas de la aplicación. ZooKeeper Recipes muestra cómo este simple servicio se puede usar para construir abstracciones mucho más poderosas.
Espero que este post les abra el apetito del conocimiento dado que vamos a analizar más este producto. Dejo link: https://zookeeper.apache.org/
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)))
}
}
Dejo el git: https://github.com/emanuelpeg/spark-scalatra
martes, 12 de febrero de 2019
Download Minibooks!
lunes, 11 de febrero de 2019
HackerRank Developer Skills Report
Quiero compartir esta encuesta hecha por hackerrank, lo que más me llamo la atención es que el lenguaje que esperan aprender este 2019 es Go, kotlin, python, etc...
Sin más que agregar, dejo link: https://research.hackerrank.com/developer-skills/2019
Sin más que agregar, dejo link: https://research.hackerrank.com/developer-skills/2019
miércoles, 6 de febrero de 2019
Libros de Java Code Geeks
|
Istio, control operativo sobre la malla de servicio
Las plataformas en la nube proporcionan una gran cantidad de beneficios para las organizaciones que los utilizan. Sin embargo, no se puede negar que la adopción de la nube puede poner tensiones en los equipos de DevOps. Los desarrolladores deben utilizar los microservicios para crear arquitecturas, mientras que los operadores están administrando implementaciones híbridas y de múltiples nubes extremadamente grandes. Istio le permite conectarse, asegurar, controlar y observar servicios.
A un alto nivel, Istio ayuda a reducir la complejidad de estas implementaciones y alivia la presión sobre los equipos de desarrollo. Es una malla de servicio de código completamente abierto que se distribuye de manera transparente en las aplicaciones distribuidas existentes. También es una plataforma, incluidas las API que le permiten integrarse en cualquier plataforma de registro, telemetría o sistema de políticas. El conjunto diverso de funciones de Istio le permite ejecutar una arquitectura de microservicio distribuida de manera exitosa y eficiente, y proporciona una manera uniforme de proteger, conectar y monitorear los microservicios.
Istio aborda los desafíos a los que se enfrentan los desarrolladores y operadores a medida que las aplicaciones monolíticas pasan a una arquitectura de microservicio distribuido.
El término malla de servicio se utiliza para describir la red de microservicios que conforman dichas aplicaciones y las interacciones entre ellas. A medida que la malla de servicios crece en tamaño y complejidad, puede ser más difícil de entender y administrar. Sus requisitos pueden incluir descubrimiento, equilibrio de carga, recuperación de fallas, métricas y monitoreo. Una malla de servicios a menudo también tiene requisitos operativos más complejos, como limitación de velocidad, control de acceso y autenticación de extremo a extremo.
Istio proporciona perspectivas de comportamiento y control operativo sobre la malla de servicios en su conjunto, ofreciendo una solución completa para satisfacer los diversos requisitos de las aplicaciones de microservicio.
Dejo link: https://github.com/istio/
domingo, 3 de febrero de 2019
Kubeflow
Kubeflow es una plataforma de código abierto nativa de Kubernetes para desarrollar, organizar, implementar y ejecutar cargas de trabajo de aprendizaje automático escalables y portátiles.
La construcción y capacitación de modelos son solo una pequeña parte de los flujos de trabajo de aprendizaje automático (ML). Otras cosas que debe abordar incluyen la transformación de datos a un formato determinado y la ubicación accesible de dichos datos; limpieza de datos e ingeniería de características; analizando tus modelos entrenados; gestión de versiones de modelos; sirviendo de manera escalable a tus modelos entrenados; y evitar el sesgo de entrenamiento. Este es particularmente el caso cuando los flujos de trabajo deben ser portátiles, repetibles y tienen muchas partes móviles que deben integrarse.
Además, la mayoría de estas actividades se repiten en múltiples flujos de trabajo, quizás solo con diferentes parametrizaciones. A menudo, está ejecutando un conjunto de experimentos que deben realizarse de manera auditable y repetible. A veces, parte o la totalidad de un flujo de trabajo de ML debe ejecutarse en las instalaciones, pero en otros contextos puede ser más productivo usar servicios en la nube administrados, lo que facilita la distribución y la ampliación de los pasos del flujo de trabajo y la ejecución de varios experimentos en paralelo. También tienden a ser más económicos para cargas de trabajo "reventadas".
La construcción de cualquier sistema ML listo para la producción involucra varios componentes, a menudo mezclando proveedores. Conectar y administrar estos servicios para configuraciones incluso moderadamente sofisticadas puede introducir barreras de complejidad. A menudo, las implementaciones están tan vinculadas a los clústeres que se han implementado que estas pilas están inmóviles, lo que significa que mover un modelo de una computadora portátil a un clúster de nube altamente escalable, o de un entorno de experimentación a un contexto listo para la producción, es efectivamente imposible Sin re-arquitectura significativa. Todas estas diferencias se suman a un esfuerzo inútil y crean oportunidades para introducir errores en cada transición.
Kubeflow ayuda a abordar estas preocupaciones. Es una plataforma de código abierto nativa de Kubernetes para desarrollar, organizar, implementar y ejecutar cargas de trabajo ML escalables y portátiles. Ayuda a la reproducibilidad y la colaboración en los ciclos de vida del flujo de trabajo de ML, lo que le permite administrar la orquestación de punto a punto de las tuberías de ML, para ejecutar su flujo de trabajo en entornos híbridos o múltiples (como el intercambio entre los bloques de construcción locales y de la nube, según el contexto). ), y para ayudarlo a reutilizar bloques de construcción en diferentes flujos de trabajo. Kubeflow también proporciona soporte para visualización y colaboración en su flujo de trabajo ML.
Kubeflow Pipelines es un componente recientemente agregado de Kubeflow que puede ayudarnos a componer, implementar y administrar flujos de trabajo ML, de manera opcional, híbridos de extremo a extremo. Debido a que Pipelines es parte de Kubeflow, no hay bloqueo en la transición desde la creación de prototipos a la producción. Kubeflow Pipelines admite la experimentación rápida y confiable, con una interfaz que facilita el desarrollo en un portátil Jupyter, por lo que puede probar muchas técnicas de ML para identificar qué funciona mejor para su aplicación.
Hay muchas ventajas al construir una pila de ML sobre Kubernetes. No es necesario volver a implementar los fundamentos que se requerirían para dicho grupo, como el soporte para la replicación, las revisiones de estado y la supervisión. Kubernetes admite la capacidad de generar especificaciones declarativas sólidas y crear definiciones de recursos personalizadas adaptadas para ML. Por ejemplo, TFJob de Kubeflow es un recurso personalizado que facilita la ejecución de trabajos de capacitación distribuidos de TensorFlow en Kubernetes.
Kubernetes ofrece la escalabilidad, la portabilidad y la reproducibilidad requeridas para el soporte de flujos y experimentos de ML consistentemente ejecutados. Ayuda a crear y componer pasos de flujo de trabajo reutilizables y bloques de construcción de ML y facilita la ejecución de los mismos flujos de trabajo en diferentes clústeres a medida que pasan del prototipo a la producción o se mueven de un clúster local a la nube.
Dejo link:
https://github.com/kubeflow/kubeflow
https://www.kubeflow.org/
Suscribirse a:
Entradas (Atom)