Apache Kafka ist eine verteilte Open-Source-Streamingplattform für Echtzeitdaten Pipelines und Datenintegration. Es bietet ein effizientes und skalierbares Streaming-System. zur Verwendung in einer Vielzahl von Anwendungen, einschließlich:
- Echtzeitanalysen
- Streamverarbeitung
- Logaggregation
- Verteilte Nachrichten
- Ereignisstreaming
Lernziele
Installieren Sie Kafka auf einem Dataproc-Cluster für hohe Verfügbarkeit mit ZooKeeper (in dieser Anleitung als „Dataproc-Kafka-Cluster“ bezeichnet).
Sie erstellen fiktive Kundendaten und veröffentlichen die Daten dann in einem Kafka-Thema.
Hive-Parkett- und ORC-Tabellen in Cloud Storage erstellen um gestreamte Kafka-Themendaten zu erhalten.
Senden Sie einen PySpark-Job, um das Kafka-Thema zu abonnieren und in dieses zu streamen Cloud Storage im Parquet- und ORC-Format.
Abfrage der gestreamten Hive-Tabellendaten ausführen, um die gestreamten Daten zu zählen Kafka-Nachrichten.
Kosten
In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:
Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen.
Nach Abschluss der in diesem Dokument beschriebenen Aufgaben können Sie weitere Kosten vermeiden, indem Sie die erstellten Ressourcen löschen. Weitere Informationen finden Sie unter Bereinigen.
Hinweis
Erstellen Sie ein Google Cloud-Projekt, falls noch nicht geschehen.
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Dataproc, Compute Engine, and Cloud Storage APIs.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Dataproc, Compute Engine, and Cloud Storage APIs.
- In the Google Cloud console, go to the Cloud Storage Buckets page.
- Click Create bucket.
- On the Create a bucket page, enter your bucket information. To go to the next
step, click Continue.
- For Name your bucket, enter a name that meets the bucket naming requirements.
-
For Choose where to store your data, do the following:
- Select a Location type option.
- Select a Location option.
- For Choose a default storage class for your data, select a storage class.
- For Choose how to control access to objects, select an Access control option.
- For Advanced settings (optional), specify an encryption method, a retention policy, or bucket labels.
- Click Create.
Anleitungsschritte
Führen Sie die folgenden Schritte aus, um einen Dataproc-Kafka-Cluster zu erstellen, um ein Kafka-Thema im Parquet- oder ORC-Format in Cloud Storage zu lesen.
Kafka-Installationsskript in Cloud Storage kopieren
Das kafka.sh
Initialisierungsaktionsskript installiert Kafka auf einem Dataproc-Cluster.
Sehen Sie sich den Code an.
Kopieren Sie das Script
kafka.sh
für die Initialisierungsaktion in Ihren Cloud Storage-Bucket. Dieses Script installiert Kafka auf einem Dataproc-Cluster.Öffnen Sie Cloud Shell und führen Sie den folgenden Befehl aus:
gcloud storage cp gs://goog-dataproc-initialization-actions-REGION/kafka/kafka.sh gs://BUCKET_NAME/scripts/
Ersetzen Sie die folgenden Werte:
- REGION:
kafka.sh
wird in öffentlichen, regional getaggten Cloud Storage-Buckets gespeichert. Geben Sie eine Compute Engine-Region an, die sich geografisch in der Nähe befindet (z. B.us-central1
). - BUCKET_NAME: Der Name Ihres Cloud Storage-Buckets
- REGION:
Dataproc-Kafka-Cluster erstellen
Öffnen Sie Cloud Shell und führen Sie den folgenden Befehl aus: die folgenden
gcloud dataproc clusters create
Befehl zum Erstellen einer Dataproc-Instanz Hochverfügbarkeitscluster Cluster, der die Kafka- und ZooKeeper-Komponenten installiert:gcloud dataproc clusters create KAFKA_CLUSTER \ --project=PROJECT_ID \ --region=REGION \ --image-version=2.1-debian11 \ --num-masters=3 \ --enable-component-gateway \ --initialization-actions=gs://BUCKET_NAME/scripts/kafka.sh
Hinweise:
- KAFKA_CLUSTER: Der Clustername, der innerhalb eines Projekts eindeutig sein muss. Der Name muss mit einem Kleinbuchstaben beginnen und darf bis zu 51 Kleinbuchstaben, Ziffern und Bindestriche enthalten. Er darf nicht mit einem Bindestrich enden. Der Name eines kann ein gelöschter Cluster wiederverwendet werden.
- PROJECT_ID: Das Projekt, das mit diesem Cluster verknüpft werden soll.
- REGION: Die Compute Engine-Region, in der sich der Cluster befindet, z. B.
us-central1
.- Sie können das optionale Flag
--zone=ZONE
hinzufügen, um eine Zone innerhalb der angegebenen Region anzugeben, z. B.us-central1-a
. Wenn Sie keine Zone angeben, Automatische Zonenplatzierung in Dataproc die Funktion eine Zone mit der angegebenen Region auswählt.
- Sie können das optionale Flag
--image-version
: Für dieses Tutorial wird die Dataproc-Image-Version2.1-debian11
empfohlen. Hinweis: Jede Image-Version enthält eine Reihe vorinstallierter Komponenten, einschließlich der Hive-Komponente, die in diesem (siehe Unterstützte Dataproc-Image-Versionen).--num-master
:3
Master-Knoten erstellen ein Hochverfügbarkeitscluster. Die für Kafka erforderliche Zookeeper-Komponente ist vorinstalliert in einem Cluster mit Hochverfügbarkeit.--enable-component-gateway
: Aktiviert das Dataproc Component Gateway.- BUCKET_NAME: der Name Ihres Cloud Storage-Bucket
die das Initialisierungsskript
/scripts/kafka.sh
enthält Weitere Informationen finden Sie unter Kafka-Installationsskript in Cloud Storage kopieren.
Kafka-custdata
-Thema erstellen
So erstellen Sie ein Kafka-Thema im Dataproc-Kafka-Cluster:
Verwenden Sie die SSH um ein Terminalfenster auf der Cluster-Master-VM zu öffnen.
Erstellen Sie ein Kafka-
custdata
-Thema./usr/lib/kafka/bin/kafka-topics.sh \ --bootstrap-server KAFKA_CLUSTER-w-0:9092 \ --create --topic custdata
Hinweise:
KAFKA_CLUSTER: Geben Sie den Namen Ihres Kafka-Clusters ein.
-w-0:9092
steht für den Kafka-Broker, der auf Port9092
des Knotensworker-0
ausgeführt wird.Nachdem Sie das Thema
custdata
erstellt haben, können Sie die folgenden Befehle ausführen:# List all topics. /usr/lib/kafka/bin/kafka-topics.sh \ --bootstrap-server KAFKA_CLUSTER-w-0:9092 \ --list
# Consume then display topic data. /usr/lib/kafka/bin/kafka-console-consumer.sh \ --bootstrap-server KAFKA_CLUSTER-w-0:9092 \ --topic custdata
# Count the number of messages in the topic. /usr/lib/kafka/bin/kafka-run-class.sh kafka.tools.GetOffsetShell \ --broker-list KAFKA_CLUSTER-w-0:9092 \ --topic custdata # Delete topic. /usr/lib/kafka/bin/kafka-topics.sh \ --bootstrap-server KAFKA_CLUSTER-w-0:9092 \ --delete --topic custdata
Inhalte im Kafka-Thema custdata
veröffentlichen
Im folgenden Skript wird das Kafka-Tool kafka-console-producer.sh
verwendet, um
fiktive Kundendaten im CSV-Format generieren.
Kopieren Sie das Skript und fügen Sie es in den SSH-Code ein. auf dem Masterknoten Ihres Kafka-Clusters. Drücken Sie <return>, um das Skript auszuführen.
for i in {1..10000}; do \ custname="cust name${i}" uuid=$(dbus-uuidgen) age=$((45 + $RANDOM % 45)) amount=$(echo "$(( $RANDOM % 99999 )).$(( $RANDOM % 99 ))") message="${uuid}:${custname},${age},${amount}" echo ${message} done | /usr/lib/kafka/bin/kafka-console-producer.sh \ --broker-list KAFKA_CLUSTER-w-0:9092 \ --topic custdata \ --property "parse.key=true" \ --property "key.separator=:"
Hinweise:
- KAFKA_CLUSTER: Der Name Ihres Kafka-Clusters.
Führen Sie den folgenden Kafka-Befehl aus, um zu prüfen, ob das Thema
custdata
enthält 10.000 Nachrichten./usr/lib/kafka/bin/kafka-run-class.sh kafka.tools.GetOffsetShell \ --broker-list KAFKA_CLUSTER-w-0:9092 \ --topic custdata
Hinweise:
- KAFKA_CLUSTER: Der Name Ihres Kafka-Clusters.
Erwartete Ausgabe:
custdata:0:10000
Hive-Tabellen in Cloud Storage erstellen
Erstellen Sie Hive-Tabellen, um gestreamte Kafka-Themendaten zu empfangen.
Führen Sie die folgenden Schritte aus, um cust_parquet
- (Parquet-) und cust_orc
-Hive-Tabellen (ORC) in Ihrem Cloud Storage-Bucket zu erstellen.
Fügen Sie Ihre BUCKET_NAME in das folgende Script ein, kopieren Sie das Script und fügen Sie es in das SSH-Terminal auf dem Masterknoten Ihres Kafka-Clusters ein. Drücken Sie dann die Eingabetaste, um ein
~/hivetables.hql
-Script (Hive Query Language) zu erstellen.Im nächsten Schritt führen Sie das
~/hivetables.hql
-Script aus, um Parquet- und ORC-Hive-Tabellen in Ihrem Cloud Storage-Bucket zu erstellen.cat > ~/hivetables.hql <<EOF drop table if exists cust_parquet; create external table if not exists cust_parquet (uuid string, custname string, age string, amount string) row format delimited fields terminated by ',' stored as parquet location "gs://BUCKET_NAME/tables/cust_parquet"; drop table if exists cust_orc; create external table if not exists cust_orc (uuid string, custname string, age string, amount string) row format delimited fields terminated by ',' stored as orc location "gs://BUCKET_NAME/tables/cust_orc"; EOF
Führen Sie im SSH-Terminal auf dem Masterknoten Ihres Kafka-Clusters Hive-Job
~/hivetables.hql
senden, umcust_parquet
(parquet) und einecust_orc
(ORC) Hive-Tabelle in Ihrem Cloud Storage-Bucket.gcloud dataproc jobs submit hive \ --cluster=KAFKA_CLUSTER \ --region=REGION \ -f ~/hivetables.hql
Hinweise:
- Die Hive-Komponente ist in Dataproc Kafka vorinstalliert Cluster. Siehe Releaseversionen 2.1.x finden Sie eine Liste der Versionen der Hive-Komponenten in kürzlich veröffentlichten 2.1-Images.
- KAFKA_CLUSTER: Der Name Ihres Kafka-Clusters.
- REGION: Die Region, in der sich Ihr Kafka-Cluster befindet.
Kafka-custdata
in Hive-Tabellen streamen
- Führen Sie im SSH-Terminal auf dem Masterknoten von
Ihren Kafka-Cluster, um die
kafka-python
-Bibliothek zu installieren. Ein Kafka-Client ist erforderlich, um Kafka-Themendaten an Cloud Storage zu streamen.
pip install kafka-python
Fügen Sie den folgenden Code (BUCKET_NAME) ein, kopieren Sie ihn und fügen Sie ihn dann ein Fügen Sie PySpark-Code in das SSH-Terminal Ihres Kafka-Cluster-Masterknotens ein. Drücken Sie dann die <return>, um eine
streamdata.py
-Datei zu erstellen.Das Script abonniert das Kafka-
custdata
-Thema und streamt die Daten dann in Ihre Hive-Tabellen in Cloud Storage. Das Ausgabeformat, Dies kann Parquet oder ORC sein, wird in das Skript als einen Parameter.cat > streamdata.py <<EOF #!/bin/python import sys from pyspark.sql.functions import * from pyspark.sql.types import * from pyspark.sql import SparkSession from kafka import KafkaConsumer def getNameFn (data): return data.split(",")[0] def getAgeFn (data): return data.split(",")[1] def getAmtFn (data): return data.split(",")[2] def main(cluster, outputfmt): spark = SparkSession.builder.appName("APP").getOrCreate() spark.sparkContext.setLogLevel("WARN") Logger = spark._jvm.org.apache.log4j.Logger logger = Logger.getLogger(__name__) rows = spark.readStream.format("kafka") \ .option("kafka.bootstrap.servers", cluster+"-w-0:9092").option("subscribe", "custdata") \ .option("startingOffsets", "earliest")\ .load() getNameUDF = udf(getNameFn, StringType()) getAgeUDF = udf(getAgeFn, StringType()) getAmtUDF = udf(getAmtFn, StringType()) logger.warn("Params passed in are cluster name: " + cluster + " output format(sink): " + outputfmt) query = rows.select (col("key").cast("string").alias("uuid"),\ getNameUDF (col("value").cast("string")).alias("custname"),\ getAgeUDF (col("value").cast("string")).alias("age"),\ getAmtUDF (col("value").cast("string")).alias("amount")) writer = query.writeStream.format(outputfmt)\ .option("path","gs://BUCKET_NAME/tables/cust_"+outputfmt)\ .option("checkpointLocation", "gs://BUCKET_NAME/chkpt/"+outputfmt+"wr") \ .outputMode("append")\ .start() writer.awaitTermination() if __name__=="__main__": if len(sys.argv) < 2: print ("Invalid number of arguments passed ", len(sys.argv)) print ("Usage: ", sys.argv[0], " cluster format") print ("e.g.: ", sys.argv[0], " <cluster_name> orc") print ("e.g.: ", sys.argv[0], " <cluster_name> parquet") main(sys.argv[1], sys.argv[2]) EOF
Im SSH-Terminal auf dem Master-Knoten von Ihrem Kafka-Cluster, führen Sie
spark-submit
aus, um Daten Ihre Hive-Tabellen in Cloud Storage.Geben Sie den Namen Ihres KAFKA_CLUSTER und die Ausgabe ein FORMAT, kopieren Sie dann den folgenden Code und fügen Sie ihn in das SSH- auf dem Masterknoten Ihres Kafka-Clusters und drücken Sie dann <return>. um den Code auszuführen und die Kafka-
custdata
-Daten im Parquet-Format an Ihr Hive-Tabellen in Cloud Storagespark-submit --packages \ org.apache.spark:spark-streaming-kafka-0-10_2.12:3.1.3,org.apache.spark:spark-sql-kafka-0-10_2.12:3.1.3 \ --conf spark.history.fs.gs.outputstream.type=FLUSHABLE_COMPOSITE \ --conf spark.driver.memory=4096m \ --conf spark.executor.cores=2 \ --conf spark.executor.instances=2 \ --conf spark.executor.memory=6144m \ streamdata.py KAFKA_CLUSTER FORMAT
Hinweise:
- KAFKA_CLUSTER: Geben Sie den Namen Ihres Kafka-Clusters ein.
- FORMAT: Geben Sie entweder
parquet
oderorc
als Ausgabeformat an. Sie können den Befehl nacheinander ausführen, beiden Formate in die Hive-Tabellen übertragen: So wird z. B. beim ersten Aufruf Geben Sieparquet
an, um das Kafka-custdata
-Thema an die Hive zu streamen Parkettboden Geben Sie dann beim zweiten Aufruf das Formatorc
an, Streamcustdata
in die Hive-ORC-Tabelle.
Wenn die Standardausgabe im SSH-Terminal beendet wird, was bedeutet, dass die gesamte
custdata
gestreamt wurde, drücken Sie im SSH-Terminal <Strg-C>, um den Vorgang zu beenden.Listen Sie die Hive-Tabellen in Cloud Storage auf.
gcloud storage ls gs://BUCKET_NAME/tables/* --recursive
Hinweise:
- BUCKET_NAME: Geben Sie den Namen des Cloud Storage-Buckets ein, der Ihre Hive-Tabellen enthält (siehe Hive-Tabellen erstellen).
Gestreamte Daten abfragen
Führen Sie im SSH-Terminal auf dem Masterknoten Ihres Kafka-Clusters den folgenden
hive
-Befehl aus, um die gestreamten Kafka-custdata
-Nachrichten in den Hive-Tabellen in Cloud Storage zu zählen.hive -e "select count(1) from TABLE_NAME"
Hinweise:
- TABLE_NAME: Geben Sie entweder
cust_parquet
odercust_orc
als Namen der Hive-Tabelle an.
Erwartetes Ausgabe-Snippet:
- TABLE_NAME: Geben Sie entweder
...
Status: Running (Executing on YARN cluster with App id application_....)
----------------------------------------------------------------------------------------------
VERTICES MODE STATUS TOTAL COMPLETED RUNNING PENDING FAILED KILLED
----------------------------------------------------------------------------------------------
Map 1 .......... container SUCCEEDED 1 1 0 0 0 0
Reducer 2 ...... container SUCCEEDED 1 1 0 0 0 0
----------------------------------------------------------------------------------------------
VERTICES: 02/02 [==========================>>] 100% ELAPSED TIME: 9.89 s
----------------------------------------------------------------------------------------------
OK
10000
Time taken: 21.394 seconds, Fetched: 1 row(s)
Bereinigen
Projekt löschen
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID
Ressourcen löschen
-
Löschen Sie den Bucket:
gcloud storage buckets delete BUCKET_NAME
- So löschen Sie Ihren Kafka-Cluster:
gcloud dataproc clusters delete KAFKA_CLUSTER \ --region=${REGION}