Entwickeln von C#-Topologien für Apache Storm mithilfe von Data Lake-Tools für Visual StudioDevelop C# topologies for Apache Storm by using the Data Lake tools for Visual Studio

Erfahren Sie, wie Sie eine C#-Apache Storm-Topologie mit Azure Data Lake-Tools (Apache Hadoop) für Visual Studio erstellen.Learn how to create a C# Apache Storm topology by using the Azure Data Lake (Apache Hadoop) tools for Visual Studio. In diesem Dokument werden Sie durch die Erstellung eines Storm-Projekts in Visual Studio, durch den zugehörigen lokalen Test und dessen Bereitstellung eines Apache Storm-Clusters in Azure HDInsight geleitet.This document walks through the process of creating a Storm project in Visual Studio, testing it locally, and deploying it to an Apache Storm on Azure HDInsight cluster.

Außerdem erfahren Sie, wie hybride Topologien erstellt werden, die C#- und Java-Komponenten verwenden.You also learn how to create hybrid topologies that use C# and Java components.

Hinweis

Während Sie für die Schritte in diesem Dokument eine Windows-Entwicklungsumgebung mit Visual Studio benötigen, kann das kompilierte Projekt an einen Linux- oder Windows-basierten HDInsight-Cluster übermittelt werden.While the steps in this document rely on a Windows development environment with Visual Studio, the compiled project can be submitted to either a Linux or Windows-based HDInsight cluster. Nur Linux-basierte Cluster, die nach dem 28. Oktober 2016 erstellt wurden, unterstützen SCP.NET-Topologien.Only Linux-based clusters created after October 28, 2016, support SCP.NET topologies.

Um eine C#-Topologie mit einem Linux-basierten Cluster zu verwenden, müssen Sie das NuGet-Paket „Microsoft.SCP.Net.SDK“, das vom Projekt verwendet wird, auf Version 0.10.0.6 oder höher aktualisieren.To use a C# topology with a Linux-based cluster, you must update the Microsoft.SCP.Net.SDK NuGet package used by your project to version 0.10.0.6 or later. Die Version des Pakets muss zudem mit der Hauptversion der Storm-Installation auf HDInsight übereinstimmen.The version of the package must also match the major version of Storm installed on HDInsight.

HDInsight-VersionHDInsight version Apache Storm-VersionApache Storm version SCP.NET-VersionSCP.NET version Mono-StandardversionDefault Mono version
3.33.3 0.10.x0.10.x 0.10.x.x0.10.x.x
(nur in Windows-basiertem HDInsight)(only on Windows-based HDInsight)
Nicht verfügbarNA
3.43.4 0.10.0.x0.10.0.x 0.10.0.x0.10.0.x 3.2.83.2.8
3,53.5 1.0.2.x1.0.2.x 1.0.0.x1.0.0.x 4.2.14.2.1
3.63.6 1.1.0.x1.1.0.x 1.0.0.x1.0.0.x 4.2.84.2.8

Wichtig

C#-Topologien in Linux-basierten Clustern müssen .NET 4.5 verwenden. Zudem muss Mono im HDInsight-Cluster ausgeführt werden.C# topologies on Linux-based clusters must use .NET 4.5, and use Mono to run on the HDInsight cluster. Überprüfen Sie die Mono-Kompatibilität auf mögliche Inkompatibilitäten.Check Mono compatibility for potential incompatibilities.

Installieren von Visual StudioInstall Visual Studio

Sie können C#-Topologien mit SCP.NET entwickeln, indem Sie eine der folgenden Versionen von Visual Studio verwenden:You can develop C# topologies with SCP.NET by using one of the following versions of Visual Studio:

Installieren von Data Lake-Tools für Visual StudioInstall Data Lake tools for Visual Studio

Folgen Sie den Schritten unter Get started using Data Lake tools for Visual Studio (Erste Schritte mit den Data Lake-Tools für Visual Studio), um Data Lake-Tools für Visual Studio zu installieren.To install Data Lake tools for Visual Studio, follow the steps in Get started using Data Lake tools for Visual Studio.

Installieren von JavaInstall Java

Wenn Sie eine Storm-Topologie aus Visual Studio senden, generiert SCP.NET eine ZIP-Datei, welche die Topologie und Abhängigkeiten enthält.When you submit a Storm topology from Visual Studio, SCP.NET generates a zip file that contains the topology and dependencies. Java wird zur Erstellung dieser ZIP-Dateien verwendet, weil ein Format verwendet wird, das mehr mit Linux-basierten Cluster kompatibel ist.Java is used to create these zip files, because it uses a format that is more compatible with Linux-based clusters.

  1. Installieren Sie den Java Developer Kit (JDK) 7 oder höher in Ihre Entwicklungsumgebung.Install the Java Developer Kit (JDK) 7 or later on your development environment. Sie erhalten die Oracle JDK von Oracle.You can get the Oracle JDK from Oracle. Sie können auch other Java distributions (andere Java-Distributionen) verwenden.You can also use other Java distributions.

  2. Die Umgebungsvariable JAVA_HOME muss auf das Verzeichnis mit Java zeigen.The JAVA_HOME environment variable must point to the directory that contains Java.

  3. Die Umgebungsvariable PATH muss das Verzeichnis %JAVA_HOME%\bin beinhalten.The PATH environment variable must include the %JAVA_HOME%\bin directory.

Sie können die folgende C#-Konsolenanwendung verwenden, um sicherzustellen, dass Java und das JDK ordnungsgemäß installiert sind:You can use the following C# console application to verify that Java and the JDK are correctly installed:

using System;
using System.IO;
namespace ConsoleApplication2
{
   class Program
   {
       static void Main(string[] args)
       {
           string javaHome = Environment.GetEnvironmentVariable("JAVA_HOME");
           if (!string.IsNullOrEmpty(javaHome))
           {
               string jarExe = Path.Combine(javaHome + @"\bin", "jar.exe");
               if (File.Exists(jarExe))
               {
                   Console.WriteLine("JAVA Is Installed properly");
                    return;
               }
               else
               {
                   Console.WriteLine("A valid JAVA JDK is not found. Looks like JRE is installed instead of JDK.");
               }
           }
           else
           {
             Console.WriteLine("A valid JAVA JDK is not found. JAVA_HOME environment variable is not set.");
           }
       }  
   }
}

Apache Storm-VorlagenApache Storm templates

Die Data Lake-Tools für Visual Studio umfassen die folgenden Vorlagen:The Data Lake tools for Visual Studio provide the following templates:

