Kembangkan topologi Apache Storm menggunakan Python di HDInsight

Pelajari cara membuat topologi Apache Storm yang menggunakan komponen Python. Apache Storm mendukung beberapa bahasa, bahkan memungkinkan Anda untuk menggabungkan komponen dari beberapa bahasa dalam satu topologi. Kerangka kerja Flux (diperkenalkan dengan Storm 0.10.0) memungkinkan Anda untuk dengan mudah membuat solusi yang menggunakan komponen Python.

Penting

Informasi dalam dokumen ini diuji menggunakan Storm di HDInsight 3.6.

Prasyarat

Dukungan multibahasa

Apache Storm dirancang untuk bekerja dengan komponen yang ditulis menggunakan bahasa pemrograman apa pun. Komponen harus memahami cara bekerja dengan definisi Thrift untuk Storm. Untuk Python, modul disediakan sebagai bagian dari proyek Apache Storm yang memungkinkan Anda untuk dengan mudah berinteraksi dengan Storm. Anda dapat menemukan modul ini di https://github.com/apache/storm/blob/master/storm-multilang/python/src/main/resources/resources/storm.py.

Storm adalah proses Java yang berjalan pada Komputer Virtual Java (Java Virtual Machine; JVM). Komponen yang ditulis dalam bahasa lain dijalankan sebagai subproses. Storm berkomunikasi dengan subproses ini menggunakan pesan JSON yang dikirim melalui stdin/stdout. Rincian lebih lanjut tentang komunikasi antar komponen dapat ditemukan dalam dokumentasi Protokol Multibahasa.

Python dengan kerangka kerja Flux

Kerangka kerja Flux memungkinkan Anda untuk mendefinisikan topologi Storm secara terpisah dari komponen. Kerangka kerja Flux menggunakan YAML untuk mendefinisikan topologi Storm. Teks berikut adalah contoh cara mereferensikan komponen Python dalam dokumen YAML:

# 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

Kelas ini FluxShellSpout digunakan untuk memulai sentencespout.py skrip yang mengimplementasikan spout.

Flux mengharapkan skrip Python berada di /resources direktori di dalam jar file yang berisi topologi. Jadi contoh ini menyimpan skrip Python /multilang/resources di direktori. File pom.xml ini mencakup menggunakan XML berikut:

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

Sebagaimana disebutkan sebelumnya, terdapat storm.py file yang mengimplementasikan definisi Thrift untuk Storm. Kerangka kerja Flux storm.py mencakup secara otomatis ketika proyek dibangun, jadi Anda tidak perlu khawatir tentang memasukkannya.

Bangun proyek

  1. Pengunduhan file proyek dari https://github.com/Azure-Samples/hdinsight-python-storm-wordcount.

  2. Buka perintah dan arahkan ke proyek dengan file tanpa zip hdinsight-python-storm-wordcount-master. Masukkan perintah berikut:

    mvn clean compile package
    

    Perintah ini membuat file yang target/WordCount-1.0-SNAPSHOT.jar memuat topologi terkompilasi.

Jalankan topologi Storm di HDInsight

  1. Gunakan perintah ssh untuk menyalin file WordCount-1.0-SNAPSHOT.jar ke kluster Storm pada HDInsight Anda. Edit perintah di bawah ini dengan mengganti CLUSTERNAME dengan nama kluster Anda, lalu masukkan perintah:

    scp target/WordCount-1.0-SNAPSHOT.jar sshuser@CLUSTERNAME-ssh.azurehdinsight.net:
    
  2. Setelah file diunggah, sambungkan ke kluster menggunakan SSH:

    ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.net
    
  3. Dari sesi SSH, gunakan perintah berikut untuk memulai topologi pada kluster:

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

    Setelah dimulai, topologi Storm berjalan sampai berhenti.

  4. Gunakan Storm UI untuk menampilkaan topologi pada kluster. Storm UI terletak di https://CLUSTERNAME.azurehdinsight.net/stormui. Ganti CLUSTERNAME dengan nama kluster Anda.

  5. Hentikan topologi Storm. Gunakan perintah berikut untuk menghentikan topologi pada kluster:

    storm kill wordcount
    

    Atau, Anda dapat menggunakan Storm UI. Di bawah Tindakan topologi untuk topologi, pilih Matikan.

Jalankan topologi secara lokal

Untuk menjalankan topologi secara lokal, gunakan perintah berikut:

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

Catatan

Perintah ini membutuhkan lingkungan pengembangan Storm lokal. Untuk informasi selengkapnya, lihat Siapkan lingkungan pengembangan.

Setelah topologi dimulai, ia memancarkan informasi ke konsol lokal yang mirip dengan teks berikut:

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}

Untuk menghentikan topologi, gunakan Ctrl + C.

Langkah berikutnya

Lihat dokumen berikut untuk cara lain menggunakan Python dengan HDInsight: Cara menggunakan Python User Defined Functions (UDF) di Apache Pig dan Apache Hive.