大数据:基于Kafka多数据源接入及存储

256 阅读1分钟

随着云平台的兴起,许多企业选择使用引入诸如Aliyun|AWS|Azure的云平台服务作为业务系统的载体进行开发、打包、部署(DevOps).本系列文章是基于Spark+Azure(databricks+snowflake)的大数据开发实践。

本文简单介绍下数据流转的过程,如下图所示: data_flow.png

本流程基于kafaka-delta-snowflake,实现了大数据的接收和消费(数据延时控制在3-5min左右)

  1. 选择Kafka作为多数据源(topic)接入方式,Scala对其提供了很好的API实现。spark.apache.org/docs/latest… learn.microsoft.com/en-us/azure…
val df = spark
  .readStream
  .format("kafka")
  .option("kafka.bootstrap.servers", "host1:port1,host2:port2")
  .option("subscribe", "topic1")
  .load()
  
df.writeStream.foreachBatch { (batchDF: DataFrame, batchId: Long) =>
  batchDF.persist()
  batchDF.write.format(...).save(...)  // location 1
  batchDF.write.format(...).save(...)  // location 2
  spark.sql(mergeSQL)
  batchDF.unpersist()
}

  1. Delta table一般分为三个schema(raw data->validated data->business data),这里我们使用两个,raw schema下的table储存完整的source message和增量数据(delta overwrite),gold schema下的table使用merge SQL去重:learn.microsoft.com/en-us/azure… merge sql.png

  2. 基于成本的考量,将去重的business data直接拷贝到Snowflake table供前端基于SQL进行查询即可。这里我们使用stage-stream-task方式进行同步:docs.snowflake.com/en/user-gui…

    1. 基于时间戳将数据同步到stage table
    2. 使用snowflake的stream track stage table
    3. 使用task,再次使用merge SQL同步stream的增量数据到snowflake business table

小结:此版本仅作为POC,在具体的实践中,有些地方可以进行优化,比如直接使用snowflake External table或者基于delta live table pipline等

下篇文章将在databricks的notebook上完成Kafka消费、dalta table数据存储的code。

如有疑问或者建议,欢迎留言一起讨论