Opracowywanie topologii Apache Storm przy użyciu języka Python w usłudze HDInsightDevelop Apache Storm topologies using Python on HDInsight

Dowiedz się, jak utworzyć topologię Apache Storm , która używa składników języka Python.Learn how to create an Apache Storm topology that uses Python components. Apache Storm obsługuje wiele języków, nawet umożliwiając Łączenie składników z kilku języków w jednej topologii.Apache Storm supports multiple languages, even allowing you to combine components from several languages in one topology. Platforma strumień (wprowadzona przy użyciu burzy 0.10.0) umożliwia łatwe tworzenie rozwiązań wykorzystujących składniki języka Python.The Flux framework (introduced with Storm 0.10.0) allows you to easily create solutions that use Python components.

Ważne

Informacje przedstawione w tym dokumencie zostały przetestowane przy użyciu burzy w usłudze HDInsight 3,6.The information in this document was tested using Storm on HDInsight 3.6.

Kod dla tego projektu jest dostępny pod adresem 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.

Wymagania wstępnePrerequisites

  • Python 2,7 lub nowszyPython 2.7 or higher

  • Java JDK 1,8 lub nowszyJava JDK 1.8 or higher

  • Apache Maven 3Apache Maven 3

  • Obowiązkowe Lokalne środowisko projektowe burzy.(Optional) A local Storm development environment. Lokalne środowisko burzowe jest wymagane tylko wtedy, gdy chcesz uruchomić topologię lokalnie.A local Storm environment is only needed if you want to run the topology locally. Aby uzyskać więcej informacji, zobacz Konfigurowanie środowiska deweloperskiego.For more information, see Setting up a development environment.

Obsługa wielu językówStorm multi-language support

Apache Storm został zaprojektowany z myślą o pracy ze składnikami napisane przy użyciu dowolnego języka programowania.Apache Storm was designed to work with components written using any programming language. Składniki muszą zrozumieć sposób pracy z definicją Thrift dla burzy.The components must understand how to work with the Thrift definition for Storm. W przypadku języka Python moduł jest dostarczany jako część projektu Apache Storm, który umożliwia łatwe interfejsowanie z burzą.For Python, a module is provided as part of the Apache Storm project that allows you to easily interface with Storm. Ten moduł można znaleźć pod adresem 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.

Burza jest procesem języka Java, który działa na wirtualna maszyna Java (JVM).Storm is a Java process that runs on the Java Virtual Machine (JVM). Składniki w innych językach są wykonywane jako podprocesy.Components written in other languages are executed as subprocesses. Burza komunikuje się z tymi podprocesami przy użyciu komunikatów JSON wysyłanych za pośrednictwem stdin/stdout.The Storm communicates with these subprocesses using JSON messages sent over stdin/stdout. Więcej informacji na temat komunikacji między składnikami można znaleźć w dokumentacji protokołu z wieloma językami .More details on communication between components can be found in the Multi-lang Protocol documentation.

Python z platformą strumieńPython with the Flux framework

Platforma strumień umożliwia definiowanie topologii burzy niezależnie od składników.The Flux framework allows you to define Storm topologies separately from the components. Struktura strumienia używa YAML do definiowania topologii burzy.The Flux framework uses YAML to define the Storm topology. Poniższy tekst przedstawia przykład sposobu odwoływania się do składnika języka Python w dokumencie YAML: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

Klasa FluxShellSpout jest używana do sentencespout.py uruchomienia skryptu, który implementuje elementu Spout.The class FluxShellSpout is used to start the sentencespout.py script that implements the spout.

Strumień oczekuje, że skrypty języka Python mają znajdować /resources się w katalogu wewnątrz pliku JAR, który zawiera topologię.Flux expects the Python scripts to be in the /resources directory inside the jar file that contains the topology. W tym przykładzie są przechowywane skrypty języka Python w /multilang/resources katalogu.So this example stores the Python scripts in the /multilang/resources directory. pom.xml Obejmuje następujący plik XML:The pom.xml includes this file using the following XML:

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

Jak wspomniano wcześniej, istnieje storm.py plik, który implementuje definicję Thrift dla burzy.As mentioned earlier, there is a storm.py file that implements the Thrift definition for Storm. Platforma strumień jest storm.py automatycznie tworzona podczas kompilowania projektu, więc nie trzeba martwić się o dołączenie do niego.The Flux framework includes storm.py automatically when the project is built, so you don't have to worry about including it.

Skompiluj projektBuild the project

Z poziomu katalogu głównego projektu, użyj następującego polecenia:From the root of the project, use the following command:

mvn clean compile package

To polecenie tworzy target/WordCount-1.0-SNAPSHOT.jar plik, który zawiera skompilowaną topologię.This command creates a target/WordCount-1.0-SNAPSHOT.jar file that contains the compiled topology.

Uruchamianie topologii lokalnieRun the topology locally

Aby uruchomić topologię lokalnie, użyj następującego polecenia: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

Uwaga

To polecenie wymaga lokalnego środowiska projektowego burzy.This command requires a local Storm development environment. Aby uzyskać więcej informacji, zobacz Konfigurowanie środowiska deweloperskiegoFor more information, see Setting up a development environment

Po uruchomieniu topologii emitują informacje do konsoli lokalnej podobne do następującego tekstu: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}

Aby zatrzymać topologię, użyj kombinacji klawiszy CTRL + C.To stop the topology, use Ctrl + C.

Uruchamianie topologii burzy w usłudze HDInsightRun the Storm topology on HDInsight

  1. Użyj następującego polecenia, aby skopiować WordCount-1.0-SNAPSHOT.jar plik do burzy w klastrze usługi HDInsight: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
    

    Zastąp sshuser wartość użytkownikiem SSH klastra.Replace sshuser with the SSH user for your cluster. Zamień mycluster na nazwę klastra.Replace mycluster with the cluster name. Może zostać wyświetlony monit o wprowadzenie hasła dla użytkownika SSH.You may be prompted to enter the password for the SSH user.

    Aby uzyskać więcej informacji na temat używania protokołów SSH i SCP, zobacz Używanie protokołu SSH z usługą HDInsight.For more information on using SSH and SCP, see Use SSH with HDInsight.

  2. Po przekazaniu pliku Połącz się z klastrem przy użyciu protokołu SSH:Once the file has been uploaded, connect to the cluster using SSH:

    ssh sshuser@mycluster-ssh.azurehdinsight.net
    
  3. W sesji SSH Użyj następującego polecenia, aby uruchomić topologię w klastrze: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. Można użyć interfejsu użytkownika burzy do wyświetlania topologii w klastrze.You can use the Storm UI to view the topology on the cluster. Interfejs użytkownika burzy znajduje się https://mycluster.azurehdinsight.net/stormui w lokalizacji.The Storm UI is located at https://mycluster.azurehdinsight.net/stormui. Zastąp mycluster nazwą klastra.Replace mycluster with your cluster name.

Uwaga

Po uruchomieniu topologia burza jest uruchamiana do momentu zatrzymania.Once started, a Storm topology runs until stopped. Aby zatrzymać topologię, należy użyć jednej z następujących metod:To stop the topology, use one of the following methods:

  • storm kill TOPOLOGYNAME Polecenie z wiersza poleceniaThe storm kill TOPOLOGYNAME command from the command line
  • Przycisk kasowania w interfejsie użytkownika burzy.The Kill button in the Storm UI.

Następne krokiNext steps

Zapoznaj się z następującymi dokumentami, aby poznać inne sposoby używania języka Python z usługą HDInsight:See the following documents for other ways to use Python with HDInsight: