The Snowflake Elastic Data Warehouse论文--Local Caching and File Stealing阅读笔记

3.2.2Local Caching and File Stealing 本地缓存和文件窃取

1、本地磁盘上的缓存以什么为单位缓存?Virtual Warehouse?Worker node?

以Worker node为单位在本地磁盘缓存

2、本地磁盘缓存的是什么?

缓存的是之前查询时从S3上下载下来的文件头和查询涉及到的列文件信息

3、为什么要在本地磁盘缓存而不是每次都从S3下载呢?

(1)从S3下载有网络开销,影响性能

(2)从S3下载,每次访问S3都需要收费,为了省钱

4、本地磁盘缓存的生命周期是什么?

只要Worker node没有被销毁,本次磁盘缓存就一直存在

5、本地磁盘缓存的失效策略是什么?

LRU策略

6、如何提高本地磁盘缓存的命中率?

通过表对应的底层文件名称在Worker node间进行一致性Hash,将Hash值相同的文件送到同一个Worker node处理

7、有Worker node变更时,本次磁盘缓存如何重分布?

Worker node变更后,缓存在Worker node本地的文件不会马上进行重分布,而是依照LRU策略,逐步淘汰缓存在本地的数据文件。

一般的shared-nothing的数据库,由于计算和存储绑定,所以当有计算节点变更后,首先需要进行数据重分布,而snowflake的设计是不马上对缓存在本地磁盘的数据文件进行重分布,而是等后续的sql查询时,再逐步更新,这样就降低了有Worker node节点变更时,由于需要数据重分布而影响整个集群的性能。

8、有数据倾斜时,如何保证性能?

执行快的Worker node节点会向其他Worker node节点发送请求,请求处理其他Worker node节点未处理完的数据,当执行慢的Worker node节点收到请求后,会将一部分文件列表发给执行快的Worker node节点,执行快的Worker node节点收到响应后,从S3上加载对应的数据文件进行处理。

这里有一些细节的地方,在论文里并没有表述,比如

(1)执行快的Worker node节点向执行慢的Worker node节点请求处理未完成的数据文件时,不管剩余多少,执行慢的Worker node节点都会把自己未完成的文件列表发给执行快的Worker node吗?这里的标准是什么?

(2)执行快的Worker node节点根据执行慢的Worker node节点发回来的文件列表从S3上读取对应文件后,会不会导致本地磁盘上的缓存被覆盖,这样下次执行sql时,本该在执行快的节点处理的数据文件,还需要重新从S3上读取,会影响性能吗?处理机制是什么?

感悟:

计算和存储分离后,把数据从S3加载的速度慢于本地磁盘读取的速度,因此snowflake给每个Worker node节点配备高速SSD,不是为了保存原始数据,而是保存被之前查询请求过的热数据,为了提高缓存命中率,查询优化器在调度TableScan算子时,会根据表对应底层文件名以一致性Hash算法把数据加载请求分到这些Worker node节点上,尽量同一文件请求落到同一Worker node上,提高命中率。

从大的架构上看,snowflake做了计算和存储分离,如果看本地磁盘缓存这个细节,会发现,计算和存储有绑定到一起,属于热数据的弱绑定。

posted @ 2020-10-30 08:45  飞舞的小蛇  阅读(499)  评论(0)    收藏  举报