ProjekttypProject type ZeigtDemonstrates
Storm-AnwendungStorm Application Ein leeres Projekt der Storm-Topologie.An empty Storm topology project.
Storm Azure SQL Writer-BeispielStorm Azure SQL Writer Sample So schreiben Sie in eine Azure SQL-Datenbank.How to write to Azure SQL Database.
Storm Azure Cosmos DB Reader – BeispielStorm Azure Cosmos DB Reader Sample So lesen Sie aus Azure Cosmos DB.How to read from Azure Cosmos DB.
Storm Azure Cosmos DB Writer – BeispielStorm Azure Cosmos DB Writer Sample So schreiben Sie in Azure Cosmos DB.How to write to Azure Cosmos DB.
Storm EventHub Reader-BeispielStorm EventHub Reader Sample So lesen Sie aus Azure Event Hubs.How to read from Azure Event Hubs.
Storm EventHub Writer-BeispielStorm EventHub Writer Sample So schreiben Sie in Azure Event Hubs.How to write to Azure Event Hubs.
Storm HBase Reader-BeispielStorm HBase Reader Sample So lesen Sie aus HBase auf HDInsight-Clustern.How to read from HBase on HDInsight clusters.
Storm HBase Writer-BeispielStorm HBase Writer Sample So schreiben Sie in HBase auf HDInsight-Clustern.How to write to HBase on HDInsight clusters.
Storm-Hybrid-BeispielStorm Hybrid Sample So verwenden Sie eine Java-Komponente.How to use a Java component.
Storm-BeispielStorm Sample Eine einfache Wortzählungstopologie.A basic word count topology.

Warnung

Nicht alle Vorlagen funktionieren mit Linux-basierten HDInsight-Clustern.Not all templates work with Linux-based HDInsight. Die von den Vorlagen verwendeten NuGet-Pakete sind möglicherweise nicht mit Mono kompatibel.NuGet packages used by the templates may not be compatible with Mono. Überprüfen Sie das Dokument Kompatibilität mit Mono, und verwenden Sie .NET Portability Analyzer, um potenzielle Probleme zu identifizieren.Check the Mono compatibility document and use the .NET Portability Analyzer to identify potential problems.

In den Schritten dieses Dokuments verwenden Sie das grundlegende Storm-Anwendungsprojekt, um eine Topologie zu erstellen.In the steps in this document, you use the basic Storm Application project type to create a topology.

Hinweise zu Apache HBase-VorlagenApache HBase templates notes

In den HBase Reader- und Writer-Vorlagen wird die HBase-REST-API verwendet, nicht die HBase-Java-API, um mit HBase auf einem HDInsight-Cluster zu kommunizieren.The HBase reader and writer templates use the HBase REST API, not the HBase Java API, to communicate with an HBase on HDInsight cluster.

Hinweise zu EventHub-VorlagenEventHub templates notes

Wichtig

Die Java-basierte EventHub-Spout-Komponente, die in der EventHub-Reader-Vorlage enthalten ist, funktioniert möglicherweise nicht mit Storm auf HDInsight Version 3.5 oder höher.The Java-based EventHub spout component included with the EventHub Reader template may not work with Storm on HDInsight version 3.5 or later. Eine aktualisierte Version dieser Komponente finden Sie unter GitHub.An updated version of this component is available at GitHub.

Ein Topologiebeispiel, die diese Komponente verwendet und mit Storm auf HDInsight 3.5 arbeitet, finden Sie unter GitHub.For an example topology that uses this component and works with Storm on HDInsight 3.5, see GitHub.

Erstellen einer C#-TopologieCreate a C# topology

  1. Öffnen Sie Visual Studio, wählen Sie Datei > Neu aus, und wählen Sie anschließend Projekt aus.Open Visual Studio, select File > New, and then select Project.

  2. Erweitern Sie auf dem Fenster Neues Projekt die Option Installiert > Vorlagen, und wählen Sie anschließend Azure Data Lake aus.From the New Project window, expand Installed > Templates, and select Azure Data Lake. Wählen Sie in der Liste der Vorlagen die Option Storm-Anwendungaus.From the list of templates, select Storm Application. Geben Sie unten im Bildschirm WordCount als Namen der Anwendung ein.At the bottom of the screen, enter WordCount as the name of the application.

    Screenshot des Fensters Neues Projekt

  3. Nachdem Sie das Projekt erstellt haben, sollten die folgenden Dateien vorliegen:After you have created the project, you should have the following files:

    • Program.cs: Diese Datei definiert die Topologie für Ihr Projekt.Program.cs: This file defines the topology for your project. Eine Standardtopologie, die aus einem Spout und einem Bolt besteht, wird standardmäßig erstellt.A default topology that consists of one spout and one bolt is created by default.

    • Spout.cs: Ein Beispiel-Spout, der Zufallszahlen ausgibt.Spout.cs: An example spout that emits random numbers.

    • Bolt.cs: Ein Beispiel-Bolt, der eine Anzahl der vom Spout ausgegebenen Zahlen aufnimmt.Bolt.cs: An example bolt that keeps a count of numbers emitted by the spout.

      Wenn Sie das Projekt erstellen, lädt NuGet das neueste SCP.NET-Paket herunter.When you create the project, NuGet downloads the latest SCP.NET package.

      Wichtig

      Die im Projekt verwendete SCP.NET-Version muss mit der Storm-Version in Ihrem HDInsight-Cluster übereinstimmen.The SCP.NET version used in your project must match the Storm version present on your HDInsight cluster. Ermitteln Sie anhand der folgenden Tabelle, welche Version Sie verwenden sollten:Use the following table to determine which version you should use:

      HDInsight-VersionHDInsight version Apache Storm-VersionApache Storm version SCP.NET-VersionSCP.NET version Mono-StandardversionDefault Mono version
      3.33.3 0.10.0.x0.10.0.x 0.10.0.x (nur Windows-basierte Cluster)0.10.0.x (Windows-based clusters only) Nicht verfügbarNA
      3.43.4 0.10.0.x0.10.0.x 0.10.0.x0.10.0.x 3.2.83.2.8
      3,53.5 1.0.2.x1.0.2.x 1.0.0.x1.0.0.x 4.2.14.2.1
      3.63.6 1.1.0.#1.1.0.# 1.0.0.x1.0.0.x 4.2.84.2.8

      Weitere Informationen zu den mit HDInsight bereitgestellten Komponenten finden Sie unter HDInsight-Komponentenversionen.For more information on components provided with HDInsight, see HDInsight component versions.

