【问题标题】:How to stream data from Kafka topic to Delta table using Spark Structured Streaming如何使用 Spark 结构化流将数据从 Kafka 主题流式传输到 Delta 表
【发布时间】:2019-07-21 21:40:24
【问题描述】:

我正在尝试了解 databricks delta 并考虑使用 Kafka 进行 POC。基本上计划是使用来自 Kafka 的数据并将其插入到 databricks 增量表中。

这些是我执行的步骤:

  1. 在数据块上创建增量表。
%sql
CREATE TABLE hazriq_delta_trial2 (
  value STRING
)
USING delta
LOCATION '/delta/hazriq_delta_trial2'
  1. 使用来自 Kafka 的数据。
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之前运行您的代码,一旦代码运行,您需要将数据发送到kafka。
  • 可以尝试直接插入Delta表目录而不是插入表吗?例如。 kafka .writeStream .format("delta") .outputMode("append") .option("checkpointLocation", "/delta/events/_checkpoints/etl-from-json") .start("/delta/events") // as a path

标签: scala apache-spark apache-kafka spark-structured-streaming delta-lake


【解决方案1】:

1) 尝试验证您是否可以从 Spark 集群访问 Kafka,有时您需要允许来自 Kafka 中某些 ip 的访问。

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")

【讨论】:

    【解决方案2】:

    下面是一个关于如何从 Kafka 读取数据并将其流式传输到增量表中的工作示例。我使用的是 Spark 3.0.1 和 delta-core 0.7.0(如果您使用的是 Spark 2.4 版本,则需要使用 0.6.0)。

    将数据从 Kafka 流式传输到 Delta 表中

    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 字符串。

    检查 Delta 表中的数据

    val table = spark.read
      .format("delta")
      .load(deltaPath)
      .createOrReplaceTempView("testTable")
    
    spark.sql("SELECT * FROM testTable").show(false)
    
    // result
    +-----+
    |value|
    +-----+
    |a    |
    |b    |
    |c    |
    |d    |
    +-----+
    

    在 deltaPath 中创建的文件

    >/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
    
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-17
      • 2019-05-13
      • 2018-05-27
      • 1970-01-01
      • 2018-04-13
      • 1970-01-01
      相关资源
      最近更新 更多