数据加速查询处理的方法
- 矢量化查询执行
- 运行时代码生成
在后者中,动态地为每一类查询生成代码,消除了间接分派和动态分派。
这两种方法中,并没有哪一种严格地比另一种好。运行时代码生成可以更好地将多个操作融合在一起,从而充分利用 CPU 执行单元和流水线。矢量化查询执行不是特别实用,因为它涉及必须写到缓存并读回的临时向量。如果 L2 缓存容纳不下临时数据,那么这将成为一个问题,如果我们要尽量使块的大小足够小,从而 CPU 缓存能够容纳下临时数据。在这个假设下,与其他计算相比,读写临时数据几乎是没有任何开销的(相比后者优点:拆分流水线使得中间数据缓存、获取同时运行的类似查询的中间数据以及相似查询的流水线合并等功能很容易实现,并且矢量化查询执行更容易利用 CPU 的 SIMD 功能)。论文表明,将两种方法结合起来是更好的选择,clickhouse 使用了矢量化查询执行,同时初步提供了有限的运行时动态代码生成。
mpp 架构
MPP ( Massively Parallel Processing ),即大规模并行处理,在数据库非共享集群中,每个节点都有独立的磁盘存储系统和内存系统,业务数据根据数据库模型和应用特点划分到各个节点上,每台数据节点通过专用网络或者商业通用网络互相连接,彼此协同计算,作为整体提供数据库服务。
mpp 理念
1、消除共享资源
2、并行(单机多核并行 sse 指令,多节点并行)
与批处理引擎 spark 的区别
ck 每个 executor 运行完全相同的数据处理逻辑,处理从本地存储加载的私有数据块。在执行步骤间有一些为数据交换而实现的同步点 shuffle(例如 Apache Spark 和 MapReduce 的 shuffle 步骤)
- 区别 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 就望尘莫及了。