miércoles, 14 de febrero de 2018

BIGDATA - KAFKA - Introducción y Comandos Básicos para Topics

1.       INTRODUCCIÓN

Kafka es un sistema de mensajería (Publish-Subscribe) de alto rendimiento, escalable y tolerante a fallos diseñado para ingerir datos a gran velocidad.


1.1.    Conceptos



  •         Kafka mantiene los mensajes en categorías llamadas Topics.
  • ·      Los productores publican mensajes en un Topic Kafka.
  • ·      Los consumidores se suscriben a los Topics y reciben los mensajes publicados en estos Topics.
  • ·      Kafka se ejecuta como un cluster de uno o más servidores, cada una de los cuales se llama Broker.


1.2.    Estilo de Mensajería

Los sistemas de mensajería tradicionales tienen 2 modelos: Queues (P2P) y Topics (Publish-Suscribe).

En una cola (Queue) cada mensaje va a un consumidor, mientras que en un Tópico (Topic) se hace emite cada mensaje a todos los consumidores (broadcast).

Kafka ofrece una abstracción que permite contemplar ambos modelos: 

El 'Consumer group':
Los consumidores se identifican con un identificador de grupo de consumidores o 'Consumer Group ID', cada mensaje publicado a un Topic en Kafka es enviado a una única instancia dentro del mismo grupo. Esto implica que puede existir varios consumidores de un mismo grupo ejecutándose en paralelo y subscritos al mismo Tópico, sin que se procese un mismo mensaje a la vez por dos o más consumidores, lo que permite un procesamiento más rápido de los mensajes enviados a Kafka (crecimiento horizontal).

De este modo si todas las instancias de consumidores tienen el mismo Id. de Grupo funciona como un Sistema de Colas (Queue), mientras que si cada instancia tiene un Id. de Grupo distinto funciona como un Sistema Publish-Suscribe.

1.3.    Anatomía de Tópicos: Particiones


·        En Kafka los Tópicos se organizan en particiones, que son secuencias de mensajes ordenados e inmutables. Los mensajes en una partición tienen asignado un número secuencial llamado 'offset' que identifica cada mensaje en una partición (esto permite que el rendimiento sea constante).


·        Las particiones se distribuyen sobre los servidores del clúster Kafka, de modo que cada Servidor se encarga de manejar los datos y peticiones a una parte de las particiones.
·        
      Las particiones se replican a un número configurable de servidores para tolerancia a fallos (recomendado 3 mínimo).

·        Las particiones permiten que el tamaño de un Tópico sea mayor que la capacidad de un Servidor, cada partición individual debe caber en el servidor que lo almacena, pero un tópico está formado por varias particiones.
·   
      Cada partición tiene un Servidor que actúa como Líder (leader) y servidores que actúan como Seguidores (followers).
·    
      El leader maneja todas las peticiones de lectura y escritura para una partición mientras que los followers replican al leader pasivamente.
·    
      Si el líder falla uno de los seguidores automáticamente se convierte en el nuevo líder.
·    
      Cada Servidor actúa como líder para algunas de las particiones y como seguidor para otras de modo que  la carga se balancea correctamente en el clúster.
·    
      El clúster Kafka mantiene todos los datos publicados (sean consumidos o no) por un tiempo configurable.

1.4.    Sincronización entre Clusters

Un Cluster Kafka no está pensado para estar distribuido entre datacenters, el soporte para escenarios multi-datacenter en Kafka se da a través del mirroring entre clusters.
Esta característica permite que el cluster mirror actúe como consumidor del cluster fuente.


2.       Mantenimiento y comandos para Topics

Es necesario saber la ruta del zookeeper de kafka que se define al añadir el módulo de kafka en Cloudera o la solución BigData que se esté utilizando. Supongamos que la ruta relativa definida es: /kafka
y que se esté usando el puesto por defecto: 2181. En caso contrario habrá que poner los valores correspondientes.

2.1.    Crear un Topic

