Schreiben in Apache Hadoop HDFS aus Apache Storm auf HDInsightWrite to Apache Hadoop HDFS from Apache Storm on HDInsight

Erfahren Sie, wie Sie mit Apache Storm Daten in den von Apache Storm auf HDInsight verwendeten HDFS-kompatiblen Speicher schreiben.Learn 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.

Wichtig

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.

Abrufen des CodesGet the code

Das Projekt mit dieser Topologie steht unter https://github.com/Azure-Samples/hdinsight-storm-azure-data-lake-store als Download zur Verfügung.The project containing this topology is available as a download from https://github.com/Azure-Samples/hdinsight-storm-azure-data-lake-store.

Zum Kompilieren dieses Projekts benötigen Sie die folgende Konfiguration für Ihre Entwicklungsumgebung:To compile this project, you need the following configuration for your development environment:

Bei der Installation von Java und dem JDK auf Ihrer Entwicklungsworkstation können die folgenden Umgebungsvariablen festgelegt werden.The following environment variables may be set when you install Java and the JDK on your development workstation. Sie sollten dennoch prüfen, ob die Variablen vorhanden sind und korrekte Werte für Ihr System enthalten.However, you should check that they exist and that they contain the correct values for your system.

  • JAVA_HOME – sollte auf das Verzeichnis verweisen, in dem das JDK installiert ist.JAVA_HOME - should point to the directory where the JDK is installed.

  • PATH – sollte die folgenden Pfade enthalten:PATH - should contain the following paths:

    • JAVA_HOME (oder entsprechender Pfad)JAVA_HOME (or the equivalent path).
    • JAVA_HOME\bin (oder entsprechender Pfad)JAVA_HOME\bin (or the equivalent path).
    • Das Verzeichnis, in dem Maven installiert ist.The directory where Maven is installed.

Verwenden von HdfsBolt mit HDInsightHow to use the HdfsBolt with HDInsight

Wichtig

Bevor Sie HdfsBolt mit Storm in HDInsight verwenden, müssen Sie mit einer Skriptaktion erforderliche JAR-Dateien in den extpath für Storm kopieren.Before using the HdfsBolt with Storm on HDInsight, you must first use a script action to copy required jar files into the extpath for Storm. Weitere Informationen finden Sie im Abschnitt „Konfigurieren des Clusters“.For more information, see the Configure the cluster section.

HdfsBolt verwendet das von Ihnen bereitgestellte Dateischema, um zu verstehen, wie in HDFS geschrieben wird.The HdfsBolt uses the file scheme that you provide to understand how to write to HDFS. Verwenden Sie mit HDInsight eines der folgenden Schemas:With HDInsight, use one of the following schemes:

  • wasb://: Wird mit einem Azure Storage-Konto verwendet.wasb://: Used with an Azure Storage account.
  • abfs://: Wird mit Azure Data Lake Storage Gen2 verwendet.abfs://: Used with an Azure Data Lake Storage Gen2.
  • adl://: Wird mit Azure Data Lake Storage Gen1 verwendet.adl://: Used with Azure Data Lake Storage Gen1.

Die folgende Tabelle enthält Beispiele für die Verwendung des Dateischemas für verschiedene Szenarien:The following table provides examples of using the file scheme for different scenarios:

SchemaScheme NotizenNotes
wasb:/// Das Standardspeicherkonto ist ein Blobcontainer in einem Azure Storage-Konto.The default storage account is a blob container in an Azure Storage account
abfs:/// Das Standardspeicherkonto ist ein Verzeichnis in einem Azure Data Lake Storage Gen2-Konto.The default storage account is a directory in an Azure Data Lake Storage Gen2 account
adl:/// Das Standardspeicherkonto ist ein Verzeichnis in Azure Data Lake Storage Gen1.The default storage account is a directory in Azure Data Lake Storage Gen1. Während der Clustererstellung geben Sie das Verzeichnis in Data Lake Storage an, das den HDFS-Stamm des Clusters darstellt.During cluster creation, you specify the directory in Data Lake Storage that is the root of the cluster's HDFS. Beispiel: das /clusters/myclustername/-Verzeichnis.For example, the /clusters/myclustername/ directory.
wasb://CONTAINER@ACCOUNT.blob.core.windows.net/ Ein nicht standardmäßiges (zusätzliches) Azure Storage-Konto, das dem Cluster zugeordnet ist.A non-default (additional) Azure storage account associated with the cluster.
abfs://CONTAINER@ACCOUNT.dfs.core.windows.net/ Ein nicht standardmäßiges (zusätzliches) Azure Storage-Konto, das dem Cluster zugeordnet ist.A non-default (additional) Azure storage account associated with the cluster.
adl://STORENAME/ Der Stamm des vom Cluster verwendeten Data Lake Storage.The root of Data Lake Storage used by the cluster. Mit diesem Schema können Sie auf Daten zugreifen, die sich außerhalb des das Clusterdateisystem enthaltenden Verzeichnisses befinden.This scheme allows you to access data that is located outside the directory that contains the cluster file system.

