Entwickeln von Apache Storm-Topologien mit Python in HDInsightDevelop Apache Storm topologies using Python on HDInsight

Erfahren Sie, wie Sie eine Apache Storm-Topologie erstellen, die Python-Komponenten verwendet.Learn how to create an Apache Storm topology that uses Python components. Apache Storm unterstützt mehrere Sprachen und ermöglicht sogar das Kombinieren von Komponenten in verschiedenen Sprachen in einer Topologie.Apache Storm supports multiple languages, even allowing you to combine components from several languages in one topology. Mit dem (mit Storm 0.10.0 eingeführten) Flux-Framework können Sie problemlos Lösungen erstellen, die Python-Komponenten verwenden.The Flux framework (introduced with Storm 0.10.0) allows you to easily create solutions that use Python components.

Wichtig

Die Informationen in diesem Dokument wurden mit Storm unter HDInsight 3.6 getestet.The information in this document was tested using Storm on HDInsight 3.6. Linux ist das einzige Betriebssystem, das unter HDInsight Version 3.4 oder höher verwendet wird.Linux is the only operating system used on HDInsight version 3.4 or greater. Weitere Informationen finden Sie unter Welche Hadoop-Komponenten und -Versionen sind in HDInsight verfügbar?.For more information, see HDInsight retirement on Windows.

Der Code für dieses Projekt ist verfügbar unter https://github.com/Azure-Samples/hdinsight-python-storm-wordcount.The code for this project is available at https://github.com/Azure-Samples/hdinsight-python-storm-wordcount.

VoraussetzungenPrerequisites

  • Python 2.7 oder höherPython 2.7 or higher

  • Java JDK 1.8 oder höherJava JDK 1.8 or higher

  • Apache Maven 3Apache Maven 3

  • (Optional) Eine lokale Storm-Entwicklungsumgebung.(Optional) A local Storm development environment. Eine lokale Storm-Umgebung ist nur erforderlich, wenn die Topologie lokal ausgeführt werden soll.A local Storm environment is only needed if you want to run the topology locally. Weitere Informationen finden Sie unter Setting up a development environment (Einrichten einer Entwicklungsumgebung).For more information, see Setting up a development environment.

Storm-Unterstützung für mehrere SprachenStorm multi-language support

Apache Storm wurde für den Einsatz mit Komponenten entwickelt, die in einer beliebigen Programmiersprache geschrieben wurden.Apache Storm was designed to work with components written using any programming language. Die Komponenten müssen mit der Thrift-Definition für Storm umgehen können.The components must understand how to work with the Thrift definition for Storm. Für Python wird ein Modul als Teil des Apache Storm-Projekts bereitgestellt, das Ihnen eine problemlose Verknüpfung mit Storm ermöglicht.For Python, a module is provided as part of the Apache Storm project that allows you to easily interface with Storm. Sie finden dieses Modul unter https://github.com/apache/storm/blob/master/storm-multilang/python/src/main/resources/resources/storm.py.You can find this module at https://github.com/apache/storm/blob/master/storm-multilang/python/src/main/resources/resources/storm.py.

Storm ist ein Java-Prozess, der auf der Java Virtual Machine (JVM) ausgeführt wird.Storm is a Java process that runs on the Java Virtual Machine (JVM). In anderen Sprachen geschriebene Komponenten werden als Unterprozesse ausgeführt.Components written in other languages are executed as subprocesses. Storm kommuniziert mit diesen Unterprozessen über JSON-Meldungen, die über „stdin/stdout“ gesendet werden.The Storm communicates with these subprocesses using JSON messages sent over stdin/stdout. Weitere Informationen zur Kommunikation zwischen Komponenten finden Sie in der Dokumentation zum Multi-Lang Protocol .More details on communication between components can be found in the Multi-lang Protocol documentation.

Python mit dem Flux-FrameworkPython with the Flux framework

Mit dem Flux-Framework können Sie Storm-Topologien von den Komponenten getrennt definieren.The Flux framework allows you to define Storm topologies separately from the components. Das Flux-Framework verwendet YAML, um die Storm-Topologie zu definieren.The Flux framework uses YAML to define the Storm topology. Der folgende Text zeigt, wie im YAML-Dokument auf eine Python-Komponente verwiesen wird:The following text is an example of how to reference a Python component in the YAML document:

# Spout definitions
spouts:
  - id: "sentence-spout"
    className: "org.apache.storm.flux.wrappers.spouts.FluxShellSpout"
    constructorArgs:
      # Command line
      - ["python", "sentencespout.py"]
      # Output field(s)
      - ["sentence"]
    # parallelism hint
    parallelism: 1

Die Klasse FluxShellSpout dient zum Starten des sentencespout.py-Skripts, das den Spout implementiert.The class FluxShellSpout is used to start the sentencespout.py script that implements the spout.

Flux erwartet, dass sich die Python-Skripts im /resources-Verzeichnis der JAR-Datei befinden, die die Topologie enthält.Flux expects the Python scripts to be in the /resources directory inside the jar file that contains the topology. Also sind die Python-Skripts in diesem Beispiel im /multilang/resources-Verzeichnis gespeichert.So this example stores the Python scripts in the /multilang/resources directory. Die pom.xml bezieht diese Datei mit folgendem XML-Code ein:The pom.xml includes this file using the following XML:

<!-- include the Python components -->
<resource>
    <directory>${basedir}/multilang</directory>
    <filtering>false</filtering>
</resource>

Wie bereits erwähnt, gibt es eine storm.py-Datei, die die Thrift-Definition für Storm implementiert.As mentioned earlier, there is a storm.py file that implements the Thrift definition for Storm. Das Flux-Framework bezieht storm.py automatisch ein, wenn das Projekt erstellt wird, Sie müssen sich also nicht um die Einbeziehung kümmern.The Flux framework includes storm.py automatically when the project is built, so you don't have to worry about including it.

