[英]Error: Using Spark Structured Streaming to read and write data to another topic in kafka
[英]How to stream data from Kafka topic to Delta table using Spark Structured Streaming
我正在嘗試了解數據塊增量並考慮使用 Kafka 進行 POC。 基本上計划是使用來自 Kafka 的數據並將其插入到 databricks delta 表中。
這些是我所做的步驟:
%sql
CREATE TABLE hazriq_delta_trial2 (
value STRING
)
USING delta
LOCATION '/delta/hazriq_delta_trial2'
import org.apache.spark.sql.types._
val kafkaBrokers = "broker1:port,broker2:port,broker3:port"
val kafkaTopic = "kafkapoc"
val kafka2 = spark.readStream
.format("kafka")
.option("kafka.bootstrap.servers", kafkaBrokers)
.option("subscribe", kafkaTopic)
.option("startingOffsets", "earliest")
.option("maxOffsetsPerTrigger", 100)
.load()
.select($"value")
.withColumn("Value", $"value".cast(StringType))
.writeStream
.option("checkpointLocation", "/delta/hazriq_delta_trial2/_checkpoints/test")
.table("hazriq_delta_trial2")
但是,當我查詢表時,它是空的。
我可以確認數據來了。 當我向 Kafka 主題生成消息時,我通過查看圖中的尖峰來驗證它。
我錯過了什么嗎?
我需要關於如何將從 Kafka 獲得的數據插入到表中的幫助。
下面是一個關於如何從 Kafka 讀取數據並將其流式傳輸到增量表的工作示例。 我使用的是 Spark 3.0.1 和 delta-core 0.7.0(如果您使用的是 Spark 2.4 版本,則需要使用 0.6.0)。
val spark = SparkSession.builder()
.appName("Kafka2Delta")
.master("local[*]")
.getOrCreate()
// in production this should be a more reliable location such as HDFS
val deltaPath = "file:///tmp/delta/table"
val df = spark.readStream
.format("kafka")
.option("kafka.bootstrap.servers", "localhost:9092")
.option("subscribe", "test")
.option("startingOffsets", "earliest")
.option("failOnDataLoss", "false")
.load()
.selectExpr("CAST(value AS STRING) as value")
val query: StreamingQuery = df.writeStream
.format("delta")
.option("checkpointLocation", "/path/to/sparkCheckpoint")
.start(deltaPath)
query.awaitTermination()
為了測試,我只是將字符“a”、“b”、“c”和“d”作為值生成到 Kafka 主題中。 顯然,如果 Kafka 輸入數據是例如 JSON 字符串,您可以構建一些更復雜的數據幀。
val table = spark.read
.format("delta")
.load(deltaPath)
.createOrReplaceTempView("testTable")
spark.sql("SELECT * FROM testTable").show(false)
// result
+-----+
|value|
+-----+
|a |
|b |
|c |
|d |
+-----+
>/tmp/delta/table$ ll
total 44
drwxrwxr-x 3 x x 4096 Jan 11 17:12 ./
drwxrwxr-x 3 x x 4096 Jan 11 17:10 ../
drwxrwxr-x 2 x x 4096 Jan 11 17:12 _delta_log/
-rw-r--r-- 1 x x 414 Jan 11 17:12 part-00000-0a0ae7fb-2995-4da4-8284-1ab85899fe9c-c000.snappy.parquet
-rw-r--r-- 1 x x 12 Jan 11 17:12 .part-00000-0a0ae7fb-2995-4da4-8284-1ab85899fe9c-c000.snappy.parquet.crc
-rw-r--r-- 1 x x 306 Jan 11 17:12 part-00000-37eb0bb2-cd27-42a4-9db3-b79cb046b638-c000.snappy.parquet
-rw-r--r-- 1 x x 12 Jan 11 17:12 .part-00000-37eb0bb2-cd27-42a4-9db3-b79cb046b638-c000.snappy.parquet.crc
-rw-r--r-- 1 x x 414 Jan 11 17:12 part-00000-8d6b4236-1a12-4054-b016-3db7a007cbab-c000.snappy.parquet
-rw-r--r-- 1 x x 12 Jan 11 17:12 .part-00000-8d6b4236-1a12-4054-b016-3db7a007cbab-c000.snappy.parquet.crc
-rw-r--r-- 1 x x 407 Jan 11 17:12 part-00000-d2612eaa-3f48-4708-bf90-31dd3d83f124-c000.snappy.parquet
-rw-r--r-- 1 x x 12 Jan 11 17:12 .part-00000-d2612eaa-3f48-4708-bf90-31dd3d83f124-c000.snappy.parquet.crc
1) 嘗試驗證您是否可以從您的 Spark 集群訪問 Kafka,有時您需要允許從 Kafka 中的某些 ips 訪問。
2)嘗試將此.option("startingOffsets", "earliest"
) 更改為此.option("startingOffsets", "latest")
3)也試試
val kafka2 = spark.readStream
.format("kafka")
.option("kafka.bootstrap.servers", kafkaBrokers)
.option("subscribe", kafkaTopic)
.option("startingOffsets", "earliest")
.load()
.select($"value")
.withColumn("Value", $"value".cast(StringType))
.writeStream
.format("delta")
.outputMode("append")
.option("checkpointLocation", "/delta/hazriq_delta_trial2/_checkpoints/test")
.start("hazriq_delta_trial2")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.