kafka-topics --create --zookeeper [ZOOKEEPER-HOST]:2181/kafka --replication-factor 2 --partitions 2 --topic [TOPIC_NAME]

2.2.    Modificar un Topic

kafka-topics --zookeeper [ZOOKEEPER-HOST]:2181/kafka --alter --partitions 4 --topic [TOPIC_NAME]


2.3.    Eliminar un Topic

kafka-topics --delete --zookeeper [ZOOKEEPER-HOST]:2181/kafka --topic [TOPIC_NAME]

Si el topic se queda como marcado para eliminación. Para eliminarlo por completo hay que hacer lo siguiente :

1.  Parar los brokers de kafka.
2.   Borrar los datos de topics del disco, normalmente están en la carpeta siguiente (hay que eliminar lo que corresponda a nuestro topic):
a.    /var/local/kafka/data
3.   Ó Borrar los topics de zookeeper, para ello:
a.    Ejecutar : zookeeper-shell.sh [ZOOKEEPER-HOST]:2181/kafka)
   El comando debe estar en una ruta asimilar a la siguiente:
       /opt/cloudera/parcels/KAFKA-2.2.0-1.2.2.0.p0.68/lib/kafka/bin/
b.    Borrar los topics de la siquiente ruta:  
      rmr /kafka/brokers/topics/[TOPIC_NAME]  ó  /brokers/topics/[TOPIC_NAME]
c.    Comprobar y borrar también los directorios: 
         /kafka/config/topics/[TOPIC_NAME] ó /config/topics/[TOPIC_NAME]
         /kafka/admin/delete_topics/[TOPIC_NAME] ó /admin/delete_topics/[TOPIC_NAME]
d.    Comprobar con :   ls [RUTA]

2.4.    Listar Topics

kafka-topics --list --zookeeper [ZOOKEEPER-HOST]:2181/kafka

2.5.    Enviar mensajes a un Topic

kafka-console-producer --broker-list [SERVER1:9092,SERVER2:9092,...] 
--topic [TOPIC_NAME]

>Mensaje1
>Mensaje2
>Crtl^C (salir)

Esto nos permitirá enviar mensajes de prueba para probar nuestros consumidores.

2.6.    Recibir mensajes de un Topic

kafka-console-consumer --zookeeper [ZOOKEEPER-HOST]:2181/kafka --topic [TOPIC_NAME] [--from-beginning]

Mensaje1
Mensaje2

2.7.    Consultar descripción de un topic

kafka-topics --describe --zookeeper [ZOOKEEPER-HOST]:2181/kafka --topic [TOPIC_NAME]

 

2.8.    Consultar lista de brokers

zookeeper-shell.sh [zookeeper_address] <<< "ls /brokers/ids" 


2.9.    Eliminar mesanjes de un Topic de Kafka

kafka-topics --zookeeper [zookeeper_address] --alter --topic [TOPIC_NAME] --config retention.ms=1000
kafka-topics --zookeeper [zookeeper_address] --alter --topic [TOPIC_NAME] --delete-config retention.ms



miércoles, 10 de septiembre de 2014

Mi primera aplicación Android en Google Play Store

Acaban de publicar mi primera aplicación implementada para móviles Android, es una aplicación sencilla que permite acceder en la web de compras ecológicas http://www.cerroviejo.org y guardar los datos de acceso, pero por algo hay que empezar:



Cerro Viejo en Google Play

lunes, 11 de agosto de 2014

Formato de filas alternativas en Hoja de Cálculo de Google Docs