Implementieren des SpoutsImplement the spout

  1. Öffnen Sie Spout.cs.Open Spout.cs. Mithilfe der Spouts werden Daten aus einer externen Quelle in eine Topologie eingelesen.Spouts are used to read data in a topology from an external source. Wichtigste Komponenten für einen Spout:The main components for a spout are:

    • NextTuple: Wird von Storm aufgerufen, wenn der Spout neue Tupel ausgeben darf.NextTuple: Called by Storm when the spout is allowed to emit new tuples.

    • Ack (nur transaktionale Topologie): Verarbeitet Bestätigungen, die von anderen Komponenten in der Topologie initiiert wurden, für Tupel, die von dem Spout gesendet wurden.Ack (transactional topology only): Handles acknowledgements initiated by other components in the topology for tuples sent from the spout. Durch die Tupelbestätigung erfährt der Spout, dass die Verarbeitung durch nachgelagerte Komponenten erfolgreich ausgeführt wurde.Acknowledging a tuple lets the spout know that it was processed successfully by downstream components.

    • Fail (nur transaktionale Topologie): Verarbeitet Tupel, bei denen bei der Verarbeitung anderer Komponenten in der Topologie ein Fehler aufgetreten ist.Fail (transactional topology only): Handles tuples that are fail-processing other components in the topology. Das Implementieren einer Fail-Methode ermöglicht es Ihnen, das Tupel erneut auszugeben, sodass es erneut verarbeitet werden kann.Implementing a Fail method allows you to re-emit the tuple so that it can be processed again.

  2. Ersetzen Sie den Inhalt der Spout-Klasse durch folgenden Text: Dieses Spout gibt einen Satz willkürlich in die Topologie aus.Replace the contents of the Spout class with the following text: This spout randomly emits a sentence into the topology.

    private Context ctx;
    private Random r = new Random();
    string[] sentences = new string[] {
        "the cow jumped over the moon",
        "an apple a day keeps the doctor away",
        "four score and seven years ago",
        "snow white and the seven dwarfs",
        "i am at two with nature"
    };
    
    public Spout(Context ctx)
    {
        // Set the instance context
        this.ctx = ctx;
    
        Context.Logger.Info("Generator constructor called");
    
        // Declare Output schema
        Dictionary<string, List<Type>> outputSchema = new Dictionary<string, List<Type>>();
        // The schema for the default output stream is
        // a tuple that contains a string field
        outputSchema.Add("default", new List<Type>() { typeof(string) });
        this.ctx.DeclareComponentSchema(new ComponentStreamSchema(null, outputSchema));
    }
    
    // Get an instance of the spout
    public static Spout Get(Context ctx, Dictionary<string, Object> parms)
    {
        return new Spout(ctx);
    }
    
    public void NextTuple(Dictionary<string, Object> parms)
    {
        Context.Logger.Info("NextTuple enter");
        // The sentence to be emitted
        string sentence;
    
        // Get a random sentence
        sentence = sentences[r.Next(0, sentences.Length - 1)];
        Context.Logger.Info("Emit: {0}", sentence);
        // Emit it
        this.ctx.Emit(new Values(sentence));
    
        Context.Logger.Info("NextTuple exit");
    }
    
    public void Ack(long seqId, Dictionary<string, Object> parms)
    {
        // Only used for transactional topologies
    }
    
    public void Fail(long seqId, Dictionary<string, Object> parms)
    {
        // Only used for transactional topologies
    }
    

Implementieren der BoltsImplement the bolts

  1. Löschen Sie die vorhandene Datei Bolt.cs aus dem Projekt.Delete the existing Bolt.cs file from the project.

  2. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie Hinzufügen > Neues Element aus.In Solution Explorer, right-click the project, and select Add > New item. Wählen Sie in der Liste die Option Storm Bolt aus, und geben Sie Splitter.cs als Namen ein.From the list, select Storm Bolt, and enter Splitter.cs as the name. Wiederholen Sie diesen Vorgang, um einen zweiten Bolt namens Counter.cs zu erstellen.Repeat this process to create a second bolt named Counter.cs.

    • Splitter.cs: Implementiert einen Bolt, der Sätze in einzelne Wörter unterteilt und einen neuen Datenstrom von Wörtern ausgibt.Splitter.cs: Implements a bolt that splits sentences into individual words, and emits a new stream of words.

    • Counter.cs: Implementiert einen Bolt, der jedes Wort zählt und einen neuen Datenstrom von Wörtern sowie die Anzahl der einzelnen Wörter ausgibt.Counter.cs: Implements a bolt that counts each word, and emits a new stream of words and the count for each word.

      Hinweis

      Obwohl diese Bolts in Datenströme schreiben und aus diesen lesen, können Sie mithilfe eines Bolts auch mit einer Datenbank oder einem Dienst kommunizieren.These bolts read and write to streams, but you can also use a bolt to communicate with sources such as a database or service.

  3. Öffnen Sie Splitter.cs.Open Splitter.cs. Die Datei enthält standardmäßig nur eine Methode: Execute.It has only one method by default: Execute. Diese Execute-Methode wird aufgerufen, wenn der Bolt ein zu verarbeitendes Tupel empfängt.The Execute method is called when the bolt receives a tuple for processing. Hier können Sie eingehende Tupel lesen und verarbeiten sowie ausgehende Tupel ausgeben.Here, you can read and process incoming tuples, and emit outbound tuples.

  4. Ersetzen Sie den Inhalt der Splitter -Klasse durch folgenden Code:Replace the contents of the Splitter class with the following code:

    private Context ctx;
    
    // Constructor
    public Splitter(Context ctx)
    {
        Context.Logger.Info("Splitter constructor called");
        this.ctx = ctx;
    
        // Declare Input and Output schemas
        Dictionary<string, List<Type>> inputSchema = new Dictionary<string, List<Type>>();
        // Input contains a tuple with a string field (the sentence)
        inputSchema.Add("default", new List<Type>() { typeof(string) });
        Dictionary<string, List<Type>> outputSchema = new Dictionary<string, List<Type>>();
        // Outbound contains a tuple with a string field (the word)
        outputSchema.Add("default", new List<Type>() { typeof(string) });
        this.ctx.DeclareComponentSchema(new ComponentStreamSchema(inputSchema, outputSchema));
    }
    
    // Get a new instance of the bolt
    public static Splitter Get(Context ctx, Dictionary<string, Object> parms)
    {
        return new Splitter(ctx);
    }
    
    // Called when a new tuple is available
    public void Execute(SCPTuple tuple)
    {
        Context.Logger.Info("Execute enter");
    
        // Get the sentence from the tuple
        string sentence = tuple.GetString(0);
        // Split at space characters
        foreach (string word in sentence.Split(' '))
        {
            Context.Logger.Info("Emit: {0}", word);
            //Emit each word
            this.ctx.Emit(new Values(word));
        }
    
        Context.Logger.Info("Execute exit");
    }
    
  5. Öffnen Sie Counter.cs, und ersetzen Sie die Klasseninhalte durch folgenden Code:Open Counter.cs, and replace the class contents with the following code:

    private Context ctx;
    
    // Dictionary for holding words and counts
    private Dictionary<string, int> counts = new Dictionary<string, int>();
    
    // Constructor
    public Counter(Context ctx)
    {
        Context.Logger.Info("Counter constructor called");
        // Set instance context
        this.ctx = ctx;
    
        // Declare Input and Output schemas
        Dictionary<string, List<Type>> inputSchema = new Dictionary<string, List<Type>>();
        // A tuple containing a string field - the word
        inputSchema.Add("default", new List<Type>() { typeof(string) });
    
        Dictionary<string, List<Type>> outputSchema = new Dictionary<string, List<Type>>();
        // A tuple containing a string and integer field - the word and the word count
        outputSchema.Add("default", new List<Type>() { typeof(string), typeof(int) });
        this.ctx.DeclareComponentSchema(new ComponentStreamSchema(inputSchema, outputSchema));
    }
    
    // Get a new instance
    public static Counter Get(Context ctx, Dictionary<string, Object> parms)
    {
        return new Counter(ctx);
    }
    
    // Called when a new tuple is available
    public void Execute(SCPTuple tuple)
    {
        Context.Logger.Info("Execute enter");
    
        // Get the word from the tuple
        string word = tuple.GetString(0);
        // Do we already have an entry for the word in the dictionary?
        // If no, create one with a count of 0
        int count = counts.ContainsKey(word) ? counts[word] : 0;
        // Increment the count
        count++;
        // Update the count in the dictionary
        counts[word] = count;
    
        Context.Logger.Info("Emit: {0}, count: {1}", word, count);
        // Emit the word and count information
        this.ctx.Emit(Constants.DEFAULT_STREAM_ID, new List<SCPTuple> { tuple }, new Values(word, count));
        Context.Logger.Info("Execute exit");
    }
    

