专栏首页量化投资与机器学习战斗民族开源神器ClickHouse:一款适合于构建量化回测研究系统的高性能列式数据库(一)

战斗民族开源神器ClickHouse:一款适合于构建量化回测研究系统的高性能列式数据库(一)

编辑部原创

编译:wally21st、 西西

未经允许,不得转载

对于一些私募投资机构个人来说,量化投资研究、回测离不开数据的支持。当数据量达到一定数量,如A股所有频率和种类的数据等等。这时候需要的是对数据有效的储存和管理。今年6月才开源的数据库ClickHouse,为我们提供了福音。ClickHouse来自俄罗斯,又是刚刚开源,社区也是俄语为主。因此,大家对它并不是很熟悉,用的人也不是很多。

我们对比一下他的速度

一个字

上面是100M数据集的跑分结果:ClickHouse 比 Vertia 快约5倍,比 Hive 快279倍,比 My SQL 快801倍。 举个例子:ClickHouse 1秒,Vertica 5.42秒,Hive 279秒;

今天,公众号开始连载ClickHouse的文档,由特约作者:wally21st、西西翻译和解释。希望在量化圈对于数据管理苦恼的人们,带来一些有用的信息和帮助。

私募和机构对于数据是渴求的,但是拿到那么多数据怎么管理也是一门很深的学问。

由于译者英文水平、数据库技术和时间精力所限,希望大家一起参与翻译和研究。

参与请联系邮箱:lhtzjqxx@163.com

介绍第一节

Clickhouse是什么

Clickhouse是一个用于联机分析处理(OLAP)的列式数据库管理系统(columnar DBMS)。

在通常的按行存储的数据库中,数据是按照如下顺序存储的:

换句话说,一行内的所有数据都彼此依次存储。像这样的行式数据库包括MySQL、Postgres、MS SQL-Server等。

在面向列的数据库管理系统中,数据是这样存储的:

这些例子只显示了数据排列的顺序。来自不同列的值分别存储,而来自同一列的数据存储在一起。列式数据库例如有:Vertica, Paraccel (Actian Matrix) (Amazon Redshift), Sybase IQ, Exasol, Infobright, InfiniDB, MonetDB (VectorWise) (Actian Vector), LucidDB, SAP HANA, Google Dremel, Google PowerDrill, Druid, kdb+等。

不同的数据存储顺序适合不同的应用场景。对于数据访问场景而言,通常关注的是:多久、以多少比例进行怎样的查询;对不同类型(行、列、字节)的查询,需要读取多少数据量;读取与更新数据之间的关系;数据的工作规模量和如何在本地使用数据;是否使用事务和事务的隔离问题;数据复制和逻辑完整性的要求;对各种查询类型的延迟和吞吐量的要求。

系统负载越高,为场景进行系统定制化就越重要,定制化就越具体。没有一个系统能同样适用于极其不同的场景。在高负载下,一个能适应众多场景的系统,要么在各个场景下表现得都很差,要么仅仅只能较好地处理某一场景的问题。

我们认为,以下几条针对的是联机分析处理(OLAP)应用场景:

  • 绝大多数请求都是用于读访问的。
  • 数据需要以大批次(大于1000行)进行更新,而不是单行更新;或者根本没有更新操作。
  • 数据只是添加到数据库,没有必要修改。
  • 读取数据时,会从数据库中提取出大量的行,但只用到一小部分列。
  • 表很“宽”,即表中包含大量的列
  • 查询频率相对较低(通常每台服务器每秒查询数百次或更少)。
  • 对于简单查询,允许大约50毫秒的延迟。
  • 列的值是比较小的数值和短字符串(例如,每个URL只有60个字节)。
  • 在处理单个查询时需要高吞吐量(每台服务器每秒高达数十亿行)。
  • 不需要事务。
  • 数据一致性要求较低。
  • 每次查询中只会查询一个大表。除了一个大表,其余都是小表。
  • 查询结果显著小于数据源。即数据有过滤或聚合。返回结果不超过单个服务器内存大小。

显然,OLAP场景与其他常用的应用场景非常不同,如OLTP或key-Value获取的场景。所以,如果你在处理分析型查询中想要获得高性能,没有任何理由去使用OLTP或键值数据库。打个比方,如果你想用MongoDB或者Elliptics做数据分析,你会“爽”到极点,谁用谁知道。

列式数据库更适合OLAP场景(大多数查询的处理速度至少提高100倍),原因如下:

1、I/O的原因:

