簡體   English   中英

StructuredStreaming - 從 GKE 上的 Strimzi Kafka 讀取,每 10 分鍾將數據寫入 Mongo

[英]StructuredStreaming - read from Strimzi Kafka on GKE, writing data into Mongo every 10 minutes

我在 Kafka 主題中有數據(每 10 分鍾發布一次數據),我計划使用 Apache Spark 結構化流(批處理模式)讀取這些數據並將其推送到 MongoDB 中。

請注意:這將使用 GCP 上的 Composer/Airflow 進行安排 - 這將創建一個 Dataproc 集群,運行 spark 代碼,然后刪除集群

這是我當前的代碼:

# read from Kafka, extract json - and write to mongoDB 

df_reader = spark.readStream.format('kafka')\
    .option("kafka.bootstrap.servers",kafkaBrokers)\
    .option("kafka.security.protocol","SSL") \
    .option("kafka.ssl.truststore.location",ssl_truststore_location) \
    .option("kafka.ssl.truststore.password",ssl_truststore_password) \
    .option("kafka.ssl.keystore.location", ssl_keystore_location)\
    .option("kafka.ssl.keystore.password", ssl_keystore_password)\
    .option("subscribe", topic) \
    .option("kafka.group.id", consumerGroupId)\
    .option("failOnDataLoss", "false") \
    .option("startingOffsets", "earliest") \
    .load()

df = df_reader.selectExpr("CAST(value AS STRING)")
df_data = df.select(from_json(col('value'),schema).alias('data')).select("data.*").filter(col('customer')==database)

# write to Mongo
df_data.write\
    .format("mongo") \
    .option("uri", mongoConnUri) \
    .option("database", database) \
    .option("collection", collection) \
    .mode("append") \
    .save()

由於這是每 10 分鍾作為批處理查詢運行一次,我如何確保不讀取重復記錄並將其推送到 MongoDB 中?

當我使用 readStream - 是否讀取了 Kafka 主題中的所有數據,或者從它最后一次讀取數據的那一刻開始? 在這種情況下 df.read 與 df.readStream 有何不同?

請注意:mongo 數據源不支持流式查詢,否則我可以使用檢查點來啟用它嗎?

請告知實現這一目標的最佳方法是什么?

蒂亞!

如果要安排作業每 X 分鍾運行一次,則應使用spark.read.format("kafka") ,否則,它將啟動長時間運行的 Spark Structured Streaming 作業,而不是批處理作業。

Spark 將在 Kafka 中或使用您要配置的checkpointLocation跟蹤偏移量。

此外,結構化的流式寫入確實適用於 Mongo

正如評論所言, Kafka Connect可能比調度任何事情都更有用,您可以使用 GKE 或 Cloud-Run 來啟動 Kafka Connect 工作容器,或在 GCE 中創建集群。 這將連續運行,您不必等待 10 分鍾以上(取決於 Kafka 消費者延遲)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM