Desarrollo de topologías Apache Storm con Python en HDInsightDevelop Apache Storm topologies using Python on HDInsight

Aprenda a crear una topología de Apache Storm que use componentes de Python.Learn how to create an Apache Storm topology that uses Python components. Apache Storm admite varios lenguajes, e incluso le permite combinar componentes de varios lenguajes en una topología.Apache Storm supports multiple languages, even allowing you to combine components from several languages in one topology. El marco de Flux (introducido con Storm 0.10.0) permite crear fácilmente soluciones que usan componentes de Python.The Flux framework (introduced with Storm 0.10.0) allows you to easily create solutions that use Python components.

Importante

La información de este documento se probó con Storm en HDInsight 3.6.The information in this document was tested using Storm on HDInsight 3.6.

El código de este proyecto está disponible en 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.

Requisitos previosPrerequisites

  • Python 2.7 o versiones posterioresPython 2.7 or higher

  • Java JDK 1.8 o versiones posterioresJava JDK 1.8 or higher

  • Apache Maven 3Apache Maven 3

  • (Opcional) Un entorno de desarrollo de Storm local.(Optional) A local Storm development environment. Un entorno de Storm local solo es necesario si desea ejecutar localmente la topología.A local Storm environment is only needed if you want to run the topology locally. Para más información, consulte Setting up a development environment (Configuración de un entorno de desarrollo).For more information, see Setting up a development environment.

Compatibilidad con varios lenguajes de StormStorm multi-language support

Apache Storm se ha diseñado para funcionar con componentes escritos con cualquier lenguaje de programación.Apache Storm was designed to work with components written using any programming language. Los componentes deben aprender a trabajar con la definición Thrift para Storm.The components must understand how to work with the Thrift definition for Storm. Para Python, se proporciona un módulo como parte del proyecto de Apache Storm que le permite interactuar fácilmente con Storm.For Python, a module is provided as part of the Apache Storm project that allows you to easily interface with Storm. Puede encontrar este módulo en 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 es un proceso de Java que se ejecuta en Máquina virtual Java (JVM).Storm is a Java process that runs on the Java Virtual Machine (JVM). Los componentes escritos en otros lenguajes se ejecutan como subprocesos.Components written in other languages are executed as subprocesses. Storm se comunica con estos subprocesos mediante mensajes JSON enviados a través de stdin y stdout.The Storm communicates with these subprocesses using JSON messages sent over stdin/stdout. Se puede encontrar más detalles sobre la comunicación entre los componentes en la documentación de Multi-lang protocolo (Protocolo de varios lenguajes).More details on communication between components can be found in the Multi-lang Protocol documentation.

Python con el marco de trabajo de FluxPython with the Flux framework

El marco de trabajo de Flux le permite definir las topologías de Storm de forma independiente con respecto a los componentes.The Flux framework allows you to define Storm topologies separately from the components. El marco de trabajo de Flux usa YAML para definir la topología de Storm.The Flux framework uses YAML to define the Storm topology. El siguiente texto es un ejemplo de cómo se hace referencia a un componente de Python en el documento de 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

La clase FluxShellSpout se usa para iniciar el script sentencespout.py que implementa el spout.The class FluxShellSpout is used to start the sentencespout.py script that implements the spout.

Flux espera que los scripts de Python estén en el directorio /resources dentro del archivo jar que contiene la topología.Flux expects the Python scripts to be in the /resources directory inside the jar file that contains the topology. Por ello, este ejemplo almacena los scripts de Python en el directorio /multilang/resources.So this example stores the Python scripts in the /multilang/resources directory. El archivo pom.xml incluye este archivo mediante el siguiente código XML:The pom.xml includes this file using the following XML:

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

Como se mencionó anteriormente, hay un archivo storm.py que implementa la definición de Thrift para Storm.As mentioned earlier, there is a storm.py file that implements the Thrift definition for Storm. El marco de trabajo de Flux incluye storm.py automáticamente cuando se compila el proyecto, por lo que no tiene que preocuparse de incluirlo.The Flux framework includes storm.py automatically when the project is built, so you don't have to worry about including it.

Compilación del proyectoBuild the project

Desde la raíz del proyecto, use el comando siguiente:From the root of the project, use the following command:

mvn clean compile package

Este comando crea un archivo target/WordCount-1.0-SNAPSHOT.jar que contiene la topología compilada.This command creates a target/WordCount-1.0-SNAPSHOT.jar file that contains the compiled topology.

Ejecución de la topología de manera localRun the topology locally

Para ejecutar la topología de manera local, use el siguiente comando: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

Nota

Este comando requiere un entorno de desarrollo de Storm local.This command requires a local Storm development environment. Para más información, consulte Setting up a development environment (Configuración de un entorno de desarrollo).For more information, see Setting up a development environment

Una vez que se inicia la topología, esta emite información en la consola local que se parece al siguiente texto: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}

Para detener la topología, use Ctrl+C.To stop the topology, use Ctrl + C.

Ejecutar la topología de Storm en HDInsightRun the Storm topology on HDInsight

  1. Use el siguiente comando para copiar el archivo WordCount-1.0-SNAPSHOT.jar en el clúster de Storm en 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
    

    Reemplace sshuser con el usuario SSH para el clúster.Replace sshuser with the SSH user for your cluster. Reemplace mycluster por el nombre del clúster.Replace mycluster with the cluster name. Puede que se le solicite que escriba la contraseña del usuario de SSH.You may be prompted to enter the password for the SSH user.

    Para más información sobre cómo usar SSH y SCP, consulte Uso de SSH con HDInsight.For more information on using SSH and SCP, see Use SSH with HDInsight.

  2. Una vez cargado el archivo, conéctese al clúster mediante SSH:Once the file has been uploaded, connect to the cluster using SSH:

    ssh sshuser@mycluster-ssh.azurehdinsight.net
    
  3. En la sesión SSH, use el siguiente comando para iniciar la topología en el clúster: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. Puede usar la interfaz de usuario de Storm para ver la topología en el clúster.You can use the Storm UI to view the topology on the cluster. La interfaz de usuario de Storm se encuentra en https://mycluster.azurehdinsight.net/stormui.The Storm UI is located at https://mycluster.azurehdinsight.net/stormui. Reemplace mycluster por el nombre del clúster.Replace mycluster with your cluster name.

Nota

Cuando se ha iniciado una topología Storm, esta se ejecuta hasta que se detiene.Once started, a Storm topology runs until stopped. Para detener la topología, use uno de los siguientes métodos:To stop the topology, use one of the following methods:

  • El comando storm kill TOPOLOGYNAME desde la línea de comandos.The storm kill TOPOLOGYNAME command from the command line
  • El botón Terminar en la interfaz de usuario de Storm.The Kill button in the Storm UI.

Pasos siguientesNext steps

Consulte los siguientes documentos para ver otras maneras de usar Python con HDInsight.See the following documents for other ways to use Python with HDInsight: