Información privilegiada de Azure

Ingesta de telemetría y análisis con los servicios de Microsoft Azure

**Bruno Terkaly
Ricardo Villalobos
Thomas Conte

Bruno Terkaly and Ricardo Villalobos[Los escritores regulares Bruno Terkaly y Ricardo Villalobos actualmente a columnista invitado para la columna de este mes. Van a regresar con la próxima entrega. —Ed.]

Todos los dispositivos basados en sensores genera datos de telemetría. Interpretar estos datos es el núcleo de su propuesta de valor. En el mundo del consumidor, un conductor Mira su salpicadero coche conectado para ver cómo afecta a su estilo de conducción el tráfico y consumo de combustible. En el mundo industrial, comparando la temperatura de una máquina para el promedio de los demás en el piso de la fábrica puede ayudar a un operador identificar los riesgos de fracaso y realizar el mantenimiento predictivo.

Estas situaciones requieren datos de telemetría de decenas o cientos de miles de dispositivos conectados. Lo más importante, que tienes que analizar estos datos para proporcionar ideas y visualizaciones significativos. Cuando se trata con esas grandes cantidades de datos, entornos Big Data como Hadoop construcción una sólida base de procesamiento de datos que se puede ampliar con la base instalada de dispositivos.

En este artículo, usted aprenderá a crear una arquitectura de ingestión de telemetría simple usando el Bus de servicio de Microsoft Azure. Entonces podrá consumir y analizar estos datos de una manera escalable utilizando el servicio Microsoft Azure Hadoop llamado HDInsight.

Arquitectura de la solución

En columnas anteriores, Bruno Terkaly y Ricardo Villalobos mostraron cómo usar el servicio de autobús para establecer un canal de comando para comunicarse con un objeto conectado. En este artículo, usaré el servicio de autobús como una capa middleware para amortiguar los mensajes de telemetría enviados por el dispositivo.

Los dispositivos se comunican directamente con el servicio de autobús para enviar mensajes de telemetría a un tema dedicado (ver figura 1). Entonces una o varias suscripciones cola desactivar estos mensajes en un rol de trabajador y guardarlos como archivos planos de almacenamiento Blob. El cluster de Hadoop puede utilizar estos archivos de entrada para llevar a cabo análisis y cálculos.

Basic Flow of Big Data Telemetry Solution
Figura 1 flujo básicos de solución de telemetría de datos grandes

Esta arquitectura tiene la ventaja de la separación entre las diferentes piezas del otro. El servicio de autobús actúa como middleware y pueden datos del búfer si los trabajadores no pueden leer lo suficientemente rápido. Puede controlar la longitud de la cola y usarlo como base para auto-escala el nivel del trabajador.

Las suscripciones son también útiles para realizar simple filtrado de datos entrantes y lo de enrutamiento para procesamiento de fondo diferentes niveles. Por ejemplo, podrías tener una suscripción urgente que envía mensajes a un sistema de alertas en tiempo real y utilizar un todo suscripción a capturar todos los datos para su posterior análisis.

Porque los trabajadores sólo mover datos a almacenamiento de información — si Hadoop sistema de archivos distribuido (HDFS) o Blob storage — está desacoplada de la pieza de procesamiento Hadoop. Esto puede funcionar independientemente del ritmo de datos entrantes. Usted podría elegir a un cluster de Hadoop funcionando permanentemente. Esto le permite procesar por lotes pequeños todo el tiempo y reducir la latencia computacional. Usted también podría elegir ahorrar dinero por tener un comienzo de clúster HDInsight sólo una vez al día para llevar a cabo todos los cálculos en un único lote. También puedes tener una mezcla de los dos.

Recopile datos de telemetría usando el Bus de servicio

El Bus de servicios de Azure ofrece dos opciones de protocolo para enviar mensajes a un tema: HTTP o AMQP. En el caso de los dispositivos conectados, a menudo con ancho de banda limitado, AMQP tiene algunas ventajas. Es un protocolo eficiente, binario, confiable y portátil. También cuenta con bibliotecas para muchos idiomas, entornos de ejecución y sistemas operativos. Esto le da flexibilidad al conectar el dispositivo directamente al Bus de servicio para enviar mensajes de telemetría.