Definieren der TopologieDefine the topology

Spouts und Bolts werden in einem Diagramm angeordnet, das definiert, wie die Daten zwischen den Komponenten verlaufen.Spouts and bolts are arranged in a graph, which defines how the data flows between components. Bei dieser Topologie sieht das Diagramm folgendermaßen aus:For this topology, the graph is as follows:

Diagramm der Anordnung von Komponenten

Sätze werden vom Spout ausgegeben und an Instanzen des Splitter-Bolts verteilt.Sentences are emitted from the spout, and are distributed to instances of the Splitter bolt. Das Splitter-Bolt unterteilt Sätze in Wörter, die an das Counter-Bolt verteilt werden.The Splitter bolt breaks the sentences into words, which are distributed to the Counter bolt.

Da die Wortanzahl lokal in der Counter-Instanz gespeichert wird, sollten Sie sicherstellen, dass bestimmte Wörter an dieselbe Instanz des Counter-Bolts geleitet werden.Because word count is held locally in the Counter instance, you want to make sure that specific words flow to the same Counter bolt instance. Jede Instanz verfolgt bestimmte Wörter.Each instance keeps track of specific words. Seit der Splitter-Bolt keinen Zustand verwaltet, ist es unerheblich, welche Instanz des Splitters welchen Satz empfängt.Since the Splitter bolt maintains no state, it really doesn't matter which instance of the splitter receives which sentence.

Öffnen Sie die Datei Program.cs.Open Program.cs. Die entscheidende Methode ist GetTopologyBuilder, mit der die an Storm gesendete Topologie definiert wird.The important method is GetTopologyBuilder, which is used to define the topology that is submitted to Storm. Ersetzen Sie den Inhalt von GetTopologyBuilder durch Folgendes, um die zuvor beschriebene Topologie zu implementieren:Replace the contents of GetTopologyBuilder with the following code to implement the topology described previously:

// Create a new topology named 'WordCount'
TopologyBuilder topologyBuilder = new TopologyBuilder("WordCount" + DateTime.Now.ToString("yyyyMMddHHmmss"));

// Add the spout to the topology.
// Name the component 'sentences'
// Name the field that is emitted as 'sentence'
topologyBuilder.SetSpout(
    "sentences",
    Spout.Get,
    new Dictionary<string, List<string>>()
    {
        {Constants.DEFAULT_STREAM_ID, new List<string>(){"sentence"}}
    },
    1);
// Add the splitter bolt to the topology.
// Name the component 'splitter'
// Name the field that is emitted 'word'
// Use suffleGrouping to distribute incoming tuples
//   from the 'sentences' spout across instances
//   of the splitter
topologyBuilder.SetBolt(
    "splitter",
    Splitter.Get,
    new Dictionary<string, List<string>>()
    {
        {Constants.DEFAULT_STREAM_ID, new List<string>(){"word"}}
    },
    1).shuffleGrouping("sentences");

// Add the counter bolt to the topology.
// Name the component 'counter'
// Name the fields that are emitted 'word' and 'count'
// Use fieldsGrouping to ensure that tuples are routed
//   to counter instances based on the contents of field
//   position 0 (the word). This could also have been
//   List<string>(){"word"}.
//   This ensures that the word 'jumped', for example, will always
//   go to the same instance
topologyBuilder.SetBolt(
    "counter",
    Counter.Get,
    new Dictionary<string, List<string>>()
    {
        {Constants.DEFAULT_STREAM_ID, new List<string>(){"word", "count"}}
    },
    1).fieldsGrouping("splitter", new List<int>() { 0 });

// Add topology config
topologyBuilder.SetTopologyConfig(new Dictionary<string, string>()
{
    {"topology.kryo.register","[\"[B\"]"}
});

return topologyBuilder;

Übermitteln der TopologieSubmit the topology

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie An Storm in HDInsight übermitteln aus.In Solution Explorer, right-click the project, and select Submit to Storm on HDInsight.

    Hinweis

    Wenn Sie dazu aufgefordert werden, geben Sie die Anmeldeinformationen für Ihr Azure-Abonnement ein.If prompted, enter the credentials for your Azure subscription. Wenn Sie über mehrere Abonnements verfügen, melden Sie sich bei dem Abonnement an, das Ihren Storm-Cluster in HDInsight enthält.If you have more than one subscription, sign in to the one that contains your Storm on HDInsight cluster.

  2. Wählen Sie in der Dropdownliste Storm Cluster Ihren Storm-Cluster in HDInsight und dann die Option Übermitteln aus.Select your Storm on HDInsight cluster from the Storm Cluster drop-down list, and then select Submit. Sie können über das Fenster Ausgabe überwachen, ob die Übermittlung erfolgreich ausgeführt wurde.You can monitor if the submission is successful by using the Output window.

  3. Sobald die Topologie erfolgreich übermittelt wurde, sollten die Storm-Topologien für den Cluster angezeigt werden.When the topology has been successfully submitted, the Storm Topologies for the cluster should appear. Wählen Sie die WordCount -Topologie in der Liste aus, um Informationen zur aktiven Topologie anzuzeigen.Select the WordCount topology from the list to view information about the running topology.

    Hinweis

    Sie können sich Storm-Topologien auch über den Server-Explorer anzeigen lassen.You can also view Storm Topologies from Server Explorer. Erweitern Sie Azure > HDInsight, klicken Sie mit der rechten Maustaste auf einen Storm im HDInsight-Cluster, und wählen Sie anschließend Storm-Topologien anzeigen aus.Expand Azure > HDInsight, right-click a Storm on HDInsight cluster, and then select View Storm Topologies.

    Doppelklicken Sie auf die Komponente im Diagramm, um Informationen zu den Komponenten in der Topologie anzuzeigen.To view information about the components in the topology, double-click the component in the diagram.

  4. Wählen Sie in der Ansicht Topologiezusammenfassung die Option Beenden aus, um die Topologie zu beenden.From the Topology Summary view, click Kill to stop the topology.

    Hinweis

    Storm-Topologien werden weiterhin ausgeführt, bis sie deaktiviert werden oder der Cluster gelöscht wird.Storm topologies continue to run until they are deactivated, or the cluster is deleted.

Transaktionale TopologieTransactional topology

Die vorherige Topologie ist nicht transaktional.The previous topology is non-transactional. Die Komponenten in der Topologie implementieren keine Funktionalität zum Wiedergeben von Meldungen.The components in the topology do not implement functionality to replaying messages. Erstellen Sie für ein Beispiel einer transaktionalen Topologie ein Projekt, und wählen Sie Storm Sample (Storm-Beispiel) als Projekttyp aus.For an example of a transactional topology, create a project and select Storm Sample as the project type.

