我们的组织在数据科学家使用的Azure上运行Databricks;分析人员主要为笔记本电脑进行分析和探索。
我们还为不需要spark的ETL工作流运行Kubernetes集群。
我们希望使用Delta Lakes作为我们的存储层,其中Databricks和Kubernetes都能够作为一流公民进行读写。
目前,我们的Kubernetes作业直接将parquet写入blob store,另外还有一个作业启动databricks集群,将parquet数据加载到Databrick的表格式中。这是缓慢和昂贵的。
我想做的是从Kubernetes python直接写入Delta lake,而不是首先将parquet文件转储到blob存储,然后触发额外的Databricks作业将其加载为Delta lake格式。
相反,我也想利用Delta lake从Kubernetes查询。
简而言之,我如何设置我的Kubernetes python环境,使它能够平等地访问现有的Databricks Delta Lake进行写入&查询呢?
如能提供代码,不胜感激。
您可以通常可以使用Spark的Delta连接器写入Delta表。使用必要的包和配置选项启动Spark作业:
spark-submit --packages io.delta:delta-core_2.12:1.0.0
--conf "spark.sql.extensions=io.delta.sql.DeltaSparkSessionExtension"
--conf "spark.sql.catalog.spark_catalog=org.apache.spark.sql.delta.catalog.DeltaCatalog"
...
,并以与Databricks相同的方式编写:
df.write.format("delta").mode("append").save("some_location")
但是通过使用OSS版本的Delta,你可能会失去一些只在Databricks上可用的优化,比如数据跳转等——在这种情况下,从Kubernetes写入的数据的性能可能会更低(实际上取决于你如何访问数据)。
可能会有这样一种情况,当你不能写入由Databricks创建的Delta表时——当这个表是由writer版本高于OSS Delta连接器支持的writer编写时(参见Delta协议文档)。例如,当您在Delta表上启用Change Data Feed(在写入数据时执行其他操作)时,就会发生这种情况。
在Spark之外,有计划为基于jvm的语言实现所谓的独立编写器(除了现有的独立阅读器)。还有一个用Rust实现的delta-rs项目(带有Python的绑定);Ruby),应该能够写入Delta表(但我自己还没有测试过)
更新14.04.2022:从1.2.0版本开始,数据跳过也可以在OSS Delta中使用