Tutorial: Schreiben in Apache Hadoop HDFS aus Apache Storm auf Azure HDInsightTutorial: Write to Apache Hadoop HDFS from Apache Storm on Azure HDInsight

Dieses Tutorial zeigt, wie Sie mit Apache Storm Daten in den von Apache Storm auf HDInsight verwendeten HDFS-kompatiblen Speicher schreiben.This tutorial demonstrates how to use Apache Storm to write data to the HDFS-compatible storage used by Apache Storm on HDInsight. HDInsight kann sowohl Azure Storage als auch Azure Data Lake Storage als HDFS-kompatiblen Speicher verwenden.HDInsight can use both Azure Storage and Azure Data Lake Storage as HDFS-compatible storage. Storm bietet eine HdfsBolt-Komponente, die Daten in HDFS schreibt.Storm provides an HdfsBolt component that writes data to HDFS. Dieses Dokument enthält Informationen zum Schreiben in jeden Speichertyp von HdfsBolt aus.This document provides information on writing to either type of storage from the HdfsBolt.

Die in diesem Dokument verwendete Beispieltopologie basiert auf Komponenten, die in Storm auf HDInsight enthalten sind.The example topology used in this document relies on components that are included with Storm on HDInsight. Bei Verwendung mit anderen Apache Storm-Clustern können Änderungen zum Arbeiten mit Azure Data Lake Storage erforderlich sein.It may require modification to work with Azure Data Lake Storage when used with other Apache Storm clusters.

In diesem Tutorial lernen Sie Folgendes:In this tutorial, you learn how to:

  • Konfigurieren des Cluster mit SkriptaktionenConfigure the cluster with script action
  • Erstellen und Packen der TopologieBuild and package the topology
  • Bereitstellen und Ausführen der TopologieDeploy and run the topology
  • Anzeigen von AusgabedatenView output data
  • Beenden der TopologieStop the topology

VoraussetzungenPrerequisites

BeispielkonfigurationExample configuration

Der folgende YAML-Code ist ein Auszug aus der im Beispiel enthaltenen resources/writetohdfs.yaml-Datei.The following YAML is an excerpt from the resources/writetohdfs.yaml file included in the example. Diese Datei definiert die Storm-Topologie mit dem Flux-Framework für Apache Storm.This file defines the Storm topology using the Flux framework for Apache Storm.

components:
  - id: "syncPolicy"
    className: "org.apache.storm.hdfs.bolt.sync.CountSyncPolicy"
    constructorArgs:
      - 1000

  # Rotate files when they hit 5 MB
  - id: "rotationPolicy"
    className: "org.apache.storm.hdfs.bolt.rotation.FileSizeRotationPolicy"
    constructorArgs:
      - 5
      - "MB"

  - id: "fileNameFormat"
    className: "org.apache.storm.hdfs.bolt.format.DefaultFileNameFormat"
    configMethods:
      - name: "withPath"
        args: ["${hdfs.write.dir}"]
      - name: "withExtension"
        args: [".txt"]

  - id: "recordFormat"
    className: "org.apache.storm.hdfs.bolt.format.DelimitedRecordFormat"
    configMethods:
      - name: "withFieldDelimiter"
        args: ["|"]

# spout definitions
spouts:
  - id: "tick-spout"
    className: "com.microsoft.example.TickSpout"
    parallelism: 1


# bolt definitions
bolts:
  - id: "hdfs-bolt"
    className: "org.apache.storm.hdfs.bolt.HdfsBolt"
    configMethods:
      - name: "withConfigKey"
        args: ["hdfs.config"]
      - name: "withFsUrl"
        args: ["${hdfs.url}"]
      - name: "withFileNameFormat"
        args: [ref: "fileNameFormat"]
      - name: "withRecordFormat"
        args: [ref: "recordFormat"]
      - name: "withRotationPolicy"
        args: [ref: "rotationPolicy"]
      - name: "withSyncPolicy"
        args: [ref: "syncPolicy"]

Dieser YAML-Code definiert die folgenden Elemente:This YAML defines the following items:

  • syncPolicy: Definiert, wann Dateien mit dem Dateisystem synchronisiert/darin geleert werden.syncPolicy: Defines when files are synched/flushed to the file system. In diesem Beispiel alle 1.000 Tupel.In this example, every 1000 tuples.
  • fileNameFormat: Definiert das beim Schreiben von Dateien zu verwendende Pfad- und Dateinamensmuster.fileNameFormat: Defines the path and file name pattern to use when writing files. In diesem Beispiel wird der Pfad zur Laufzeit mithilfe eines Filters bereitgestellt, und die Erweiterung der Datei lautet .txt.In this example, the path is provided at runtime using a filter, and the file extension is .txt.
  • recordFormat: Definiert das interne Format der geschriebenen Dateien.recordFormat: Defines the internal format of the files written. In diesem Beispiel werden Felder durch das |-Zeichen begrenzt.In this example, fields are delimited by the | character.
  • rotationPolicy: Definiert das Rotieren der Dateien.rotationPolicy: Defines when to rotate files. In diesem Beispiel erfolgt keine Rotation.In this example, no rotation is performed.
  • hdfs-bolt: Verwendet die vorherigen Komponenten als Konfigurationsparameter für die HdfsBolt-Klasse.hdfs-bolt: Uses the previous components as configuration parameters for the HdfsBolt class.

