Azure-Insider

Telemetrie-Erfassung und -Analyse mit Microsoft Azure-Diensten

**Bruno Terkaly
Ricardo Villalobos
Thomas Conte

Bruno Terkaly and Ricardo Villalobos[Die regelmäßigen Kolumnisten Bruno Terkaly und Ricardo Villalobos präsentieren eine Gast-Kolumnist für dieses Monats. Sie kehren mit der nächsten Rate. —Ed.]

Jeder Sensor-basierte Gerät generiert Telemetrie-Daten. Interpretation dieser Daten ist das Herzstück ihrer Verkaufsargumente. In der Consumer-Welt schaut ein Fahrer seine angeschlossenen Auto-Dashboard zu sehen, wie seine Fahrweise Kraftstoffverbrauch und Verkehr beeinflusst. In der industriellen Welt hilft vergleichen die Temperatur eines Computers auf dem Durchschnitt der anderen in der Fabrik ein Betreiber die Risiken des Scheiterns und vorausschauenden Wartung durchführen.

Diese Szenarien erfordern Telemetrie-Daten von zehn- oder Hunderttausende von angeschlossenen Geräten. Was mehr ist wichtig, müssen Sie diese Daten, um aussagekräftige Visualisierungen und Einblicke bieten zu analysieren. Im Umgang mit solch großen Datenmengen bauen Big Data-Frameworks wie Hadoop eine solide EDV-Grundlage, die mit der installierten Geräte skalieren kann.

In diesem Artikel erfahren Sie, wie Sie eine einfache Telemetrie-Einnahme-Architektur unter Verwendung der Microsoft Azure Service Bus zu erstellen. Dann verbrauchen Sie und analysieren diese Daten auf eine skalierbare Weise mithilfe des Microsoft Azure Hadoop-Dienstes namens HDInsight.

Lösungsarchitektur

In früheren Artikeln zeigte, Bruno Terkaly und Ricardo Villalobos wie Service-Bus verwenden, um einen Befehlskanal für die Kommunikation mit ein verbundenes Objekt einzurichten. In diesem Artikel verwende ich den Service Bus als Middleware Layer, Telemetrie-Nachrichten, die von dem Gerät zu puffern.

Die Geräte kommunizieren direkt mit dem Service Bus Telemetrie-Nachrichten zu einem speziellen Thema zu senden (siehe Abbildung 1). Dann werden ein oder mehrere Abonnements de Warteschlange diese Nachrichten in einer Arbeitnehmer-Rolle und speichern sie als Flatfiles im Blob-Speicher. Der Hadoop-Cluster können dann diese Eingabedateien, Analysen und Berechnungen durchführen.

Basic Flow of Big Data Telemetry Solution
Abbildung 1 grundlegenden Ablauf der großen Daten-Telemetrie-Lösung

Diese Architektur hat den Vorteil der Entkopplung der verschiedenen Teile von einander. Service Bus fungiert als Middleware und können Pufferdaten, wenn der Arbeitnehmer sie nicht schnell genug. Sie können die Länge der Warteschlange überwachen und verwenden, die als Grundlage für die automatische Skalierung der Arbeiter-Ebene.

Die Abonnements eignen sich auch zur Durchführung von einfachen Filtern nach eingehenden Daten und routing es verschiedene Back-End-Verarbeitung-Stufen. Beispielsweise könnten Sie haben eine dringende Abonnement, das Senden von Nachrichten an ein Echtzeit-Warnsystem und verwenden ein alles Abonnement für alle Daten für die spätere Analyse erfassen.

Da die Arbeiter nur Daten in Speicher verschieben — ob Hadoop Distributed File System (bietet) oder Blob-Speicher — es ist entkoppelt vom Hadoop Verarbeitung Stück. Dies kann unabhängig von den eingehenden Daten-Rhythmus ausgeführt. Sie können wählen, einen Hadoop-Cluster, die dauerhaft ausgeführt zu haben. Dadurch können Sie Kleinserien ständig zu verarbeiten und computational Latenz zu reduzieren. Sie können auch wählen, um Geld zu sparen, indem er einen HDInsight Cluster-Start nur einmal pro Tag für alle Berechnungen in einem Batch. Sie können auch eine Mischung aus diesen beiden haben.

Nehmen Sie Telemetrie-Daten, die über den Service Bus ein

Azure Service Bus bietet zwei Protokoll-Optionen zum Senden von Nachrichten zu einem Thema: HTTP oder AMQP. Im Falle von angeschlossenen Geräten, oft mit begrenzter Bandbreite hat AMQP einige Vorteile. Es ist eine effiziente, binär, zuverlässige und portable-Protokoll. Es hat auch Bibliotheken für viele Sprachen, Laufzeitumgebungen und Betriebssysteme. Dadurch können Sie flexibel, wenn Ihr Gerät direkt mit dem Service Bus Telemetrie-Meldungen zu verbinden.

Um dies zu testen, habe ich ein Raspberry Pi-Board Temperatur und andere Sensordaten feed unter Verwendung der Apache gefangen in der Vergangenheit Proton AMQP Bibliothek. Proton ist eine nackte Knochen, portable Bibliothek, die Sie auf einer Vielzahl von Umgebungen AMQP Nachrichtenversand kompilieren können. Es ist vollständig kompatibel mit dem Azure Service Bus. Erfahren Sie mehr über die Proton AMQP Bibliothek am bit.ly/1icc6Ag.

In diesem Beispiel habe ich die Proton-Bibliothek direkt auf dem Raspberry Pi-Board zusammengestellt. Ich habe die Python-Bindings zu schreiben ein einfaches Skript zum Aufzeichnen der Sensorwerte vom USB serielle Schnittstelle und senden Sie sie an die Azure Service-Bus, der Sie, in sehen können Abbildung 2.

Abbildung 2-Python-Code in der Raspberry Pi-Lesung Sensorwerte erfassen

#!/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()

Die Python-Skript direkt Adressen im Azure Service-Bus-Thema namens "Telemetrie." Es ist eine Verbindungszeichenfolge verwenden, die enthält des standard Service Bus-Authentifizierungstokens und gibt mit dem AMQP-Protokoll. In einer realen Umgebung müssten Sie einen anspruchsvolleren Authentifizierungsmechanismus verwenden, um sicherzustellen, dass Ihre Verbindungsparameter gefährdet sind nicht.

Übernehmen Sie eine beträchtliche Anzahl von dieser Datensammlung Himbeer-Geräte-Start. Jeweils senden eine Device-ID (DID), die Sie später wieder verwenden werden, um Durchschnittstemperaturen zu berechnen. In diesem Beispiel wird die DID mit dem UUID-Modul zum Abrufen von MAC-Adresse des Systems erzeugt.

Ein Arduino Esplora-Board mit dem Raspberry Pi über USB verbunden sammelt die Lesungen. Der Esplora ist ein all-in-One-Board mit eingebauten Sensoren. Das macht es leicht zu lesen, Temperatur oder andere Umweltparameter und senden Sie sie an dem seriellen Bus. Das Python-Skript an das andere Ende des USB-Kabels liest dann die Ausgabewerte. Ein Beispiel für ein Arduino-Schema, das Sensor-Werte an den seriellen Anschluss druckt ist Abbildung 3.

Abbildung 3 Arduino Code sammeln Raspberry Pi Lesungen

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);
}

Wählen Sie Ihre großen Daten-Bereitstellung

Sie haben mehrere Möglichkeiten, für welche, die Art von Hadoop-Lösung Sie für die Datenanalyse verwenden. Die Wahl der Bereitstellung wird diktieren, wie und wo Sie zum Aggregieren von Daten für die Analyse benötigen.

