随着云平台的兴起,许多企业选择使用引入诸如Aliyun|AWS|Azure的云平台服务作为业务系统的载体进行开发、打包、部署(DevOps).本系列文章是基于Spark+Azure(databricks+snowflake)的大数据开发实践。
本文简单介绍下数据流转的过程,如下图所示:
本流程基于kafaka-delta-snowflake,实现了大数据的接收和消费(数据延时控制在3-5min左右)
- 选择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()
}
-
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…
-
基于成本的考量,将去重的business data直接拷贝到Snowflake table供前端基于SQL进行查询即可。这里我们使用stage-stream-task方式进行同步:docs.snowflake.com/en/user-gui…
- 基于时间戳将数据同步到stage table
- 使用snowflake的stream track stage table
- 使用task,再次使用merge SQL同步stream的增量数据到snowflake business table
小结:此版本仅作为POC,在具体的实践中,有些地方可以进行优化,比如直接使用snowflake External table或者基于delta live table pipline等
下篇文章将在databricks的notebook上完成Kafka消费、dalta table数据存储的code。
如有疑问或者建议,欢迎留言一起讨论