Weitere Informationen finden Sie unter Apache.org in dem Verweis auf HdfsBolt.For more information, see the HdfsBolt reference at Apache.org.

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:

  • Skript-URI: https://hdiconfigactions.blob.core.windows.net/linuxstormextlibv01/stormextlib.shScript URI: https://hdiconfigactions.blob.core.windows.net/linuxstormextlibv01/stormextlib.sh
  • Knoten für die Anwendung: Nimbus, SupervisorNodes to apply to: Nimbus, Supervisor
  • Parameter: KeineParameters: None

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 USER durch den SSH-Benutzernamen, den Sie beim Erstellen des Clusters verwendet haben.Replace USER with the SSH user name you used when creating the cluster. Ersetzen Sie CLUSTERNAME durch den Namen des Clusters.Replace CLUSTERNAME with the name of the cluster.

     scp target\StormToHdfs-1.0-SNAPSHOT.jar USER@CLUSTERNAME-ssh.azurehdinsight.net:StormToHdfs-1.0-SNAPSHOT.jar
    

    Geben Sie nach Aufforderung das Kennwort ein, das Sie beim Erstellen des SSH-Benutzers für den Cluster verwendet haben.When prompted, enter the password used when creating the SSH user for the cluster. Wenn Sie einen öffentlichen Schlüssel anstelle eines Kennworts verwendet haben, müssen Sie unter Umständen den Parameter -i verwenden und den Pfad zum passenden privaten Schlüssel angeben.If you used a public key instead of a password, you may need to use the -i parameter to specify the path to the matching private key.

    Hinweis

    Weitere Informationen zum Verwenden von scp mit HDInsight finden Sie unter Verwenden von SSH mit HDInsight.For more information on using scp with HDInsight, see Use SSH with HDInsight.

  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 USER durch den SSH-Benutzernamen, den Sie beim Erstellen des Clusters verwendet haben.Replace USER with the SSH user name you used when creating the cluster. Ersetzen Sie CLUSTERNAME durch den Namen des Clusters.Replace CLUSTERNAME with the name of the cluster.

     ssh USER@CLUSTERNAME-ssh.azurehdinsight.net
    

    Geben Sie nach Aufforderung das Kennwort ein, das Sie beim Erstellen des SSH-Benutzers für den Cluster verwendet haben.When prompted, enter the password used when creating the SSH user for the cluster. Wenn Sie einen öffentlichen Schlüssel anstelle eines Kennworts verwendet haben, müssen Sie unter Umständen den Parameter -i verwenden und den Pfad zum passenden privaten Schlüssel angeben.If you used a public key instead of a password, you may need to use the -i parameter to specify the path to the matching private key.

    Weitere Informationen finden Sie unter Verwenden von SSH mit Linux-basiertem Hadoop in HDInsight unter Linux, Unix oder OS X.For more information, see Use SSH with HDInsight.

  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 Datei dev.properties den folgenden Text:Use the following text as the contents of the dev.properties file:

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

    Wichtig

    Dieses Beispiel setzt voraus, dass Ihr Cluster ein Azure Storage-Konto als Standardspeicher verwendet.This example assumes that your cluster uses an Azure Storage account as the default storage. Wenn Ihr Cluster Azure Data Lake Storage Gen2 verwendet, verwenden Sie stattdessen hdfs.url: abfs:///.If your cluster uses Azure Data Lake Storage Gen2, use hdfs.url: abfs:/// instead. Wenn Ihr Cluster Azure Data Lake Storage Gen1 verwendet, verwenden Sie stattdessen hdfs.url: adl:///.If your cluster uses Azure Data Lake Storage Gen1, use hdfs.url: adl:/// instead.

    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 Data Lake Storage-URL und den Namen des Verzeichnisses, in das Daten geschrieben werden.The values in this file set the Data Lake 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 30 items
-rw-r-----+  1 sshuser sshuser       488000 2017-03-03 19:13 /stormdata/hdfs-bolt-3-0-1488568403092.txt
-rw-r-----+  1 sshuser sshuser       444000 2017-03-03 19:13 /stormdata/hdfs-bolt-3-1-1488568404567.txt
-rw-r-----+  1 sshuser sshuser       502000 2017-03-03 19:13 /stormdata/hdfs-bolt-3-10-1488568408678.txt
-rw-r-----+  1 sshuser sshuser       582000 2017-03-03 19:13 /stormdata/hdfs-bolt-3-11-1488568411636.txt
-rw-r-----+  1 sshuser sshuser       464000 2017-03-03 19:13 /stormdata/hdfs-bolt-3-12-1488568411884.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

Löschen des ClustersDelete your cluster

Warnung

Die Abrechnung für die HDInsight-Cluster erfolgt anteilsmäßig auf Minutenbasis und ist unabhängig von der Verwendung.Billing for HDInsight clusters is prorated per minute, whether you use them or not. Daher sollten Sie Ihren Cluster nach der Verwendung unbedingt wieder löschen.Be sure to delete your cluster after you finish using it. Sehen Sie sich die Informationen zum Löschen eines HDInsight-Clusters an.See how to delete an HDInsight cluster.

Nächste SchritteNext steps

Nachdem Sie erfahren haben, wie Daten mithilfe von Apache Storm in Azure Storage und Azure Data Lake Storage geschrieben werden, können Sie sich mit anderen Apache Storm-Beispielen für HDInsight beschäftigen.Now that you have learned how to use Apache Storm to write to Azure Storage and Azure Data Lake Storage, discover other Apache Storm examples for HDInsight.

Weitere InformationenSee also