Azure bietet eine überzeugende Lösung mit HDInsight. Dies macht den Hadoop-Rahmen als Dienst verfügbar. Diese Verteilung von Hadoop, basierend auf der Hortonworks-Daten-Plattform (HDP) für Windows, kommt mit einen Connector, der Arbeitsplätze, die direkt die Eingabedaten von Azure Blob-Speicher zugreifen zu können.

Das bedeutet, Sie nicht die Hadoop-Cluster auf und laufen haben, um Eingabedateien zu erhalten müssen. Sie können Dateien in eine Blob-Storage-Container hochladen, die HDInsight später verwenden werden. Wenn Sie mehrere Dateien analysieren, können HDInsight Cluster in wenigen Minuten zu starten, führen Sie eine Reihe von Arbeitsplätzen für ein paar Stunden und dann heruntergefahren. Daraus ergeben sich niedrigere Rechnungen in Bezug auf die Compute-Stunden.

Auf der anderen Seite, wenn Sie eine standard-Hadoop-Distribution wie HDP oder die Verteilung von Cloudera auf Azure virtuelle Maschinen (VMs) bereitstellen möchten, werden zuständig für die Führung des Clusters auf dem neuesten Stand Sie. Sie haben auch für den optimalen Betrieb ordnungsgemäß konfiguriert haben. Dieser Ansatz ist sinnvoll, wenn Sie benutzerdefinierte Hadoop Komponenten nicht in HDInsight, wie z. B. HBase, als den Speichermechanismus verwenden möchten.

Telemetriedaten in Blob-Speicher speichern

Extrahieren von Daten aus dem Azure Service-Bus ist ein einfacher Prozess. Verwenden Sie eine Arbeiter-Rolle als "Reader" oder "Listener", für das Abonnement. Nachrichten häufen sich dann in Eingabedateien, die HDInsight verwenden kann.

Richten Sie ein oder mehrere Abonnements auf Azure Service Bus Thema zuerst. Dadurch können Sie einige Breitengrad aufteilen oder routing den Datenstrom, abhängig von den Anforderungen. Das Mindeste ist ist es eine gute Idee, ein "Catch-All"-Abonnement um alle eingehenden Nachrichten speichern erstellen. Sie können auch Filter auf Azure Service Bus-Abonnements. Das schafft zusätzliche Streams für bestimmte Nachrichten. Ein Beispiel für das Thema und Abonnements, die mit c# und der Azure Service Bus SDK-Bibliothek ist Abbildung 4.

Abbildung 4 ein Azure Service-Bus-Abonnement

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);
}

Sobald Sie die Azure Service-Bus-Abonnement erstellt haben, können Sie erhalten und Nachrichten speichern. Dieses Beispiel verwendet das CSV-Format, die einfach zu lesen und zu verstehen, sowohl von Menschen und Maschinen. Um die eingehenden Nachrichten als gelesen erstellt der Arbeitnehmer möglichst schnell eine Reihe von Aufgaben (in diesem Beispiel gibt 10). Es verwendet auch asynchrone Methoden zum Nachrichtenbatches, statt sie einzeln nacheinander zu lesen lesen. Die "alle" Abonnement und das Thema "Telemetrie" erhalten die Nachrichten (siehe Abbildung 5).

Abbildung 5 empfangen von Nachrichten aus dem Abonnement und Speicherung in Blob-Speicher

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());

Die TelemetryMessage.Stringify-Methode gibt einfach eine Textzeile im CSV-Format, das die Telemetriedaten enthält. Es kann auch einige nützliche Felder extrahieren, aus dem Azure Service Bus-Headern, wie z. B. die Message-ID oder die Zeit in die Warteschlange eingereiht.

Die Aufgabe des BlobStorageWriter.WriteOneLine ist die Zeile direkt in ein Blob schreiben. Da 10 Aufgaben parallel verfügbar sind, werden auf einmal die gleiche Anzahl von Blobs betroffen sein. WriteOneLine dreht auch Dateien von Zeit zu Zeit für HDInsight um sie abzuholen. Ich verwende zwei Parameter um zu entscheiden, wann Sie in eine neue Datei zu wechseln: die Anzahl der Zeilen in der Datei und die Zeit seit das Blob erstellt wurde (z. B. beim Erstellen einer neuen Datei jede Stunde oder wenn es 1.000.000 Zeilen erreicht) geschrieben. Diese Methode verwendet asynchrone aufrufen, um zu vermeiden, beim Schreiben von Nachrichten in den Blob-Stream blockiert (siehe Abbildung 6).

