目录
简介
https://docs.snowflake.com/en/user-guide/intro-key-concepts.html
Snowflake是作为软件即服务(SaaS)提供的分析数据仓库。与传统的数据仓库产品相比,Snowflake提供了一个更快,更易于使用且更加灵活的数据仓库。Snowflake的数据仓库不是建立在现有数据库或Hadoop等“大数据”软件平台上的,Snowflake数据仓库使用新的SQL数据库引擎,该引擎具有为云设计的独特架构。对于用户而言,Snowflake与其他企业数据仓库有很多相似之处,但还具有一些其他特有功能。
整体类别
计算
计算+接口
计算+存储+接口
存储
https://zhuanlan.zhihu.com/p/56745552
https://zhuanlan.zhihu.com/p/126357511
Snowflake是一款面向Amazon Cloud上EC2和S3而构建起来的在线数仓系统,支持极致弹性、多租户、端到端安全、完整CRUD、事务、内置半结构化、无结构化数据等特性。
属于对象存储类型。
这里其实snowflake是做了较多的调研,包括hdfs,s3,最后的结论是发现s3在peformance,usabliity, high avaibability, strong durabllity guarantees hard to beat。所以存储层聚焦到virtual warehouse层的data cache和skew resilience。skew resilience指的是即使ecs的规格一样,但是由于网络、磁盘io等原因,还是会导致不同节点之间性能不均衡的问题,云计算超卖原罪。
底层选择S3解决了很多的存储问题,但在现阶段延时问题还是存在的,因此,针对热数据做本地SSD缓存+多级缓存是很自然的选择。因为VirtualWarehouse单元是用户级别的,所以这些热数据缓存可以被Query级、进程级、EC2级、用户级大量复用,从而极大的降低成本。
Snowflake选择在多个VW间构建Consistent Hashing的缓存层,来管理S3上的表文件和对应node节点(真正的计算节点)之间的关系;同时优化器感知这个缓存层,在做物理执行计划时,将query中的扫表算子按表文件名分派到对应的node上,从而实现缓存的高命中率;同时,因为存储计算分离+share data架构,计算上并不强耦合缓存层,所以node节点的增删并不需要立即做缓存数据的shuffle,而是基于LRU,在多个后续Query中摊还的替换表文件,完成缓存层的Lazy Replacement,平滑过渡。
S3无限容量+数据多副本+分布式强一致等,还给Snowflake带来更多红利。
S3的问题:
1. latency
2. cpu overhead,使用HTTP连接。http解包,封包
S3的优势:
1. 操作简单,put、get、delete
2. 文件只能被整个重写,甚至不能在文件末尾append,文件大小必须在put的时候指定。
3. Get可以取部分文件。
基于这些特性做了很多适配的设计:
1. 表被水平划分成large,immutable文件,等同于传统数据库的block或者page;
2. 列或者属性使用PAX格式混合列存;
3. 每个文件有header,保存metadata;
4. 不仅仅使用s3作为table的存储,还使用s3保存临时数据(当节点的磁盘满的时候)
5. 大的query结果,因为结果可以全部写入s3,所以不需要传统数据库的curser
Metadata例如catalog对象,table由哪些s3文件组成,统计,锁,事务日志保存在一个kv存储里面,这个kv存储作为Cloud Services layer一部分。
存储引擎
https://docs.snowflake.com/en/user-guide/intro-key-concepts.html
Snowflake数据仓库使用新的SQL数据库引擎,该引擎具有为云设计的独特架构。
https://www.sohu.com/a/411196821_185201?_trans_=000014_bdss_dkygcbz
(关于引擎的具体设计没有查到,Snowflake既无法建立索引,又不可捕获统计信息,更无法管理分区,能知道的引擎功能只有压缩很好)
https://zhuanlan.zhihu.com/p/126357511
snowflake自己实现了一个执行引擎,engine build is :
列存, 向量化,和push-based(这里针对是传统的火山模型)。这里并没有提code-gen。
- 列存:对cpu cache更加友好,避免cache miss,能使用SIMD指令;
- 向量化:避免雾化中间结果,相反数据是以pipeline的方式处理,数据以千行为单位一个batch一个batch处理,这种方式提高了IO效率和cache效率
- Push-based:相比经典的火山模型。基于push的模型可以提高cache效率,因为他减少了loop的控制流,另外他还是snowflate可以有效的处理DAG类型的plan,相比于tree型执行计划,为sharing和pilelining中间结果创造了机会。
平台管理
架构
https://docs.snowflake.com/en/user-guide/intro-key-concepts.html
Snowflake的架构是传统shared-disk数据库架构和shared-nothing数据库架构的混合体。
与shared-disk数据库架构相似,Snowflake数据仓库中所有计算节点访问的持久化数据使用中央数据存储库存储。
也与shared-nothing数据库架构相似,Snowflake使用MPP(大规模并行处理)计算集群处理查询,集群中的每个节点都在本地存储整个数据集的一部分。
这种方法简化了shared-disk数据库架构的数据管理,还具备shared-nothing数据库的性能和横向扩展优势。
Snowflake的独特架构包括三个关键层:
数据库存储
将数据加载到Snowflake后,Snowflake会将数据重组为内部优化的压缩列式格式。Snowflake将此优化的数据存储在云存储中。
Snowflake管理着存储此数据的所有方面——组织(organization),文件大小,结构,压缩,元数据,统计信息,并且数据存储的其他方面由Snowflake处理。Snowflake存储的数据对象不直接可见,