Conseguir un formato de filas alternativas en las Hojas de Cálculo de Google Docs es bastante sencillo, aunque yo no encontré información al respecto y tuve que investigar un poco entre las funciones que proporciona. Entre ellas está ISEVEN(#VALOR), que comprueba si el número que se le pasa es PAR.

Para conseguir, por ejemplo, un color de fila alternativo, basta con seguir los siguientes pasos:
  1. Seleccionar las celdas o filas que queramos formatear.
  2. Seleccionar Color de Relleno -> Formato Condicional.
  3. El valor condicional debe ser:
    • La fórmula personalizada es:      =ISEVEN(ROW())
  4. Seleccionar formato de Texto y/o de Fondo para las filas pares.
Para hacer lo mismo, para filas impares, solo hay que negar la función anterior o sumarle 1 al número de fila: =ISEVEN(ROW()+1)



viernes, 13 de enero de 2012

Metodologías Ágiles, Ecosistema y Reciclaje de Software

Esta es una propuesta que pretende la modernización de los procesos de desarrollo a través de mejoras en partes importantes del desarrollo de software: la metodología y los sistemas de desarrollo.

Para modernización de metodologías propongo la implantación de una de las metodologías ágiles de desarrollo más conocida y utilizada en la actualidad: SCRUM; que además es compatible con las metodologías de calidad actuales (no las sustituye, las complementa).

Como mejora en los sistemas de desarrollo se propone la creación de un ecosistema de software completo que permita la mejora de la calidad y reciclaje de software.


Modernización de la metodología: Metodología y flujo de información ágil

Implantación de dos formas de trabajo que agilicen losdesarrollos:

Implantación de una metodología ágil tipo SCRUM,que puede ser incluida en las ofertas a clientes o pliegos, mejorando dichasofertas. Permite agilizar el desarrollo al separar diseño y construcción, y escompatible con las metodologías de calidad actuales (métrica, CMMI,…).

  • Es un proceso ágil e iterativo que nos ayuda a poner nuestro mayor esfuerzo en entregar el valor más importante de un producto en el tiempo más corto posible.
  • Nos permite enviar, inspeccionar y evaluar periódicamente software funcionando (cada 2-6 semanas aproximadamente).
  • El negocio determina las prioridades, los equipos se auto-administran para encontrar la mejor forma de encontrar las características más prioritarias.
  • Cada 30 días aproximadamente se puede ver software real que funciona y decidir si se entrega así o se sigue refinando en el siguiente ciclo.

Ventajas:

  • Fácil de explicar y entender.
  • Máximo valor por el esfuerzo.
  • Equipos auto-organizados, multi-aprendizaje.
  • Liberación de versiones totalmente funcionales, aunque con funcionalidad limitada, en cada iteración.
  • Orientación al cliente: lo involucra y le permite establecer prioridades.
  • Satisface al cliente con entregas tempranas y continuas de productos parcialmente funcionales.
  • Provee a la gerencia o dirección con un vistazo diario sobre el nivel de productividad y los factores que la afectan.
  • Mayor productividad en el desarrollo de software.
  • Permite producir software de forma regular, consistente y competitiva.
  • Útil en entornos con requisitos inestables, se aceptan requisitos cambiantes, incluso en etapas avanzadas.

La principal desventaja de esta metodología de trabajo esque si se aplica de forma estricta no es aplicable a grandes proyectos, sinembargo, esto se puede resolver dividiendo el desarrollo de aplicacionesgrandes en módulos y separando por equipos y aplicando la metodología por cada equipode desarrollo o/o módulo (sería un SCRUM Modular).

Posteriormente se puede aplicar la metodología ágil en unnivel superior (que podría estar integrado por los analistas o los analistasprogramadores principales de cada grupo) por el cual se realice la comunicacióncon los clientes a través de las reuniones o conferencias que se aplican enesta metodología (SCRUM Jerarquizado).

La potencia de esta metodología se encuentra en laflexibilidad con la que se puede llevar a cabo según interese en cada proyecto,no hay que seguirla de manera estricta.


Modernización de los procesos: Ecosistema de desarrollo y de reciclaje deSoftware

Trataría en realizar la implantación de un ecosistema desoftware completo, en la cual se disponga de algunas de lasherramientas que la integran como son artifactory, jira o HGC, la Wiki…

Existe un grupo de google que habla acerca de este tema: http://groups.google.com/group/ecosistemas-software

Un ecosistema de desarrollo de software (developmentecosystem) es un espacio de trabajo en el que conviven una serie deherramientas que permiten a un equipo de desarrollo modelar una metodología detrabajo que les ayude a ser más eficientes. Un ecosistema de desarrollo desoftware:

-         Facilita la integración continua.
-         Facilita la automatización.

Algunas de las herramientas que pueden ayudar a tal fin sonlas siguientes:

-     Maven: Herramienta de gestión de proyectos desoftware y herramienta de comprensión y gestión de dependencias entrelibrerías. Sería interesante definir arquetipos o plantillas de integración delos proyectos en los repositorios
-     Apache Continuum:Servidor de integración continua, integrable con repositorios de código.Pruebas de calidad y de consistencia.
-     Hudson: Otroservidor, este extensible, para integración continua.
-     Sonar:Plataforma de medición de calidad del código.
-     OpenFire y/opandion: Proporcionan herramientas de servidor y cliente para colaboraciónen tiempo real (Servicios de mensajería corporativa).
-      JUnit: Testeo unitario de aplicaciones.
-      Apache JMeter: Herramienta de prueba de carga, pruebasunitarias o monitoreo.
-      Apache Archiva o artifactory: Repositorios deMaven y Maven2, gestión de dependencias, hace de proxy caché de un repositoriopropio con otros existentes. Habría que integrarlo con el resto de herramientas y utilizarlo como base enel reciclaje de software desarrollado en la empresa, ya sean utilidades(validaciones java por ejemplo), módulos extensibles  (por ejemplo, módulos configurables de integracióncon repositorios LDAP) o productos.
-      Jira o trac: Sistemasde gestión de tareas e incidencias.
-      Wiki: Sitio web cuyas páginas pueden sereditadas rápidamente por múltiples usuarios, donde gestionar la información delos proyecto, utilidades, módulos y productos de la empresa.
-     Repositorio Subversion o GIT: Sistema de control deversiones que mejora el desarrollo colaborativo.


Mejoras de la solución conjunta:

-      Aumenta la productividad y se reduce el tiempo de losdesarrollos:
o       Segúnla metodología SCRUM los desarrollos se pueden empezar en paralelo con eldiseño.
o       Mayorreutilización de código (reciclaje), componentes, soluciones y/o productos quepueden ser compartidos en el Artifactory y documentados en WIKI corporativa.

-      Mejora de la calidad del software: El uso deherramientas de pruebas unitarias JUNIT no es obligatorio, por eso laintegración con herramientas como Sonar puede permitir la evaluación de lacalidad de cada proyecto integrado en artifactory.

-      Mayor grado de implicación y satisfacción del cliente:
o       Mejorael conocimiento del cliente sobre la evolución del proyecto.
o       Elcliente puede ver como evoluciona su producto y hacer pequeñas rectificacionessobre la marcha.

-      Fiabilidad, estabilidad y escalabilidad: se detectanerrores con mayor antelación a lo largo de las distintas etapas de desarrollo,por lo que el producto será mucho mejor y se acercará más a las necesidades delcliente, que haciendo una única entrega al final.

-      Fomenta la colaboración para el desarrollo/evolución de productos quepueden ser vendidos bajo  licencia en el mercado actual o abriendo mercado enotros sitios (si un proyecto es innovador, es más fácil convertirlo enproducto).

lunes, 9 de noviembre de 2009

Nuevas funcionalidades incluidas en Java 6

Voy a hacer un poco de autoaprendizaje, y voy a empezar por la parte principal de mi trabajo (siendo analista j2ee no puede ser otro que el lenguaje Java). Este el primero de lo que espero sea una indeterminada y larga lista de artículos de programación centradas en los entornos de programación basados en Java.

Creo que me había quedado un poco obsoleto y estancado en la versión 5 de este lenguaje, así que decidí dar un paso más y estudiar la versión de Java que se está utilizando ahora mismo en el panorama empresarial: Java 6, o  JDK 1.6 (del JSR 270).

Lo primero sería estudiar las diferencias con la versión anterior, aquí listo las mejoras que proporciona Java 6 con respecto a su anterior versión:

CAMBIOS EN EL CORE
  • Inclusión de motores de scripting: Se incluye el motor de Javascript  Rhino desarrollado por Mozilla.
  • Firma Digital XML (JSR 105): Sin necesidad de utilizar librerías externas (javax.xml.crypto). Esto viene muy bien para firmar peticiones SOAP.
  • API de compilación Java: Permitiría generar código automático en memoria, sin necesidad de fuentes. Esto pienso nos daría mucho juego, tiene muchas posibilidades (tengo que ver si se puede utilizar junto con el API Reflection), permitiendo generar clases dinámicas dependiendo de factores externos como, por ejemplo, datos de configuración o una bade de datos.
  • Procesamiento de anotaciones: Ahora siguiendo el JSR 269 en vez de la JSR 175 de la version 5, se estandariza el procesamiento de dichas anotaciones. Para procesar anotaciones únicamente hay que extender de la clase AbstractProccesor (indicando las anotaciones a capturar) y sobreescribir el método process.
  • Depurador en tiempo de ejecución: Se puede iniciar depuración en tiempo de ejecución, almacenando dentro de las clases compiladas más información que la que se almacenaba anteriormente. Para aplicaciones móviles JME CLDC, esto permite que éstas se ejecuten más rápidamente.
  • Nueva clase ServiceLoader: Permite estandarizar la creación de servicios de proveedores externos, realiza una búsqueda de la implementación de un servicio de forma más sencilla. Hay que indicar la clase que se quiere en el META-INF/services/{paquete.interfaz}. Se puede utilizar como una factoría para una interfaz dada que pueda tener una o varias implementaciones.
  • Colecciones Deque y BlockingDeque: Permiten crear colas doblemente enlazadas (permiten insertar datos al principio o al final). La implementación de la interfaz Deque es ArrayDeque, al cual no se accede a través de su índice. La inserción y obtención tiene un coste menor al de un ArrayList, a no ser que se necesite realizar búsquedas por índice. BlockingDeke, además, da soporte al bloqueo de operaciones de inserción y obtención.
  • Mejoras ordenamiento de colecciones Set y Map: Permitiendo realizar búsquedas bidireccionales y a partir o hasta un elemento dado si los elementos están ordenados (interfaces NavigableSet y NavigableMap).
  • Nueva clase java.io.Console: Permite leer contraseñas sin que se muestre en la pantalla.
  • Inclusión de Base de datos Derby JavaDB.
  • Modificación en la clase File para conocer el espacio en disco y poder cambiar sus atributos.
  • Mejoras en la concurrencia (JSR 166).
  • Inclusión del programa JConsole para monitorización de rendimiento de forma gráfica.
  • Incorporación de un pequeño servidor HTTP.
  • Implementación del manejador de cookies.
  • Internacionalización de los nombre de dominio IDN.
CAMBIOS ORIENTADOS AL CLIENTE
  • Acceso a las aplicaciones nativas.
  • Pantallas Splash.
  • Soporte barra de tareas del sistema.
  • Ordenamiento y filtrado de tablas.
  • SwingWorker.
CAMBIOS ORIENTADOS AL SERVIDOR
  • JDBC versión 4.0.
  • Procesamiento de XML usando StAX.
  • Anotaciones para Servicio Web.
  • Simplificación del mapeo Objeto/XML utilizando JABX 2.0.
  • Simplificación de la exposición de Servicios Web y la creación de clientes usando JAX-WS 2.0.
  • Estandarización de anotaciones comunes.
Son bastantes mejoras y cambios, sin embargo no tan significativos como los que se introdujeron con la versión Java 5 con respecto a su predecesora Java 1.4.

Imágenes Dockers

Estoy aprendiendo bastante sobre el tema de docker y docker swarm , gestión de Stacks, Servicios, Containers, Volumenes, .. y sus configurac...