Abbildung 6 schreiben Daten in Azure Blobs aus Nachrichten

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;
  }
}

Die resultierenden Dateien enthalten die Nachrichten Telemetrie-Daten, wie gezeigt:

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

Dazu gehören die Nachrichten-ID, Geräte-ID, drei Lesungen und das Datum, das die Nachricht in die Warteschlange gestellt wurde. Dieses Format ist im nächsten Schritt einfach.

Analysieren Sie die Daten mit HDInsight

Der eindrucksvollste Vorteil HDInsight ist, kann einen vollständigen Hadoop-Cluster zu beginnen, einen Auftrag ausführen und Mail-Cluster direkt von der Befehlszeile aus. Du musst nicht immer melden Sie sich an eine VM oder führen Sie eine benutzerdefinierte Konfiguration. Sie können bereitstellen und Verwalten von HDInsight mit Windows PowerShell unter Windows oder mithilfe von Befehlszeilentools plattformübergreifend unter Mac oder Linux.

Sie können die integrierten Azure PowerShell Commandlets von bit.ly/1tGirZk. Diese Commandlets enthalten alles, was Sie Ihrer Azure Infrastruktur, einschließlich HDInsight-Cluster verwalten müssen. Wenn Sie importiert Ihre Einstellungen zum Veröffentlichen und das Standardabonnement ausgewählt haben, brauchen Sie nur eine Befehlszeile ein, um einen neuen HDInsight-Cluster zu erstellen:

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

Dieser Befehl weist den HDInsight-Cluster, den vorhandenen Speicherplatz-Account und Container als Root die Datei-System zu verwenden. Dies ist, wie es die Telemetrie zugreifen werden Daten der Aufnahme-Prozess generiert. Sie können auch auswählen, wie viele Arbeitnehmer Knoten des Clusters, abhängig von der Datenmenge verwenden sollten und wie viel Parallelität, die Sie benötigen.

Sobald der Cluster ausgeführt wird, können Sie Remote Desktop-Zugriff aktivieren. Dadurch können andere Benutzer anmelden auf dem Head-Knoten, eine interaktive Sitzung mit standard-Hadoop-Befehle und Werkzeuge zu beginnen. Jedoch ist es viel schneller mithilfe von remote-Befehle, unter Ausnutzung der Windows PowerShell anzeigen zu reduzieren, Bienenkorb oder Schwein zu starten.

Ich habe eine Schweine-Arbeit um den Durchschnittstemperatur-Wert zu berechnen. Schwein wurde ursprünglich bei Yahoo entwickelt. Es können Menschen mit Hadoop Fokus mehr auf die Analyse großen Datenmengen und verbringen weniger Zeit Mapper und Druckminderer Programme zu schreiben. Ein Schwein-Skript besteht in der Regel aus drei Phasen:

  1. Laden Sie die Daten, die Sie bearbeiten möchten.
  2. Führen Sie eine Reihe von Datentransformationen (die in eine Reihe von Aufgaben Mapper und Druckminderer übersetzt werden).
  3. Dump die Ergebnisse auf dem Bildschirm oder die Ergebnisse in einer Datei speichern.

Das folgende Beispiel zeigt, wie Sie in der Regel das erreichen durch Ausführen des Skripts interaktiv, in einer explorativen Data Analysis (EDA)-Phase, mit dem Schwein-Interpreter:

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;