Para probar este enfoque, usé un tablero Raspberry Pi para alimentar a temperatura y otros datos del sensor, usando la biblioteca Apache Qpid protón AMQP. Protón es un escueto, biblioteca portátil podemos compilar en una variedad de ambientes para enviar mensajes de AMQP. Es totalmente interoperable con el Bus de servicios de Azure. Encontrar más información sobre la biblioteca de protones AMQP bit.ly/1icc6Ag.

En este ejemplo, he recopilado la biblioteca protones directamente en el tablero de Frambuesa Pi. Usé los Python bindings para escribir un script simple para capturar lecturas desde el USB puerto serie y enviarlas a la Celeste Service Bus, que se puede ver en figura 2.

Figura 2 código Python en la lectura de Frambuesa Pi para capturar las lecturas del Sensor

#!/usr/bin/python
import sys
import commands
import re
import uuid
import serial
from proton import *
# Device ID
id = uuid.getnode()
# Topic address
address = "amqps://owner:key@address.servicebus.windows.
net/telemetry"
# Open serial port
ser = serial.Serial('/dev/ttyACM0', 9600)
# Create Proton objects
messenger = Messenger()
while True:
  # Read values from Arduino in the form K1:V1_K2:V2_...
temp = ser.readline().rstrip('\r\n')
  print temp
  # Create AMQP message
  message = Message()
  # Initialize properties
  message.properties = dict()
  message.properties[symbol("did")] = symbol(id)
  # Map string to list, symbolize, create dict and merge
  pairs=map(lambda x:x.split(':'), temp.split('_'))
  symbols = map(lambda x:(symbol(x[0]),int(x[1])), pairs)
  message.properties.update(dict(symbols))
  message.address = address
  messenger.put(message)
  messenger.send()

El Python script directamente direcciones el Azure Servicio autobús tema llamado "telemetría". Está usando una cadena de conexión que incluye el token de autenticación estándar de Bus de servicio y se especifica mediante el protocolo AMQP. En un entorno del mundo real, necesitas utilizar un mecanismo de autenticación más sofisticado para asegurar que sus parámetros de conexión no están comprometidos.

Asumir un número significativo de estos dispositivos frambuesa comience a recopilar datos. Cada uno enviará un ID de dispositivo (DID) utilizará otra vez después de calcular las temperaturas medias. En este ejemplo, el DID se genera con el módulo UUID para recuperar la dirección del sistema MAC.

Una placa Arduino Esplora conectada a la Pi de frambuesa vía USB reúne las lecturas. El explorar es un all-in-one con sensores incorporados. Eso lo facilita leer la temperatura u otros parámetros ambientales y enviarlos al bus serial. El script en Python en el otro extremo del cable USB entonces Lee los valores de salida. Se muestra un ejemplo de un esquema de Arduino que imprime los valores del sensor para el puerto serie en figura 3.

Figura 3 código de Arduino reuniendo Frambuesa Pi lecturas

void loop()
{
  int celsius = Esplora.readTemperature(DEGREES_C);
  int loudness = Esplora.readMicrophone();
  int light = Esplora.readLightSensor();
  Serial.print("T:");
  Serial.print(celsius);
  Serial.print("_");
  Serial.print("M:");
  Serial.print(loudness);
  Serial.print("_");
  Serial.print("L:");
  Serial.print(light);
  Serial.println();
  // Wait a second
  delay(1000);
}

Seleccione su implementación Big Data

Usted tiene varias opciones para el tipo de solución Hadoop que utilizará para análisis de datos. La elección del tipo de implementación determinará cómo y dónde usted necesitará datos agregados para el análisis.

Azure ofrece una atractiva solución con HDInsight. Esto expone el marco Hadoop como un servicio. Esta distribución de Hadoop, basado en la plataforma de datos Hortonworks (HDP) para Windows, viene con un conector que permite empleos directamente acceder a datos de entrada de almacenamiento Azure Blob.

Esto significa que no tienes que tener el cluster de Hadoop arriba y corriendo para recibir archivos de entrada. Puedes subir archivos a un contenedor de almacenamiento Blob que HDInsight a usar más tarde. Cuando analizas un lote de archivos, puede iniciar el racimo HDInsight en pocos minutos, ejecutar una serie de puestos de trabajo por un par de horas y luego apagarlo. Esto se traduce en cuentas más bajas en términos de horas de cálculo.

