数据加速查询处理的方法
- 矢量化查询执行
- 运行时代码生成
在后者中,动态地为每一类查询生成代码,消除了间接分派和动态分派。这两种方法中,并没有哪一种严格地比另一种好。运行时代码生成可以更好地将多个操作融合在一起,从而充分利用 CPU 执行单元和流水线。矢量化查询执行不是特别实用,因为它涉及必须写到缓存并读回的临时向量。如果 L2 缓存
容纳不下临时数据,那么这将成为一个问题,如果我们要尽量使块的大小足够小,从而 CPU 缓存能够容纳下临时数据。在这个假设下,与其他计算相比,读写临时数据几乎是没有任何开销的(相比后者优点:拆分流水线使得中间数据缓存、获取同时运行的类似查询的中间数据以及相似查询的流水线合并等功能很容易实现,并且矢量化查询执行更容易利用 CPU 的 SIMD 功能)。论文表明,将两种方法结合起来是更好的选择,clickhouse
使用了矢量化查询执行,同时初步提供了有限的运行时动态代码生成。
mpp架构
MPP ( Massively Parallel Processing
),即大规模并行处理,在数据库非共享集群中,每个节点都有独立的磁盘存储系统和内存系统,业务数据根据数据库模型和应用特点划分到各个节点上,每台数据节点通过专用网络或者商业通用网络互相连接,彼此协同计算,作为整体提供数据库服务。
mpp理念
1、消除共享资源
2、并行(单机多核并行sse指令,多节点并行)
与批处理引擎spark的区别
ck每个executor运行完全相同的数据处理逻辑,处理从本地存储加载的私有数据块。在执行步骤间有一些为数据交换而实现的同步点shuffle(例如Apache Spark和MapReduce的shuffle步骤)
![](https://img.haomeiwen.com/i15041653/b6914dbe20c2f427.png)
- 区别1 单node性能制约
受限与单executor性能制约(木桶原理),所以mpp架构数据库节点不宜太多,建议50以下,这也是与spark等批处理引擎的一个区别,具体来说,基于HDFS的MapReduce task数量等于输入分片,通常等于输入文件的HDFS块数量。在同步点之间,根据executor的可用性,task被随机分配给executor,如果executor经常失败,性能低下,这时预测执行
将起效——慢节点上的task将在其他节点上重启,重新调度(注意这里是移动数据,走网络
) - 区别2 并发性
并发性是指有多少个查询可以有效地被并行执行。MPP是完全对称的,一旦开始执行,集群中的每个节点并行执行相同的任务。这意味着MPP方案的并发级别完全与集群节点的数量无关。具体来说,无论集群是4个节点还是400个节点,并发性是一样的,它们的性能衰退也会在同一点体现,但是对于spark来说,无限制,取决于你的集群规模。
总结
ClickHouse
在计算层做了非常细致的工作,竭尽所能榨干硬件能力,提升查询速度。它实现了单机多核并行、分布式计算、向量化执行与SIMD指令、代码生成等多种重要技术。
根据经验,主流MPP系统与Apache Spark比较性能的话——同样硬件集群规模——Apache Spark通常会慢3-5倍。所以合理的把MPP集群规模限制在50台,将和250台规模的Apache Spark集群性能一致,但是呢Apache Spark可以超过250个节点,MPP就望尘莫及了
网友评论