单击21世纪的分析数据库

简介:   乔治·霍苏·9分钟阅读  Clickhouse是一个相当新的列存数据库。它是由Yandex(俄罗斯谷歌)的人开发的,水平扩展相当好,并在数百亿行的数据上运行高速聚合查询。  它使用自己的SQL方言,并在表达性和简单性方面匹配PL / PGSQL。它甚至包括用于在行中使用嵌套对象的更高阶函数,例如ArrayMap和ArrayFilter。  什么是Clickhouse?  简而言之,Clickhouse用于在非常大量的数据上运行快速分析。它的事务功能相当糟糕,但它可以在数十亿行中运行秒级聚合查询。

  乔治·霍苏·9分钟阅读

  Clickhouse是一个相当新的列存数据库。它是由Yandex(俄罗斯谷歌)的人开发的,水平扩展相当好,并在数百亿行的数据上运行高速聚合查询。

  它使用自己的SQL方言,并在表达性和简单性方面匹配PL / PGSQL。它甚至包括用于在行中使用嵌套对象的更高阶函数,例如ArrayMap和ArrayFilter。

  什么是Clickhouse?

  简而言之,Clickhouse用于在非常大量的数据上运行快速分析。它的事务功能相当糟糕,但它可以在数十亿行中运行秒级聚合查询。

  它填补了Hadoop,Spark,Druid,Bigquery,redshift,Athena和MonetdB的技术等技术。它允许团队轻松地存储和分析大量数据的大量数据。更重要的是,它在速度和查询复杂性方面将PK上述解决方案。

  Clickhouse仅适用于分析工作负载,因此只要您有很多组合和聚合的函数,例如计数,总和和不同它将快速运行,即使您的行数在11到12位区域。但是,如果你想做大量的大规模加入和点查询,典型的RDBMS仍然是更好的选择。

  应注意,Clickhouse尚不支持删除和更新的查询,并在其稳定的语法中。即使它将,由于其压缩机制,它们也会缓慢。同样,这不是用于事务工作负载的数据库。

  它还将压缩您的数据,这些节省的空间基于列粒度,以及您愿意牺牲多少查询速度。点击按钮压缩和分区数据是其快速查询的关键。

  如果您想了解更多关于存储工作的工作,我建议您从维基百科文章开始,因为大多数信息都很容易理解和准确。

  究竟是什么让Clickhouse令人惊叹?它非常容易设置和使用,即使您需要几十台机器上的数据复制和数据分布。

  如果您熟悉您正在做的内容,请在3台机器上部署Clickhouse集群,如果您正在从头开始。无需安装库,没有无穷无尽的配置文件,用户权限问题和数据分发和复制的术语问题。它并不脆弱。我在Chitdezvous的一个可怕的事情是与各种“大数据”技术(Spark是这里的主要罪犯)交互,他们往往没有警告,没有明显的错误原因。更糟糕的是,他们的信息很少,为什么问题发生在他们生成的日志中。

  Clickhouse旨在从故障中恢复,它会产生相当合理的系统日志,并清楚地解释它遇到的问题。它不会重新发明轮子,它将蒸汽机加到托架上。也许是关于点击屋的最神奇的事情是它不会试图对您推出很多限制,也不会强迫您完全重新思考您存储和查询数据的方式。

  它的数据类型将来自嵌套结构的所有内容涵盖到矩阵,它具有巨大的功能库和我见过的最通用的查询语言之一。

  与其他列存解决方案不同,这将强迫您重新思考整个架构,您可以非常重复与点击屋的事务数据库模式,它会很好。它有一个惊人的文档和一个伟大的社区。也许现在最具“大数据”技术,他们中的大多数都是为了销售支持而设计的。

  对比Druid,开源和自由理论上的典型例子,是一种奇怪的复杂性的巨大堡垒,加上了完全缺乏文件和社区参与。

  Clickhouse的文档相对容易搜索,并且不断地进行修饰,扩展和改进。社区没有令人惊叹,它非常小,由来自yandex的开发人员和用户组成了其他一些早期的采用者,但这并未阻止我在github上提出的每个问题和问题,并且在几小时内得到回答。

  开发人员似乎也非常接受yandex外部的贡献者。

  安装

  第一步是安装Clickhouse,出于本教程的目的,最好有一台运行Debian或Ubuntu的机器,因为这是官方操作系统Yandex支持。

  在Fedora,CentOS,Suse和Rhel上安装它也很容易,我个人安装了它的成功来自Arch上的Aur存储库,它作为Gentoo的包。如果所有其他都失败,则可以使用Docker映像或从源构建它。

  要在Ubuntu上安装它,请执行以下内容:

  sudo apt-add-repository 'deb repo.yandex.ru/clickhouse/deb/stable/ main/'sudo apt-key adv --keyserver keyserver.ubuntu --recv E0C56BD4

  sudo apt-get update

  sudo apt-get install clickhouse-client clickhouse-server

  现在,您可以通过运行sudo systemctl startichouse-server来启动服务器作为守护程序,并通过运行单击 - 客户端通过客户端连接到它。

  如果要使用配置Clickhouse,可以分别在/ etc / clickhouse-server和/ etc / clickhouse-client中找到它们。

  玩一些数据

  对于此介绍,我选择使用NYC物业税数据集,这是一个相当小的数据集约为100万行,但它意味着下载和插入将非常快。只要它们适合本地RAID,查询速度将线性比例缩放,并且如果分布数据,则不会影响大量的数据集。

  如果您安装了旧版本,则可能需要运行:

  SET experimental_allow_extended_storage_definition_syntax=1;

  这将允许您使用本教程中使用的语法。如果您的版本足够新,则尝试运行这将只是抛出异常,无需担心,您都是集。

  让我们创建我们的数据库和表:

  CREATE DATABASE test_database;

  USE test_database;

  CREATE TABLE tax_bills_nyc (

  bbl Int64,

  owner_name String,

  address String,

  tax_class String,

  tax_rate String,

  emv Float64,

  tbea Float64,

  bav Float64,

  tba String,

  property_tax String,

  condonumber String,

  condo String,

  insertion_date DateTime MATERIALIZED now()

  ) ENGINE=MergeTree PARTITION BY tax_class ORDER BY (owner_name)

  在我们插入数据之前,让我们来看看可能有点不清楚的事情。

  MATERIALIZED是创建到自动设置的列的方法,只要在关键字后的函数都会插入行。在这种情况下,我选择使用的函数是now(),以便获得每行的插入时间戳。

  Engine=Mergetree设置表的存储引擎。Clickhouse支持的表带有很多类型的引擎。包括您的标准内存存储器引擎,在需要非常高的写入速率时的缓冲引擎,旨在加速连接和许多其他的Join引擎。Mergetrees是大多数分析查询的最佳表引擎,Mergetree引擎是最简单的,通常是最佳选择。

  虽然MergeTree引擎在这里解释需要太长的东西。如果您熟悉long-structured merge-trees,Radix trees,immutable “Vectors” ,Merkel trees或Patricia trees,Mergetrees的概念和这些一致。

  Cax_Class的分区将使用Tax_Class列分区表。分区是单击小时下的表中最大的存储单元。您可以删除分区,附加分区和临时删除分区。有效的二手手游交易平台点击回复和分布也取决于良好的分区。

  从最终用户的角度来看,您应该关心的是,在使用>,<和==时,分区非常迅速。

  对于您分区的列,您应该选择一个以上粒度略微低,作为一般规则。一个好的规则是每十亿行的数量小于1000个不同的数量。当您的数据与时间点相关联时,一个好的分区主键是与每一行关联的日期。

  顺序通过用户透视图类似于RDBMS中的BTREE索引。它使用比较运算符速度加快查询。与Partition不同,您可以在此处使用高粒度数据而不会丢失性能。同样,在您经常根据时间与每个数据点相关联的表的情况下,该值的良好候选者是每行的时间戳。如果您愿意,您可以通过列的组合订购您的表。

  现在,您应该熟悉您需要与点击屋相处的大多数新概念,其余的应该对您感到非常自然。

  让我们插入我们的数据:

  curl -X GET 'taxbills.nyc/tax_bills_june15_bbls.csv' | /usr/bin/clickhouse-client --input_format_allow_errors_num=10 --query="INSERT INTO test_database.tax_bills_nyc FORMAT CSV"

  基于您的互联网速度,这应该需要几秒钟或几分钟,一旦完成,我们就可以开始测试一些查询。

  如果您想使用更大的数据集但没有时间定义自己的表,只需运行上面的命令即可遍布以下几次:)

  让我们开始运行

  好的,让我们运行我们的第一个查询,不要闪烁:从Tax_bills_nyc中选择count(*)/ pow(10,3)。如果使用服务器等级硬件,则查询应该相对瞬间,可能在亚MS时间内完成。

  出于本教程的目的,我正在使用2.133 GHz的32GB的E3-1270v6,但实际上,任何旧服务器或笔记本电脑都可以。

  让我们尝试一些更难的东西:

  SELECT

  SUM(emv) as total_emv,

  SUM(tbea) as total_tbea,

  SUM(bav) as total_bav,

  tax_class,

  tax_rate

  FROM tax_bills_nyc

  GROUP BY tax_class, tax_rate

  取决于您的机器,响应在50到10毫秒之间,这是一个壮举,以2个维度进行2个指标的聚合,并总结4个不同的列。

  好的,如果我们在群组中添加高维数列,请说出所有者的名称,因为数据集中有大约885,000个不同的名称:

  SELECT

  SUM(emv) as total_emv,

  SUM(tbea) as total_tbea,

  SUM(bav) as total_bav,

  tax_class,

  tax_rate

  FROM tax_bills_nyc

  GROUP BY tax_class, tax_rate, owner_name

  这可能略微慢,但仍然可能花了下半年,尽管我们的新分组标准的粒度很高。

  但是,如果我们正确构建了我们的模式,我们应该能够使用我们的订单或分区列过滤大多数查询,让我们根据Tax_Class列添加一个Where子句:

  SELECT

  SUM(emv) as total_emv,

  SUM(tbea) as total_tbea,

  SUM(bav) as total_bav,

  tax_class,

  tax_rate

  FROM tax_bills_nyc

  WHERE tax_class='1c - condo in 1-3 unit building'

  GROUP BY tax_class, tax_rate, owner_name

  突然间,我们的查询时间再次在低于 10ms范围内下降。

  Clickhouse不仅提供速度,而且它具有各种类型和值操作功能,可以让我们轻松地编写一个输出易于人类可读的东西的查询:

  SELECT concat(toString(uniq(owner_name) / pow(10, 3)), ' thousand distinct names among the owners of ', toString(uniq(address) / pow(10, 3)), ' thousand properties') AS result

  FROM tax_bills_nyc

  这应该给你一个类似的结果:

  85.058 thousand distinct names among the owners of 989.466 thousand properties

  好的,让我们试试,看看如果我们尝试通过此表中的每一个列进行分组会发生什么。为了节省一些键入,我们将使用不同的(*)函数,这将基本上做到这一点。

  SELECT COUNT(DISTINCT(*)) FROM tax_bills_nyc

  令人惊讶的是,这一次再次下降了。

  它实际上可能会更快,然后是之前的一些群体,因为我们没有必要将任何字符串键入的列转换为可打印版本。

  在我的书中,当我第一次看到它时,这很令人印象深刻。

  我偷看了你的兴趣吗?

  希望您能看到为什么我对此数据库非常兴奋,因为单独的表达语法和惊人的查询速度。

  这主要是一个玩具数据集,意思是使本教程易于遵循。所以我鼓励你尝试高达几十亿行,看看自己是多么令人难以置信的这个数据库。

  至于您想要这样做的数据集,我留给您。也许尝试您的一个大型内部表,您通常会在其上运行分析查询。尝试格式化“Data Lake”中的一些数据,您通常会使用像Spark或Athena这样的工具查询,并将其插入“Clickhouse”。

  如果有足够的人有兴趣,我可能会使用更多的提示,技巧和现实世界使用的后续文章或系列。

  (本文由闻数起舞翻译自Jorge Torres的文章《Clickhouse, an analytics database for the 21st century》,转载请注明出处,原文链接:

  george3d6.medium/clickhouse-an-analytics-database-for-the-21st-century-82d3828f79cc)