Transaktionale Topologien implementieren Folgendes, um die Wiedergabe von Daten zu unterstützen:Transactional topologies implement the following to support replay of data:

  • Metadaten-Zwischenspeicherung: Der Spout muss Metadaten zu den ausgegebenen Daten speichern, damit die Daten bei einem auftretenden Fehler erneut abgerufen und ausgegeben werden können.Metadata caching: The spout must store metadata about the data emitted, so that the data can be retrieved and emitted again if a failure occurs. Da die in diesem Beispiel ausgegebene Datenmenge klein ist, werden die Rohdaten der einzelnen Tupel zur Wiedergabe in einem Wörterbuch gespeichert.Because the data emitted by the sample is small, the raw data for each tuple is stored in a dictionary for replay.

  • Ack: Jeder Bolt in der Topologie kann this.ctx.Ack(tuple) aufrufen, um die erfolgreiche Verarbeitung eines Tupels zu bestätigen.Ack: Each bolt in the topology can call this.ctx.Ack(tuple) to acknowledge that it has successfully processed a tuple. Nachdem das Tupel von allen Bolts bestätigt wurde, wird die Ack -Methode des Spouts aufgerufen.When all bolts have acknowledged the tuple, the Ack method of the spout is invoked. Die Ack-Methode ermöglicht dem Spout die Entfernung von Daten, die für die Wiedergabe zwischengespeichert wurden.The Ack method allows the spout to remove data that was cached for replay.

  • Fail: Jeder Bolt kann this.ctx.Fail(tuple) aufrufen, um anzuzeigen, dass bei der Verarbeitung eines Tupels ein Fehler aufgetreten ist.Fail: Each bolt can call this.ctx.Fail(tuple) to indicate that processing has failed for a tuple. Der Fehler wird an die Fail -Methode des Spouts weitergegeben, wo das Tupel mithilfe der zwischengespeicherten Daten wiedergegeben werden kann.The failure propagates to the Fail method of the spout, where the tuple can be replayed by using cached metadata.

  • Sequence ID: Beim Ausgeben eines Tupels kann eine eindeutige Sequenz-ID angegeben werden.Sequence ID: When emitting a tuple, a unique sequence ID can be specified. Der Wert identifiziert das Tupel für die Wiedergabeverarbeitung („Bestätigung“ und „Fehler“).This value identifies the tuple for replay (Ack and Fail) processing. Der Spout im Projekt Storm-Beispiel verwendet z.B. Folgendes beim Ausgeben von Daten:For example, the spout in the Storm Sample project uses the following when emitting data:

      this.ctx.Emit(Constants.DEFAULT_STREAM_ID, new Values(sentence), lastSeqId);
    

    Dieser Code gibt einen Tupel aus, das einen Satz im Standarddatenstrom enthält, wobei der Sequenz-ID-Wert in lastSeqIdenthalten ist.This code emits a tuple that contains a sentence to the default stream, with the sequence ID value contained in lastSeqId. In diesem Beispiel wird lastSeqId für jedes ausgegebene Tupel erhöht.For this example, lastSeqId is incremented for every tuple emitted.

Wie im Projekt Storm Sample (Storm-Beispiel) veranschaulicht, kann zur Laufzeit auf Basis der Konfiguration angegeben werden, ob es sich um eine transaktionale Komponente handelt.As demonstrated in the Storm Sample project, whether a component is transactional can be set at runtime, based on configuration.

Hybridtopologie mit C# und JavaHybrid topology with C# and Java

Sie können auch Data Lake-Tools für Visual Studio zum Erstellen von hybriden Topologien verwenden, bei denen einige Komponenten C# und andere Java sind.You can also use Data Lake tools for Visual Studio to create hybrid topologies, where some components are C# and others are Java.

Erstellen Sie für ein Beispiel einer hybriden Topologie ein Projekt, und wählen Sie Storm Hybrid Sample (Storm-Hybrid-Beispiel) aus.For an example of a hybrid topology, create a project and select Storm Hybrid Sample. Dieser Beispieltyp veranschaulicht die folgenden Konzepte:This sample type demonstrates the following concepts:

  • Java-Spout und C#-Bolt: Definition in HybridTopology_javaSpout_csharpBolt.Java spout and C# bolt: Defined in HybridTopology_javaSpout_csharpBolt.

    • Eine transaktionale Version ist in HybridTopologyTx_javaSpout_csharpBolt definiert.A transactional version is defined in HybridTopologyTx_javaSpout_csharpBolt.
  • C#-Spout und Java-Bolt: Definition in HybridTopology_csharpSpout_javaBolt.C# spout and Java bolt: Defined in HybridTopology_csharpSpout_javaBolt.

    • Eine transaktionale Version ist in HybridTopologyTx_csharpSpout_javaBolt definiert.A transactional version is defined in HybridTopologyTx_csharpSpout_javaBolt.

    Hinweis

    Diese Version veranschaulicht zudem, wie Sie Clojure-Code aus einer Textdatei als Java-Komponente verwenden.This version also demonstrates how to use Clojure code from a text file as a Java component.

Um die Topologie zu wechseln, die beim Übermitteln des Projekts verwendet wird, verschieben Sie vor der Übermittlung an den Cluster die Anweisung [Active(true)] in die Topologie, die Sie verwenden möchten.To switch the topology that is used when the project is submitted, move the [Active(true)] statement to the topology you want to use, before submitting it to the cluster.

Hinweis

Alle erforderliche Java-Dateien werden im Rahmen dieses Projekts im Ordner JavaDependency bereitgestellt.All the Java files that are required are provided as part of this project in the JavaDependency folder.

Bedenken Sie beim Erstellen und Übermitteln einer hybriden Topologie Folgendes:Consider the following when you are creating and submitting a hybrid topology:

  • Verwenden Sie JavaComponentConstructor, um eine Instanz der Java-Klasse für einen Spout oder Bolt zu erstellen.Use JavaComponentConstructor to create an instance of the Java class for a spout or bolt.

  • Verwenden Sie microsoft.scp.storm.multilang.CustomizedInteropJSONSerializer zum Serialisieren von Daten in bzw. aus Java-Komponenten von Java-Objekten zu JSON.Use microsoft.scp.storm.multilang.CustomizedInteropJSONSerializer to serialize data into or out of Java components from Java objects to JSON.

  • Beim Übermitteln der Topologie an den Server müssen Sie die Option Zusätzliche Konfigurationen verwenden, um die Java-Dateipfade anzugeben.When submitting the topology to the server, you must use the Additional configurations option to specify the Java File paths. Der angegebene Pfad muss sich in dem Verzeichnis befinden, das die JAR-Dateien mit den Java-Klassen enthält.The path specified should be the directory that contains the JAR files that contain your Java classes.

Azure Event HubsAzure Event Hubs

SCP.Net Version 0.9.4.203 bietet eine neue Klasse und Methode speziell für die Arbeit mit dem Event Hub-Spout (ein Java-Spout, der von Event Hub liest).SCP.NET version 0.9.4.203 introduces a new class and method specifically for working with the Event Hub spout (a Java spout that reads from Event Hubs). Verwenden Sie die folgenden Methoden beim Erstellen einer Topologie, die einen Event Hub-Spout verwendet:When you create a topology that uses an Event Hub spout, use the following methods:

  • EventHubSpoutConfig-Klasse: Erstellt ein Objekt, das die Konfiguration für die Spout-Komponente enthält.EventHubSpoutConfig class: Creates an object that contains the configuration for the spout component.

  • TopologyBuilder.SetEventHubSpout-Methode: Fügt die Event Hub-Spout-Komponente der Topologie hinzu.TopologyBuilder.SetEventHubSpout method: Adds the Event Hub spout component to the topology.

Hinweis

Sie müssen CustomizedInteropJSONSerializer weiterhin zum Serialisieren von Spout erzeugten Daten verwenden.You must still use the CustomizedInteropJSONSerializer to serialize data produced by the spout.

Verwenden von ConfigurationManagerUse ConfigurationManager

Verwenden Sie ConfigurationManager nicht zum Abrufen von Konfigurationswerten aus Bolt- und Spout-Komponenten.Don't use ConfigurationManager to retrieve configuration values from bolt and spout components. Dies kann zu einer NULL-Zeigerausnahme führen.Doing so can cause a null pointer exception. Stattdessen wird die Konfiguration für das Projekt in der Storm-Topologie als Schlüssel- und Wertpaar im Topologiekontext übergeben.Instead, the configuration for your project is passed into the Storm topology as a key and value pair in the topology context. Jede Komponente, die von Konfigurationswerten abhängig ist, muss sie während der Initialisierung aus dem Kontext abrufen.Each component that relies on configuration values must retrieve them from the context during initialization.

Der folgende Code veranschaulicht, wie diese Werte abgerufen werden:The following code demonstrates how to retrieve these values:

public class MyComponent : ISCPBolt
{
    // To hold configuration information loaded from context
    Configuration configuration;
    ...
    public MyComponent(Context ctx, Dictionary<string, Object> parms)
    {
        // Save a copy of the context for this component instance
        this.ctx = ctx;
        // If it exists, load the configuration for the component
        if(parms.ContainsKey(Constants.USER_CONFIG))
        {
            this.configuration = parms[Constants.USER_CONFIG] as System.Configuration.Configuration;
        }
        // Retrieve the value of "Foo" from configuration
        var foo = this.configuration.AppSettings.Settings["Foo"].Value;
    }
    ...
}

Bei Verwendung einer Get-Methode zum Zurückgeben einer Instanz Ihrer Komponente müssen Sie sicherstellen, dass die beiden Parameter Context und Dictionary<string, Object> an den Konstruktor übergeben werden.If you use a Get method to return an instance of your component, you must ensure that it passes both the Context and Dictionary<string, Object> parameters to the constructor. Das folgende Beispiel ist eine einfache Get-Methode, die diese Werte ordnungsgemäß übergibt:The following example is a basic Get method that properly passes these values:

public static MyComponent Get(Context ctx, Dictionary<string, Object> parms)
{
    return new MyComponent(ctx, parms);
}

Gewusst wie: Aktualisieren von SCP.NETHow to update SCP.NET

Neuere Versionen von SCP.NET unterstützen die Paketaktualisierung über NuGet.Recent releases of SCP.NET support package upgrade through NuGet. Wenn ein neues Update verfügbar ist, erhalten Sie eine Upgradebenachrichtigung.When a new update is available, you receive an upgrade notification. Gehen Sie wie folgt vor, um eine Überprüfung auf ein Upgrade manuell durchzuführen:To manually check for an upgrade, follow these steps:

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie NuGet-Pakete verwalten aus.In Solution Explorer, right-click the project, and select Manage NuGet Packages.

  2. Wählen Sie im Paket-Manager die Option Updates.From the package manager, select Updates. Wenn ein Update verfügbar ist, wird es aufgeführt.If an update is available, it is listed. Klicken Sie auf Aktualisieren, damit das Paket es installiert.Click Update for the package to install it.

Wichtig

Wenn Ihr Projekt mit einer früheren Versionen von SCP.NET erstellt wurde, bei denen NuGet nicht verwendet wurde, müssen Sie zum Aktualisieren auf eine neuere Version die folgenden Schritte ausführen:If your project was created with an earlier version of SCP.NET that did not use NuGet, you must perform the following steps to update to a newer version:

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie NuGet-Pakete verwalten aus.In Solution Explorer, right-click the project, and select Manage NuGet Packages.
  2. Suchen Sie über das Feld Suche nach Microsoft.SCP.Net.SDK, und fügen Sie es dem Projekt hinzu.Using the Search field, search for, and then add, Microsoft.SCP.Net.SDK to the project.

Problembehandlung für allgemeine Probleme mit TopologienTroubleshoot common issues with topologies

NULL-ZeigerausnahmenNull pointer exceptions

Wenn Sie eine C#-Topologie mit einem Linux-basierten HDInsight-Cluster verwenden, können Bolt- und Spout-Komponenten, die zum Lesen von Konfigurationseinstellungen zur Laufzeit ConfigurationManager nutzen, NULL-Zeigerausnahmen zurückgeben.When you are using a C# topology with a Linux-based HDInsight cluster, bolt and spout components that use ConfigurationManager to read configuration settings at runtime may return null pointer exceptions.

Die Konfiguration wird für das Projekt in der Storm-Topologie als Schlüssel- und Wertpaar im Topologiekontext übergeben.The configuration for your project is passed into the Storm topology as a key and value pair in the topology context. Es kann über das Dictionary-Objekt abgerufen werden, das von Komponenten übergeben wird, wenn sie initialisiert werden.It can be retrieved from the dictionary object that is passed to your components when they are initialized.

Weitere Informationen finden Sie im Abschnitt ConfigurationManager dieses Dokuments.For more information, see the ConfigurationManager section of this document.

System.TypeLoadExceptionSystem.TypeLoadException

Wenn Sie eine C#-Topologie mit einem Linux-basierten HDInsight-Cluster verwenden, kann der folgende Fehler auftreten:When you are using a C# topology with a Linux-based HDInsight cluster, you may encounter the following error:

System.TypeLoadException: Failure has occurred while loading a type.

Dieser Fehler geschieht wenn Sie eine Binärdatei verwenden, die nicht mit der Version von .NET kompatibel ist, die Mono unterstützt.This error occurs when you use a binary that is not compatible with the version of .NET that Mono supports.

Stellen Sie bei Linux-basierten HDInsight-Clustern sicher, dass das Projekt für .NET 4.5 kompilierte Binärdateien verwendet.For Linux-based HDInsight clusters, make sure that your project uses binaries compiled for .NET 4.5.

Lokales Testen einer TopologieTest a topology locally

Obwohl es relativ einfach ist, eine Topologie in einem Cluster bereitzustellen, müssen Sie eine Topologie möglicherweise auch lokal testen.Although it is easy to deploy a topology to a cluster, in some cases, you may need to test a topology locally. Gehen Sie wie folgt vor, um die Beispieltopologie in diesem Lernprogramm lokal in Ihrer Entwicklungsumgebung auszuführen und zu testen.Use the following steps to run and test the example topology in this tutorial locally in your development environment.