Weitere Informationen zum Flux-Framework finden Sie unter https://storm.apache.org/releases/current/flux.html.For more information on the Flux framework, see https://storm.apache.org/releases/current/flux.html.

Konfigurieren des ClustersConfigure the cluster

Standardmäßig schließt Storm in HDInsight nicht die Komponenten ein, die HdfsBolt zur Kommunikation mit Azure Storage oder Data Lake Storage im Klassenpfad von Storm verwendet.By default, Storm on HDInsight does not include the components that HdfsBolt uses to communicate with Azure Storage or Data Lake Storage in Storm's classpath. Fügen Sie diese Komponenten mit folgender Skriptaktion dem extlib-Verzeichnis für Storm auf dem Cluster hinzu:Use the following script action to add these components to the extlib directory for Storm on your cluster:

EigenschaftProperty WertValue
SkripttypScript type --Benutzerdefiniert- Custom
Bash-Skript-URIBash script URI https://hdiconfigactions.blob.core.windows.net/linuxstormextlibv01/stormextlib.sh
Knotentyp(en)Node type(s) Nimbus, SupervisorNimbus, Supervisor
ParameterParameters KeineNone

Informationen zum Verwenden dieses Skripts mit Ihrem Cluster finden Sie im Dokument Anpassen Linux-basierter HDInsight-Cluster mithilfe von Skriptaktionen.For information on using this script with your cluster, see the Customize HDInsight clusters using script actions document.

Erstellen und Packen der TopologieBuild and package the topology

  1. Laden Sie das Beispielprojekt unter https://github.com/Azure-Samples/hdinsight-storm-azure-data-lake-store in Ihre Entwicklungsumgebung herunter.Download the example project from https://github.com/Azure-Samples/hdinsight-storm-azure-data-lake-store to your development environment.

  2. Ändern Sie über eine Eingabeaufforderung, ein Terminal oder eine Shellsitzung Verzeichnisse in das Stammverzeichnis des heruntergeladenen Projekts.From a command prompt, terminal, or shell session, change directories to the root of the downloaded project. Erstellen und packen Sie die Topologie mit folgendem Befehl:To build and package the topology, use the following command:

    mvn compile package
    

    Nach Abschluss des Erstellungs- und Packvorgangs finden Sie ein neues Verzeichnis namens target vor, das die Datei StormToHdfs-1.0-SNAPSHOT.jar enthält.Once the build and packaging completes, there is a new directory named target, that contains a file named StormToHdfs-1.0-SNAPSHOT.jar. Diese Datei enthält die kompilierte Topologie.This file contains the compiled topology.

Bereitstellen und Ausführen der TopologieDeploy and run the topology

  1. Führen Sie den folgenden Befehl aus, um die Topologie in den HDInsight-Cluster zu kopieren.Use the following command to copy the topology to the HDInsight cluster. Ersetzen Sie CLUSTERNAME durch den Namen des Clusters.Replace CLUSTERNAME with the name of the cluster.

    scp target\StormToHdfs-1.0-SNAPSHOT.jar sshuser@CLUSTERNAME-ssh.azurehdinsight.net:StormToHdfs-1.0-SNAPSHOT.jar
    
  2. Führen Sie nach Abschluss des Uploads den folgenden Befehl aus, um mithilfe von SSH eine Verbindung mit dem HDInsight-Cluster herzustellen.Once the upload completes, use the following to connect to the HDInsight cluster using SSH. Ersetzen Sie CLUSTERNAME durch den Namen des Clusters.Replace CLUSTERNAME with the name of the cluster.

    ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.net
    
  3. Verwenden Sie den folgenden Befehl, um eine Datei mit dem Namen dev.properties zu erstellen:Once connected, use the following command to create a file named dev.properties:

    nano dev.properties
    
  4. Verwenden Sie als Inhalt der dev.properties-Datei den folgenden Text:Use the following text as the contents of the dev.properties file. Überarbeiten Sie dies je nach Bedarf basierend auf Ihrem URI-Schema.Revise as needed based on your URI scheme.

    hdfs.write.dir: /stormdata/
    hdfs.url: wasbs:///
    

    Verwenden Sie STRG + X, um die Datei zu speichern. Geben Sie dann Y ein, und drücken Sie die EINGABETASTE.To save the file, use Ctrl + X, then Y, and finally Enter. Mit den Werten in dieser Datei bestimmen Sie die Speicher-URL und den Namen des Verzeichnisses, in das Daten geschrieben werden.The values in this file set the storage URL and the directory name that data is written to.

  5. Verwenden Sie den folgenden Befehl, um die Topologie zu starten:Use the following command to start the topology:

    storm jar StormToHdfs-1.0-SNAPSHOT.jar org.apache.storm.flux.Flux --remote -R /writetohdfs.yaml --filter dev.properties
    

    Dieser Befehl startet die Topologie mithilfe des Flux-Frameworks, indem sie an den Nimbus-Knoten des Clusters gesendet wird.This command starts the topology using the Flux framework by submitting it to the Nimbus node of the cluster. Die Topologie wird durch die writetohdfs.yaml-Datei in der JAR-Datei definiert.The topology is defined by the writetohdfs.yaml file included in the jar. Die dev.properties-Datei wird als Filter übergeben, und die Werte in der Datei werden von der Topologie gelesen.The dev.properties file is passed as a filter, and the values contained in the file are read by the topology.