Por otro lado, si desea implementar una distribución estándar de Hadoop como HDP, o la distribución de Cloudera en Azure máquinas virtuales (VMs), usted será responsable de mantener actualizado el cluster. También tendrás que tenerlo configurado correctamente para un funcionamiento óptimo. Este enfoque tiene sentido si pretendes utilizar componentes personalizados de Hadoop no incluidos en el HDInsight, como HBase, como el mecanismo de almacenamiento.

Guardar datos de telemetría en Blob Storage

Extracción de datos desde el Bus de servicios de Azure es un proceso simple. Utilice un papel del trabajador como un "lector" o "oyente" para la suscripción. Luego, se acumulan los mensajes en HDInsight puede utilizar archivos de entrada.

En primer lugar, establecer una o varias suscripciones en tu tema Azure servicio de autobús. Esto le da una latitud cuando dividir o encaminamiento, el flujo de datos, dependiendo de las necesidades. Por lo menos, es una buena idea para crear una suscripción de "catch-all" para almacenar todos los mensajes entrantes. También puede utilizar filtros en las suscripciones de Azure Service Bus. Esto creará flujos adicionales para mensajes específicos. Se muestra un ejemplo de creación de tema y suscripciones usando C# y la biblioteca del SDK de Azure servicio Bus en figura 4.

Figura 4 una suscripción de autobús servicio azul

var namespaceManager = 
  NamespaceManager.CreateFromConnectionString(connectionString);
// Create the Topic
if (!
namespaceManager.TopicExists("telemetry"))
{
  namespaceManager.CreateTopic("telemetry");
}
// Create a "catch-all" Subscription
if (!
namespaceManager.SubscriptionExists("telemetry", "all"))
{
  namespaceManager.CreateSubscription("telemetry", "all");
}
// Create an "alerts" subscription
if (!
namespaceManager.SubscriptionExists("telemetry", "alert"))
{
  SqlFilter alertFilter = new SqlFilter("type = 99");
  namespaceManager.CreateSubscription("telemetry", 
  "alert", alertFilter);
}

Una vez que has creado la suscripción al Bus servicio Azure, usted puede recibir y guardar mensajes. Este ejemplo utiliza el formato CSV, que es fácil de leer y entender tanto por las máquinas y los seres humanos. Para leer los mensajes entrantes como rápidamente como sea posible, el trabajador crea una serie de tareas (hay 10 en este ejemplo). También utiliza los métodos asincrónicos a leer lotes de mensajes, en lugar de leerlos uno por uno. "Toda" la suscripción y tema "telemetría" recibirá los mensajes (ver figura 5).

Figura 5 recibir mensajes de la suscripción y almacenarlos en el almacén de Blob

SubscriptionClient client = 
  SubscriptionClient.CreateFromConnectionString(connectionString, 
  "telemetry", "all", ReceiveMode.ReceiveAndDelete);
List<Task> tasks = new List<Task>();
for (int i = 0; i < NBTASKS; i++)
{
  var id = i; // Closure alert
  Task t = Task.Run(async () =>
  {
    BlobStorageWriter writer = new BlobStorageWriter(id);
    while (true)
    {
      var messages = await client.ReceiveBatchAsync(BATCH_SIZE);
      foreach (var message in messages)
      {
        try
        {
          await writer.WriteOneLine(TelemetryMessage.Stringify(message));
        }
        catch (Exception ex)
        {
          Trace.TraceError(ex.Message);
        }
      }
    }
  });
  tasks.Add(t);
}
Task.WaitAll(tasks.ToArray());

El método TelemetryMessage.Stringify devuelve simplemente una línea de texto en formato CSV que contiene los datos de telemetría. También puede extraer algunos campos útiles de las cabeceras de Azure Service Bus, como el ID de mensaje o el tiempo en cola.

El trabajo de BlobStorageWriter.WriteOneLine es escribir la línea directamente en un Blob. Las 10 tareas están disponibles en paralelo, ese mismo número de gotas se verán afectada a la vez. WriteOneLine rota también archivos de vez en cuando para HDInsight a recogerlos. Utilizo dos parámetros para decidir cuándo cambiar a un nuevo archivo: el número de líneas escritas en el archivo y el tiempo desde que se creó el Blob (por ejemplo, crear un nuevo archivo cada hora o cuando alcanza 1.000.000 líneas). Este método utiliza llamadas asincrónicas para evitar el bloqueo al escribir los mensajes en la secuencia de Blob (ver figura 6).