Warnung

Lokale Tests funktionieren nur für einfache C#-Topologien.Local testing only works for basic, C#-only topologies. Sie können keine lokalen Tests für hybride Topologien verwenden oder für Topologien, in denen mehrere Streams verwendet werden.You cannot use local testing for hybrid topologies or topologies that use multiple streams.

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie Eigenschaften aus.In Solution Explorer, right-click the project, and select Properties. Wählen Sie in den Projekteigenschaften für Ausgabetyp die Option Konsolenanwendung aus.In the project properties, change the Output type to Console Application.

    Bildschirmabbildung von Projekteigenschaften mit hervorgehobenem Ausgabetyp

    Hinweis

    Denken Sie daran, für den Ausgabetyp später wieder Klassenbibliothek festzulegen, bevor die Topologie in einem Cluster bereitgestellt wird.Remember to change the Output type back to Class Library before you deploy the topology to a cluster.

  2. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie dann Hinzufügen > Neues Element aus.In Solution Explorer, right-click the project, and then select Add > New Item. Wählen Sie Klasse aus, und geben Sie LocalTest.cs als Klassennamen ein.Select Class, and enter LocalTest.cs as the class name. Klicken Sie abschließend auf Hinzufügen.Finally, click Add.

  3. Öffnen Sie die Datei LocalTest.cs, und fügen Sie die folgende using-Anweisung am Anfang hinzu:Open LocalTest.cs, and add the following using statement at the top:

    using Microsoft.SCP;
    
  4. Fügen Sie den folgenden Code als Inhalt in die LocalTest-Klasse ein:Use the following code as the contents of the LocalTest class:

    // Drives the topology components
    public void RunTestCase()
    {
        // An empty dictionary for use when creating components
        Dictionary<string, Object> emptyDictionary = new Dictionary<string, object>();
    
        #region Test the spout
        {
            Console.WriteLine("Starting spout");
            // LocalContext is a local-mode context that can be used to initialize
            // components in the development environment.
            LocalContext spoutCtx = LocalContext.Get();
            // Get a new instance of the spout, using the local context
            Spout sentences = Spout.Get(spoutCtx, emptyDictionary);
    
            // Emit 10 tuples
            for (int i = 0; i < 10; i++)
            {
                sentences.NextTuple(emptyDictionary);
            }
            // Use LocalContext to persist the data stream to file
            spoutCtx.WriteMsgQueueToFile("sentences.txt");
            Console.WriteLine("Spout finished");
        }
        #endregion
    
        #region Test the splitter bolt
        {
            Console.WriteLine("Starting splitter bolt");
            // LocalContext is a local-mode context that can be used to initialize
            // components in the development environment.
            LocalContext splitterCtx = LocalContext.Get();
            // Get a new instance of the bolt
            Splitter splitter = Splitter.Get(splitterCtx, emptyDictionary);
    
            // Set the data stream to the data created by the spout
            splitterCtx.ReadFromFileToMsgQueue("sentences.txt");
            // Get a batch of tuples from the stream
            List<SCPTuple> batch = splitterCtx.RecvFromMsgQueue();
            // Process each tuple in the batch
            foreach (SCPTuple tuple in batch)
            {
                splitter.Execute(tuple);
            }
            // Use LocalContext to persist the data stream to file
            splitterCtx.WriteMsgQueueToFile("splitter.txt");
            Console.WriteLine("Splitter bolt finished");
        }
        #endregion
    
        #region Test the counter bolt
        {
            Console.WriteLine("Starting counter bolt");
            // LocalContext is a local-mode context that can be used to initialize
            // components in the development environment.
            LocalContext counterCtx = LocalContext.Get();
            // Get a new instance of the bolt
            Counter counter = Counter.Get(counterCtx, emptyDictionary);
    
            // Set the data stream to the data created by splitter bolt
            counterCtx.ReadFromFileToMsgQueue("splitter.txt");
            // Get a batch of tuples from the stream
            List<SCPTuple> batch = counterCtx.RecvFromMsgQueue();
            // Process each tuple in the batch
            foreach (SCPTuple tuple in batch)
            {
                counter.Execute(tuple);
            }
            // Use LocalContext to persist the data stream to file
            counterCtx.WriteMsgQueueToFile("counter.txt");
            Console.WriteLine("Counter bolt finished");
        }
        #endregion
    }
    

    Nehmen Sie sich einen Moment Zeit, um die Codekommentare zu lesen.Take a moment to read through the code comments. Dieser Code verwendet LocalContext , um die Komponenten in der Entwicklungsumgebung auszuführen, wobei der Datenstrom zwischen den Komponenten in Textdateien auf dem lokalen Laufwerk bestehen bleibt.This code uses LocalContext to run the components in the development environment, and it persists the data stream between components to text files on the local drive.

  5. Öffnen Sie die Datei Program.cs, und fügen Sie der Methode Main Folgendes hinzu:Open Program.cs, and add the following to the Main method:

    Console.WriteLine("Starting tests");
    System.Environment.SetEnvironmentVariable("microsoft.scp.logPrefix", "WordCount-LocalTest");
    // Initialize the runtime
    SCPRuntime.Initialize();
    
    //If we are not running under the local context, throw an error
    if (Context.pluginType != SCPPluginType.SCP_NET_LOCAL)
    {
        throw new Exception(string.Format("unexpected pluginType: {0}", Context.pluginType));
    }
    // Create test instance
    LocalTest tests = new LocalTest();
    // Run tests
    tests.RunTestCase();
    Console.WriteLine("Tests finished");
    Console.ReadKey();
    
  6. Speichern Sie die Änderungen, und klicken Sie dann auf F5 oder wählen Sie Debuggen > Debugging starten aus, um das Projekt zu starten.Save the changes, and then click F5 or select Debug > Start Debugging to start the project. Daraufhin sollte ein Konsolenfenster angezeigt und mit fortschreitendem Test der Status protokolliert werden.A console window should appear, and log status as the tests progress. Nachdem Tests abgeschlossen angezeigt wurde, drücken Sie eine beliebige Taste, um das Fenster zu schließen.When Tests finished appears, press any key to close the window.

  7. Verwenden Sie Windows Explorer, um das Verzeichnis zu suchen, welches das Projekt enthält.Use Windows Explorer to locate the directory that contains your project. Beispiel: C:\Benutzer<Ihr_Benutzername>\Dokumente\Visual Studio 2013\Projects\WordCount\WordCount.For example: C:\Users<your_user_name>\Documents\Visual Studio 2013\Projects\WordCount\WordCount. Öffnen Sie in diesem Verzeichnis das Unterverzeichnis Bin, und klicken Sie dann auf Debug.In this directory, open Bin, and then click Debug. Es sollten die beim Ausführen der Tests erstellten Textdateien vorhanden sein: "sentences.txt", "counter.txt" und "splitter.txt".You should see the text files that were produced when the tests ran: sentences.txt, counter.txt, and splitter.txt. Öffnen Sie die einzelnen Textdateien, und überprüfen Sie die Daten.Open each text file and inspect the data.

    Hinweis

    Zeichenfolgendaten bleiben in diesen Dateien als Array von Dezimalwerten erhalten.String data persists as an array of decimal values in these files. Beispiel: [[97,103,111]] in der Datei splitter.txt entspricht dem Wort and.For example, [[97,103,111]] in the splitter.txt file is the word and.