Anzeigen von AusgabedatenView output data

Verwenden Sie zum Anzeigen der Daten den folgenden Befehl:To view the data, use the following command:

hdfs dfs -ls /stormdata/

Eine Liste der von dieser Topologie erstellten Dateien wird angezeigt.A list of the files created by this topology is displayed. Die folgende Liste ist ein Beispiel der von den vorherigen Befehlen zurückgegebenen Daten:The following list is an example of the data returned by the previous commands:

Found 23 items
-rw-r--r--   1 storm supergroup    5242880 2019-06-24 20:25 /stormdata/hdfs-bolt-3-0-1561407909895.txt
-rw-r--r--   1 storm supergroup    5242880 2019-06-24 20:25 /stormdata/hdfs-bolt-3-1-1561407915577.txt
-rw-r--r--   1 storm supergroup    5242880 2019-06-24 20:25 /stormdata/hdfs-bolt-3-10-1561407943327.txt
-rw-r--r--   1 storm supergroup    5242880 2019-06-24 20:25 /stormdata/hdfs-bolt-3-11-1561407946312.txt
-rw-r--r--   1 storm supergroup    5242880 2019-06-24 20:25 /stormdata/hdfs-bolt-3-12-1561407949320.txt
-rw-r--r--   1 storm supergroup    5242880 2019-06-24 20:25 /stormdata/hdfs-bolt-3-13-1561407952662.txt
-rw-r--r--   1 storm supergroup    5242880 2019-06-24 20:25 /stormdata/hdfs-bolt-3-14-1561407955502.txt

Beenden der TopologieStop the topology

Storm-Topologien werden ausgeführt, bis sie beendet werden oder der Cluster gelöscht wird.Storm topologies run until stopped, or the cluster is deleted. Verwenden Sie den folgenden Befehl, um die Topologie zu beenden:To stop the topology, use the following command:

storm kill hdfswriter

Bereinigen von RessourcenClean up resources

Zum Bereinigen der im Rahmen dieses Tutorials erstellten Ressourcen können Sie die Ressourcengruppe löschen.To clean up the resources created by this tutorial, you can delete the resource group. Dadurch werden auch der zugeordnete HDInsight-Cluster sowie alle anderen Ressourcen gelöscht, die der Ressourcengruppe zugeordnet sind.Deleting the resource group also deletes the associated HDInsight cluster, and any other resources associated with the resource group.

So entfernen Sie die Ressourcengruppe über das Azure-Portal:To remove the resource group using the Azure portal:

  1. Erweitern Sie im Azure-Portal das Menü auf der linken Seite, um das Menü mit den Diensten zu öffnen, und klicken Sie auf Ressourcengruppen, um die Liste mit Ihren Ressourcengruppen anzuzeigen.In the Azure portal, expand the menu on the left side to open the menu of services, and then choose Resource Groups to display the list of your resource groups.
  2. Suchen Sie die zu löschende Ressourcengruppe, und klicken Sie mit der rechten Maustaste rechts neben dem Eintrag auf die Schaltfläche Mehr (...).Locate the resource group to delete, and then right-click the More button (...) on the right side of the listing.
  3. Klicken Sie auf Ressourcengruppe löschen, und bestätigen Sie den Vorgang.Select Delete resource group, and then confirm.

Nächste SchritteNext steps

In diesem Tutorial haben Sie erfahren, wie Sie mit Apache Storm Daten in den von Apache Storm auf HDInsight verwendeten HDFS-kompatiblen Speicher schreiben.In this tutorial, you learned how to use Apache Storm to write data to the HDFS-compatible storage used by Apache Storm on HDInsight.