Wenn Sie dieses Skript direkt in der Schwein-Interpreter eingeben, zeigt es eine Tabelle, die die Anzahl der Datenpunkte der Temperatur und der durchschnittliche gemessene Wert für jede DID. Wie Sie sehen können, ist die Pig-Syntax sehr deutlich. Die verschiedenen Daten-Manipulation-Schritte sind klar getrennt:

  • Die erste Load-Anweisung wird verwendet, um die Daten aus der CSV-Dateien, beschreiben die Namen und Typen der Eingabefelder laden.
  • Die Daten werden dann durch DID oder pro Gerät gruppiert.
  • Das Ergebnis-Dataset wird mit Aggregatfunktionen wie COUNT und AVG generiert.

Sobald das Skript fertig ist, können Sie diese Aufgabe mit Windows PowerShellautomatisieren. Verwenden Sie den New-AzureHDInsightPigJob­Definition Commandlet initialisieren eine Schweine-Arbeit mit dem Skript erstellt. Dann können Sie Start-AzureHDInsightJob und warten-AzureHD­InsightJob der Auftrag gestartet und warten auf ihren Abschluss (siehe Abbildung 7). Get-AzureHDInsightJobOutput können Sie dann die Ergebnisse abzurufen.

Abbildung 7 einfügen, analysieren und Jobs in HDInsight starten

$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

Das angezeigte Ergebnis in die Befehlszeilenkonsole sieht wie folgt aus:

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

In diesem Fall gibt es etliche Test-Messungen und rund 4.000 Messwerte von der Raspberry Pi. Die Lesungen, durchschnittlich 30 Grad.

Zusammenfassung

Azure Service Bus ist eine zuverlässige und schnelle Möglichkeit zum Sammeln von Daten aus allen Arten von Geräten. Um zu speichern und diese Daten zu analysieren, benötigen Sie eine robuste Speicherung und Analyse-Engine. Himmelblau HDInsight abstrahiert den Prozess der Erstellung und Pflege eines Hadoop-Clusters für dieses Maß an Speicher. Es ist eine hochgradig skalierbare Lösung, die Sie automatisieren, mithilfe von Tools wie Windows PowerShell oder der Mac/Linux-Azure-Befehlszeilenschnittstelle und konfigurieren können.

Thomas Conte ist ein technical Evangelist für die Microsoft Azure-Plattform in der Developer & Platform Evangelism (DPE) Division. Seine Rolle ist, Zugang zu Technologien für Entwickler, Architekten und Software-Partnern durch Code-Beispiele, Publikationen und Vorträge zu erleichtern. Er bemüht sich um Microsoft Azure auf so viele nicht-Microsoft-Technologien aus der open-Source-Welt wie möglich ausgeführt. Folgen Sie ihm auf twitter.com/tomconte.

Bruno Terkaly ist ein Developer Evangelist für Microsoft. Seine fundierten Kenntnisse basieren auf mehreren Jahren Erfahrung in der Programmierung in unterschiedlichsten Plattformen, Sprachen, Frameworks, SDKs, Bibliotheken und APIs. Er verbringt Zeit Schreiben von Code, Blogging und geben live-Präsentationen auf den Aufbau von Cloud-basierten Anwendungen, speziell mit Microsoft Azure-Plattform. Sie können lesen Sie seinen Blog unter blogs.msdn.com/b/brunoterkaly.

Ricardo Villalobos ist ein erfahrener Softwarearchitekt mit mehr als 15 Jahren Erfahrung im Entwerfen und Erstellen von Anwendungen für Unternehmen in verschiedenen Branchen. Halten verschiedene technische Zertifizierungen, sowie einen Master-Abschluss in Betriebswirtschaft von der Universität Dallas, arbeitet er als Architekt Wolke in der DPE weltweit engagierten Partner-Team für Microsoft, hilft Unternehmen weltweit Lösungen in Microsoft Azure implementiert. Sie können lesen Sie seinen Blog unter blog.ricardovillalobos.com.

Unser Dank gilt den folgenden technischen Experten von Microsoft für die Durchsicht dieses Artikels: Rafael Godinho und Jeremiah Talkar