a. 对于分析型查询,只需要读取少量的列。在列式数据库中,你能只读取你需要的。例如,如果你需要100个列中的5个,你可以预期I/O减少20倍。

b. 由于数据是打包读取的,所以更容易压缩。列式数据更容易压缩,也进一步降低了I/O量。

c. 由于减少了I/O,更多数据可以进入系统缓存。例如,查询“计算每个广告平台的记录数”,需要读取一个“广告平台ID”的列,该列未压缩时占用1字节空间。如果大多数流量不是来自广告平台,你可以期望把此列至少压缩10倍。采用快速压缩算法,数据解压缩的速度可以达到每秒解出几个GB的数据。换句话说,这个查询可以以每秒大约数十亿行的速度在单台服务器上处理。这个速度在实践中是被检验过的。

举个栗子:

2、CPU的原因

由于执行查询需要处理大量的行,所以它有助于以整个向量方式分发所有运算,而不是按单独的行。它也有助于实现查询引擎,因此几乎没有分发成本。如果不这样做,对于任何像样的磁盘子系统,查询解释器不可避免地会阻塞CPU。因此,如果可以的话,将数据按列存储和处理,是明智之举。

有两种方法可以实现这一点:

  1. 一个向量引擎。所有操作都是为向量,而不是为单独的值编写的。这意味着你不需要经常调用运算,而且分发成本可以忽略不计运算代码包含一个优化的内部循环。
  2. 代码生成。为查询生成的代码包含了所有的间接调用。

这不是在“普通”的数据库中完成的,因为执行简单查询是没有意义的。然而,也有例外,例如MemSQL使用代码生成来减少处理SQL查询时的延迟。(对比而言,分析型数据库系统需要优化吞吐量,而不是优化延迟)。

注意,为了CPU效率,查询语言必须是声明式的(SQL或MDX),或者至少是一个向量(J.K)。考虑到优化,查询应该只包含隐式循环。

本文分享自微信公众号 - 量化投资与机器学习(ZXL_LHTZ_JQXX),作者:wally21st、西西

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-07-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【Python机器学习】数据预处理——图像压缩与线性代数

    现在有一张朱迪的照片,这张照片有500多列的像素点构成,但是大部分地方都是白色的,相互没有什么差别,也就是说图像中有很多列都是相互线性相关的,这些列向量对我们接...

    量化投资与机器学习微信公众号
  • ​为什么说p值像根针?一场关于p值的战争!

    关于p值的争论多到难以置信。作为一名既支持频率学派也支持贝叶斯学派的统计学家,让我们来试试为你解惑。我们将非常乐意站在一个中立的立场。

    量化投资与机器学习微信公众号
  • 所有模型都是错的,但其中有些是有用的!

    2008年的金融危机以惊人的方式向世界揭示了金融模型的脆弱性。自金融危机以来,有一 个词一再出现:模型风险(model risk)。

    量化投资与机器学习微信公众号
  • 《06.Spring Boot的数据访问:PagingAndSortingRepository使用》

    示例 使用PagingAndSortingRepository接口 PagingAndSortingRepository继承自CrudRepository接口,...

    企鹅号小编
  • 亿级数据量系统 db 数据库性能优化方案

    MySQL数据库默认连接为100,我们可以通过配置initialSize、minIdle、maxActive等进行调优,但由于硬件资源的限制,数据库连接不可能无...

    一个会写诗的程序员
  • 19.QT-事件发送函数sendEvent()、postEvent()

    张诺谦
  • 19.QT-事件发送函数sendEvent()、postEvent()

    张诺谦
  • 微服务实战(五):落地微服务架构到直销系统(构建高性能大并发系统)

    在现代系统中,特别是互联网软件,通常会涉及到大量用户的并发访问,我们的系统一定要在架构上支持高性能、大并发的访问。一个高性能的系统通常由很多的方面组成,包括数据...

    用户1910585
  • Spring核心——上下文与IoC 原

    前面3篇分别介绍了IoC容器与Bean的关系、Bean与Bean之间的关系以及Bean自身的控制和管理。在了解Spinrg核心模式时,一定要谨记他的基本工作元素...

    随风溜达的向日葵
  • 什么是数字孪生?跟数据可视化的关系又是什么?

    2019年,“数字孪生”热度不断攀升,备受行业内外关注。各大峰会论坛将其作为热议主题,全球最具权威的IT研究与顾问咨询机构Gartner在2019年报告中将其列...

    数据猿

扫码关注云+社区

领取腾讯云代金券