[英]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.