Figura 6 escribir datos de mensajes de manchas azules

public async Task WriteOneLine(string line)
{
  var bytes = Encoding.UTF8.GetBytes(string.Format("{0}\n", line));
  await destinationStream.WriteAsync(bytes, 0, bytes.Length);
  TimeSpan ts = DateTime.Now - startBlobTime;
  if (++linesWritten > MAX_LINES || ts.TotalSeconds > MAX_SECONDS)
  {
    Trace.TraceInformation(
      "Wrote " + linesWritten + " lines to " + currentBlob.Name);
    GetNextBlob();
    linesWritten = 0;
  }
}

Los archivos resultantes contienen datos extraídos de los mensajes de telemetría, como se muestra:

145268284e8e498282e20b01170634df,test,24,980,21,2014-03-14 13:43:32
dbb52a3cf690467d8401518fc5e266fd,test,24,980,21,2014-03-14 13:43:32
e9b5f508ef8c4d1e8d246162c02e7732,test,24,980,21,2014-03-14 13:43:32

Comprenden el mensaje ID, ID de dispositivo, tres de las lecturas y la fecha el mensaje en cola. Este formato es fácil de analizar en el siguiente paso.

Analizar los datos usando HDInsight

El beneficio más impresionante de HDInsight es que puede iniciar un cluster de Hadoop completo, ejecutar un trabajo y aprovisionar el clúster directamente desde la línea de comandos. No siempre tienes que iniciar sesión en una máquina virtual o realizar cualquier configuración personalizada. Usted puede proporcionar y administrar HDInsight con Windows PowerShell en Windows, o usando herramientas de línea de comandos multiplataforma en Mac o Linux.

Puede descargar el commandlets Azure PowerShell integrado de bit.ly/1tGirZk. Estos commandlets incluyen todo lo que necesita para administrar su infraestructura de Azure, incluyendo los racimos HDInsight. Una vez has importado tu configuración de publicación y seleccionado la suscripción de forma predeterminada, sólo necesita una línea de comandos para crear un nuevo clúster de HDInsight:

New-AzureHDInsightCluster -Name "hditelemetry" -Location "North Europe" -DefaultStorageAccountName "telemetry.blob.core.windows.
net" -DefaultStorageAccountKey "storage-account-key" -DefaultStorageContainerName "data" -ClusterSizeInNodes 4

Este comando indica el cluster HDInsight utilizar la cuenta de almacenamiento existente y envase como su raíz del sistema de archivos. Esto es lo tendrá acceso toda la telemetría datos que genera el proceso de ingesta. También puede seleccionar cuántos trabajadores nodos del clúster debe utilizar, dependiendo del volumen de datos y cuánto paralelismo que necesitas.

Una vez que el clúster está funcionando, puede habilitar el acceso a escritorio remoto. Hacerlo permite que otros usuarios iniciar sesión en el nodo principal para iniciar una sesión interactiva con herramientas y comandos estándar Hadoop. Sin embargo, es mucho más rápido usar los comandos remotos, tomando ventaja de Windows PowerShell para lanzar trabajos reducir mapa, colmena o cerdo.

Usé un trabajo de cerdo para calcular el valor de temperatura media. Cerdo fue desarrollada inicialmente en Yahoo. Se permite a los usuarios utilizando Hadoop centrarse más en el análisis de grandes conjuntos de datos y dedique menos tiempo a escribir programas mapper y reductor. Un script de cerdo típicamente tiene tres etapas:

  1. Cargar los datos que desea manipular.
  2. Ejecutar una serie de transformaciones de datos (que se traducen en un conjunto de tareas mapper y reductor).
  3. Volcar los resultados a la pantalla, o guardar los resultados en un archivo.

El ejemplo siguiente muestra cómo se típicamente esto logra ejecutando el script de forma interactiva, en una fase de análisis de datos exploratoria (EDA), con el intérprete de cerdo:

data = load '/telemetry*.csv' using PigStorage(',') as (id:chararray, did:chararray, temp:int, light:int, mic:int, timestamp:datetime);
data1 = group data by did;
data2 = foreach data1 generate group as did, COUNT(data), AVG(data.temp);
dump data2;

Si escribes este script directamente en el intérprete de cerdo, mostrará una tabla que contiene el número de puntos de datos de temperatura y el valor medido promedio para cada DID. Como puede ver, la sintaxis de cerdo es bastante explícita. Los pasos de manipulación de datos diferentes están claramente separados:

  • La primera declaración de carga se utiliza para cargar los datos de los archivos CSV, describiendo el nombre y tipo de los campos de entrada.
  • Luego, los datos se agrupan por DID, o por dispositivo.
  • El resultado conjunto de datos se genera con las funciones de agregado como Conde y prom.

Una vez que finalice la secuencia de comandos, puede automatizar esta tarea con Windows PowerShell. Utilice la nueva-AzureHDInsightPigJob­commandlet definición para iniciar un trabajo de cerdo con el script creado. A continuación, puede utilizar Start-AzureHDInsightJob y espera-AzureHD­InsightJob para iniciar el trabajo y esperar su conclusión (ver figura 7). Entonces puede utilizar Get-AzureHDInsightJobOutput para recuperar los resultados.

Figura 7 insertar, analizar e iniciar trabajos en HDInsight

$PigScript = "data = load '/telemetry*.csv' using PigStorage(',') as (id:chararray, did:chararray, temp:int, light:int, mic:int, timestamp:datetime);" +
"data1 = group data by did;" +
"data2 = foreach data1 generate group as did, COUNT(data), AVG(data.temp);" +
"dump data2;"
# Define a Pig job
$pigJobDefinition = New-AzureHDInsightPigJobDefinition -Query $PigScript
# Start the job
$pigJob = Start-AzureHDInsightJob -Cluster "hditelemetry" -JobDefinition $pigJobDefinition
# Wait for the job to finish
Wait-AzureHDInsightJob -Job $pigJob -WaitTimeoutInSeconds 3600
# Get the job results
Get-AzureHDInsightJobOutput -Cluster "hditelemetry" -JobId $pigJob.JobId –StandardOutput

El resultado se muestra en la consola de línea de comandos se ve así:

C:\> Get-AzureHDInsightJobOutput -Cluster "hditelemetry" -JobId $pigJob.JobId
(test,29091,24.0)
(49417795060,3942,30.08371385083714)

En este caso, hay bastantes medidas de prueba y unos 4.000 lecturas de la frambuesa Pi. Las lecturas de un promedio de 30 grados.

En resumen

El Bus de servicios de Azure es una manera rápida y fiable para recopilar datos de todo tipo de dispositivos. Para almacenar y analizar datos, necesitas un robusto motor de almacenamiento de información y análisis. HDInsight azul abstrae el proceso de creación y mantenimiento de un cluster de Hadoop para este grado de almacenamiento. Es una solución altamente escalable, puede configurar y automatizar usando herramientas como Windows PowerShell o la interfaz de línea de comandos de Azure Mac/Linux.

Thomas Conte es un evangelista técnico para la plataforma Microsoft Azure en el Desarrollador & División de plataforma evangelismo (DPE). Su función es facilitar el acceso a la tecnología para los desarrolladores, arquitectos y socios de software a través de ejemplos de código, publicaciones y hablar en público. Él se esfuerza ejecutar Microsoft Azure en tantas tecnologías no son de Microsoft desde el mundo del código abierto como sea posible. Síguelo en twitter.com/tomconte.

Bruno Terkaly es un evangelista de desarrollador de Microsoft. Su profundo conocimiento se debe a años de experiencia en el campo, en que escribe código mediante el uso de diversas plataformas, lenguajes, marcos, SDK, bibliotecas y API. Gasta tiempo escribiendo código, blogging y dando presentaciones en vivo en la construcción de aplicaciones basadas en la nube, especialmente utilizando la plataforma Microsoft Azure. Usted puede leer su blog en blogs.msdn.com/b/brunoterkaly.

Ricardo Villalobos es un arquitecto de software sazonada con más de 15 años de experiencia diseñando y creando aplicaciones para empresas en múltiples industrias. Sosteniendo diferentes certificaciones técnicas, así como una maestría en administración de empresas por la Universidad de Dallas, trabaja como arquitecto de nube en el equipo de DPE en todo el mundo socios comprometidos para Microsoft, ayudando a las empresas en todo el mundo para implementar las soluciones de Microsoft Azure. Usted puede leer su blog en blog.ricardovillalobos.com.

Gracias a los siguientes expertos técnicos de Microsoft por su ayuda en la revisión de este artículo: Rafael Godinho y Jeremiah Talkar