Hinweis

Vergewissern Sie sich, dass Sie für den Projekttyp vor der Bereitstellung in einem Storm in HDInsight-Cluster wieder Klassenbibliothek festlegen.Be sure to set the Project type back to Class Library before deploying to a Storm on HDInsight cluster.

Protokollieren von InformationenLog information

Sie können Informationen aus den Topologiekomponenten problemlos mithilfe von Context.Logger protokollieren.You can easily log information from your topology components by using Context.Logger. Der folgende Befehl generiert beispielsweise einen informativen Protokolleintrag:For example, the following command creates an informational log entry:

Context.Logger.Info("Component started");

Protokollierte Informationen können über das Hadoop-Dienstprotokoll angezeigt werden, das sich im Server-Explorer befindet.Logged information can be viewed from the Hadoop Service Log, which is found in Server Explorer. Erweitern Sie den Eintrag für Ihren Storm-Cluster in HDInsight, und erweitern Sie anschließend das Hadoop-Dienstprotokoll.Expand the entry for your Storm on HDInsight cluster, and then expand Hadoop Service Log. Wählen Sie abschließend die anzuzeigende Protokolldatei aus.Finally, select the log file to view.

Hinweis

Die Protokolle werden in dem Azure-Speicherkonto gespeichert, das von Ihrem Cluster verwendet wird.The logs are stored in the Azure storage account that is used by your cluster. Zum Anzeigen der Protokolle in Visual Studio müssen Sie sich beim Azure-Abonnement anmelden, welches das Speicherkonto besitzt.To view the logs in Visual Studio, you must sign in to the Azure subscription that owns the storage account.

Anzeigen von FehlerinformationenView error information

Gehen Sie wie folgt vor, um die Fehler anzuzeigen, die in einer aktiven Topologie aufgetreten sind:To view errors that have occurred in a running topology, use the following steps:

  1. Klicken Sie im Server-Explorer mit der rechten Maustaste auf den Storm in HDInsight-Cluster, und wählen Sie Storm-Topologien anzeigen aus.From Server Explorer, right-click the Storm on HDInsight cluster, and select View Storm topologies.

  2. Für Spout und Bolts enthält die Spalte Letzter Fehler die Informationen zum letzten Fehler.For the Spout and Bolts, the Last Error column contains information on the last error.

  3. Wählen Sie die Spout-ID oder Bolt-ID für die Komponente aus, für die ein Fehler aufgeführt ist.Select the Spout Id or Bolt Id for the component that has an error listed. Auf der angezeigten Detailseite werden am unteren Rand zusätzliche Fehlerinformationen im Abschnitt Fehler aufgeführt.On the details page that is displayed, additional error information is listed in the Errors section at the bottom of the page.

  4. Um weitere Informationen zu erhalten, wählen Sie einen Port im Abschnitt Executor aus, um das Storm-Arbeitsprotokoll für die letzten Minuten anzuzeigen.To obtain more information, select a Port from the Executors section of the page, to see the Storm worker log for the last few minutes.

Fehler beim Übermitteln von TopologienErrors submitting topologies

Wenn beim Übermitteln einer Topologie an HDInsight Fehler auftreten, stehen Ihnen Protokolle für die serverseitigen Komponenten zur Verfügung, die die Übermittlung von Topologien auf Ihren HDInsight-Cluster behandeln.If you encounter errors submitting a topology to HDInsight, you can find logs for the server-side components that handle topology submission on your HDInsight cluster. Verwenden Sie zum Abrufen dieser Protokolle über die Befehlszeile den folgenden Befehl:To retrieve these logs, use the following command from a command line:

scp sshuser@clustername-ssh.azurehdinsight.net:/var/log/hdinsight-scpwebapi/hdinsight-scpwebapi.out .

Ersetzen Sie sshuser durch das SSH-Benutzerkonto für den Cluster.Replace sshuser with the SSH user account for the cluster. Ersetzen Sie clustername durch den Namen des HDInsight-Clusters.Replace clustername with the name of the HDInsight cluster. Weitere Informationen zum Verwenden von scp und ssh mit HDInsight finden Sie unter Verwenden von SSH mit HDInsight.For more information on using scp and ssh with HDInsight, see Use SSH with HDInsight.

Übermittlungen können aus mehreren Gründen fehlschlagen:Submissions can fail for multiple reasons:

  • JDK ist nicht installiert oder nicht im Pfad.JDK is not installed or is not in the path.
  • Erforderliche Java-Abhängigkeiten sind nicht in der Übermittlung enthalten.Required Java dependencies are not included in the submission.
  • Inkompatible Abhängigkeiten.Incompatible dependencies.
  • Doppelte Topologienamen.Duplicate topology names.

Wenn das Protokoll hdinsight-scpwebapi.out eine FileNotFoundException enthält, ist dies möglicherweise auf die folgenden Bedingungen zurückzuführen:If the hdinsight-scpwebapi.out log contains a FileNotFoundException, this might be caused by the following conditions:

  • Das JDK befindet sich nicht im Pfad in der Entwicklungsumgebung.The JDK is not in the path on the development environment. Stellen Sie sicher, dass das JDK in der Entwicklungsumgebung installiert ist und dass %JAVA_HOME%/bin sich im Pfad befindet.Verify that the JDK is installed in the development environment, and that %JAVA_HOME%/bin is in the path.
  • Ihnen fehlt eine Java-Abhängigkeit.You are missing a Java dependency. Stellen Sie sicher, dass Sie alle erforderlichen JAR-Dateien als Teil der Übermittlung einschließen.Make sure you are including any required .jar files as part of the submission.

Nächste SchritteNext steps

Ein Beispiel der Verarbeitung von Daten von Event Hubs finden Sie unter Verarbeitung von Ereignissen von Azure-Event-Hubs mit Storm auf HDInsight.For an example of processing data from Event Hubs, see Process events from Azure Event Hubs with Storm on HDInsight.

Ein Beispiel einer C#-Topologie, die Streamdaten in mehrere Datenströme aufteilt, finden Sie unter C# Storm example(in englischer Sprache).For an example of a C# topology that splits stream data into multiple streams, see C# Storm example.

Weitere Informationen zum Erstellen der C#-Topologien finden Sie unter GitHub.To discover more information about creating C# topologies, see GitHub.

Weitere Möglichkeiten zum Arbeiten mit HDInsight sowie weitere Beispiele für Storm in HDInsight finden Sie in folgenden Dokumenten:For more ways to work with HDInsight and more Storm on HDInsight samples, see the following documents:

Microsoft SCP.NETMicrosoft SCP.NET

Apache Storm in HDInsightApache Storm on HDInsight

Apache Hadoop in HDInsightApache Hadoop on HDInsight

Apache HBase in HDInsightApache HBase on HDInsight