目录
相关文章
|
21天前
|
Cloud Native OLAP OLTP
在业务处理分析一体化的背景下,开发者如何平衡OLTP和OLAP数据库的技术需求与选型?
在业务处理分析一体化的背景下,开发者如何平衡OLTP和OLAP数据库的技术需求与选型?
122 4
|
4月前
|
关系型数据库 BI 分布式数据库
PolarDB NL2BI解决方案,让你不懂SQL也能进行数据查询分析并生成BI报表
无需创建和开通资源,在预置环境中免费体验PolarDB MySQL及其NL2BI解决方案
PolarDB NL2BI解决方案,让你不懂SQL也能进行数据查询分析并生成BI报表
|
21天前
|
SQL 关系型数据库 MySQL
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(8.0版本升级篇)
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(8.0版本升级篇)
94 0
|
3月前
|
SQL 关系型数据库 MySQL
后端接口性能优化分析-数据库优化(上)
后端接口性能优化分析-数据库优化
115 0
|
3月前
|
SQL 关系型数据库 MySQL
后端接口性能优化分析-数据库优化(下)
后端接口性能优化分析-数据库优化
68 1
|
21天前
|
SQL 关系型数据库 MySQL
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(数据恢复补充篇)(一)
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(数据恢复补充篇)
29 0
|
28天前
|
存储 NoSQL 大数据
新型数据库技术在大数据分析中的应用与优势探究
随着大数据时代的到来,传统数据库技术已经无法满足海量数据处理的需求。本文将探讨新型数据库技术在大数据分析中的应用情况及其所带来的优势,为读者解析数据库领域的最新发展趋势。
|
1月前
|
存储 关系型数据库 MySQL
TiDB与MySQL、PostgreSQL等数据库的比较分析
【2月更文挑战第25天】本文将对TiDB、MySQL和PostgreSQL等数据库进行详细的比较分析,探讨它们各自的优势和劣势。TiDB作为一款分布式关系型数据库,在扩展性、并发性能等方面表现突出;MySQL以其易用性和成熟性受到广泛应用;PostgreSQL则在数据完整性、扩展性等方面具有优势。通过对比这些数据库的特点和适用场景,帮助企业更好地选择适合自己业务需求的数据库系统。
|
3月前
|
SQL 关系型数据库 MySQL
后端接口性能优化分析-数据库优化(中)
后端接口性能优化分析-数据库优化
121 0
|
4月前
|
消息中间件 数据库连接 数据库
py 多进程 引发的 各种数据库连接 消息队列连接 异常问题 简单分析
py 多进程 引发的 各种数据库连接 消息队列连接 异常问题 简单分析
37 0