Erstellen des ProjektsBuild the project

Führen Sie im Stammverzeichnis des Projekts folgenden Befehl aus:From the root of the project, use the following command:

mvn clean compile package

Dieser Befehl erstellt eine target/WordCount-1.0-SNAPSHOT.jar-Datei, die die kompilierte Topologie enthält.This command creates a target/WordCount-1.0-SNAPSHOT.jar file that contains the compiled topology.

Lokales Ausführen der TopologieRun the topology locally

Verwenden Sie den folgenden Befehl, um die Topologie lokal auszuführen:To run the topology locally, use the following command:

storm jar WordCount-1.0-SNAPSHOT.jar org.apache.storm.flux.Flux -l -R /topology.yaml

Hinweis

Dieser Befehl setzt eine lokale Storm-Entwicklungsumgebung voraus.This command requires a local Storm development environment. Weitere Informationen finden Sie unter Setting up a development environment (Einrichten einer Entwicklungsumgebung).For more information, see Setting up a development environment

Sobald die Topologie startet, gibt er Informationen über die lokale Konsole aus, die folgendem Text ähneln:Once the topology starts, it emits information to the local console similar to the following text:

24302 [Thread-25-sentence-spout-executor[4 4]] INFO  o.a.s.s.ShellSpout - ShellLog pid:2436, name:sentence-spout Emiting the cow jumped over the moon
24302 [Thread-30] INFO  o.a.s.t.ShellBolt - ShellLog pid:2438, name:splitter-bolt Emitting the
24302 [Thread-28] INFO  o.a.s.t.ShellBolt - ShellLog pid:2437, name:counter-bolt Emitting years:160
24302 [Thread-17-log-executor[3 3]] INFO  o.a.s.f.w.b.LogInfoBolt - {word=the, count=599}
24303 [Thread-17-log-executor[3 3]] INFO  o.a.s.f.w.b.LogInfoBolt - {word=seven, count=302}
24303 [Thread-17-log-executor[3 3]] INFO  o.a.s.f.w.b.LogInfoBolt - {word=dwarfs, count=143}
24303 [Thread-25-sentence-spout-executor[4 4]] INFO  o.a.s.s.ShellSpout - ShellLog pid:2436, name:sentence-spout Emiting the cow jumped over the moon
24303 [Thread-30] INFO  o.a.s.t.ShellBolt - ShellLog pid:2438, name:splitter-bolt Emitting cow
24303 [Thread-17-log-executor[3 3]] INFO  o.a.s.f.w.b.LogInfoBolt - {word=four, count=160}

Verwenden Sie zum Beenden der Topologie STRG+C.To stop the topology, use Ctrl + C.

Ausführen der Storm-Topologie unter HDInsightRun the Storm topology on HDInsight

  1. Verwenden Sie den folgenden Befehl, um die WordCount-1.0-SNAPSHOT.jar-Datei in Ihren Cluster vom Typ „Storm in HDInsight“ zu kopieren.Use the following command to copy the WordCount-1.0-SNAPSHOT.jar file to your Storm on HDInsight cluster:

    scp target\WordCount-1.0-SNAPSHOT.jar sshuser@mycluster-ssh.azurehdinsight.net
    

    Ersetzen Sie sshuser durch den SSH-Benutzer Ihres Clusters.Replace sshuser with the SSH user for your cluster. Ersetzen Sie mycluster durch den Namen des Clusters.Replace mycluster with the cluster name. Möglicherweise werden Sie zur Eingabe des Kennworts für den SSH-Benutzer aufgefordert.You may be prompted to enter the password for the SSH user.

    Weitere Informationen zur Verwendung von SSH und SCP finden Sie unter Herstellen einer Verbindung mit HDInsight (Hadoop) per SSH.For more information on using SSH and SCP, see Use SSH with HDInsight.

  2. Wenn die Datei hochgeladen ist, stellen Sie über SSH eine Verbindung mit dem Cluster her:Once the file has been uploaded, connect to the cluster using SSH:

    ssh sshuser@mycluster-ssh.azurehdinsight.net
    
  3. Verwenden Sie in der SSH-Sitzung den folgenden Befehl, um die Topologie im Cluster zu starten:From the SSH session, use the following command to start the topology on the cluster:

    storm jar WordCount-1.0-SNAPSHOT.jar org.apache.storm.flux.Flux -r -R /topology.yaml
    
  4. Sie können in der Storm-Benutzeroberfläche die Topologie im Cluster anzeigen.You can use the Storm UI to view the topology on the cluster. Die Storm-Benutzeroberfläche befindet sich unter https://mycluster.azurehdinsight.net/stormui.The Storm UI is located at https://mycluster.azurehdinsight.net/stormui. Ersetzen Sie mycluster durch den Namen Ihres Clusters.Replace mycluster with your cluster name.

Hinweis

Eine gestartete Storm-Topologie wird ausgeführt, bis sie beendet wird.Once started, a Storm topology runs until stopped. Sie können die Topologie mithilfe einer der folgenden Methoden beenden:To stop the topology, use one of the following methods:

  • Der Befehl storm kill TOPOLOGYNAME über die BefehlszeileThe storm kill TOPOLOGYNAME command from the command line
  • Mit der Kill-Schaltfläche in der Storm-Benutzeroberfläche.The Kill button in the Storm UI.

Nächste SchritteNext steps

In den folgenden Dokumenten werden weitere Möglichkeiten zur Verwendung von Python mit HDInsight beschrieben:See the following documents for other ways to use Python with HDInsight: