ClickHouse是一个开源的面向列式数据的数据库管理系统,能够使用SQL查询并且生成实时数据报告。

优点:

1.并行处理单个查询(利用多核)

2.在多个服务器上分布式处理

3.非常快的扫描,可用于实时查询

4.列存储非常适用于“宽”/“非规格化”表(多列)

5.良好的压缩特性

6.SQL支持(有限的支持)

7.一系列函数的支持,包括对近似计算的支持

8.不同的存储引擎的支持(磁盘存储格式)

9.非常适合结构性日志/事件数据以及时间序列数据(引擎的合并树需要日期字段)

10. 索引支持(仅主键支持,不是所有的存储引擎都支持)

11.漂亮的命令行界面,用户友好的进度条和格式

缺点:

1.不支持实时的删除/更新操作,不支持事物(与Spark和大部分大数据系统一样)

2.不支持二级索引(与Spark和大部分大数据系统一样)

3.只支持自己的协议(不支持MySQL协议)

4.有限的SQL支持,join的实现方式不同。如果您正在从MySQL或Spark迁移数据,那么您必须重新编写包含join的所有查询。

5.没有窗口功能

Group by: in-memory vs. on-disk

内存不足是在ClickHouse中处理大型数据集时可能遇到的潜在问题之一:

  1. SELECT
  2. min(toMonth(date)),
  3. max(toMonth(date)),
  4. path,
  5. count(*),
  6. sum(hits),
  7. sum(hits) / count(*) AS hit_ratio
  8. FROM wikistat
  9. WHERE (project = 'en')
  10. GROUP BY path
  11. ORDER BY hit_ratio DESC
  12. LIMIT 10
  13.  
  14. Progress: 1.83 billion rows, 85.31 GB (68.80 million rows/s., 3.21 GB/s.) ██████████▋ 6%Received exception from server:
  15. Code: 241. DB::Exception: Received from localhost:9000, 127.0.0.1.
  16. DB::Exception: Memory limit (for query) exceeded: would use 9.31 GiB (attempt to allocate chunk of 1048576 bytes), maximum: 9.31 GiB:
  17. (while reading column hits):

默认情况下,ClickHouse会限制group by使用的内存量(它使用 hash table来处理group by)。这很容易解决 - 如果你有空闲的内存,增加这个参数:

  1. SET max_memory_usage = 128000000000; #128G,

如果你没有那么多的内存可用,ClickHouse可以通过设置这个“溢出”数据到磁盘:

  1. set max_bytes_before_external_group_by=20000000000; #20G
  2. set max_memory_usage=40000000000; #40G

根据文档,如果需要使用max_bytes_before_external_group_by,建议将max_memory_usage设置为max_bytes_before_external_group_by大小的两倍。

(原因是聚合需要分两个阶段进行:1.查询并且建立中间数据 2.合并中间数据。 数据“溢出”到磁盘一般发生在第一个阶段,如果没有发生数据“溢出”,ClickHouse在阶段1和阶段2可能需要相同数量的内存)

性能对比:

ClickHouse vs. Spark

ClickHouse 和Spark 都是分布式的; 但是为了方便测试我们只进行单节点测试。 测试结果令人震惊

Size / compression Spark v. 2.0.2 ClickHouse
数据存储格式 Parquet, compressed: snappy Internal storage, compressed
Size (uncompressed: 1.2TB) 395G 212G

 Test  Spark v. 2.0.2 ClickHouse Diff
Query 1: count (warm) 7.37 sec (no disk IO) 6.61 sec  ~same
Query 2: simple group (warm)  792.55 sec (no disk IO) 37.45 sec 21x better
Query 3: complex group by   2522.9 sec  398.55 sec  6.3x better

附录:

硬件

  • CPU: 24xIntel(R) Xeon(R) CPU L5639 @ 2.13GHz (physical = 2, cores = 12, virtual = 24, hyperthreading = yes)
  • Disk: 2 consumer grade SSD in software RAID 0 (mdraid)

Query 1

  1. select count(*) from wikistat

ClickHouse:

  1. :) select count(*) from wikistat;
  2.  
  3. SELECT count(*)
  4. FROM wikistat
  5.  
  6. ┌─────count()─┐
  7. 26935251789
  8. └─────────────┘
  9.  
  10. 1 rows in set. Elapsed: 6.610 sec. Processed 26.88 billion rows, 53.77 GB (4.07 billion rows/s., 8.13 GB/s.)

Spark:

  1. spark-sql> select count(*) from wikistat;
  2. 26935251789
  3. Time taken: 7.369 seconds, Fetched 1 row(s)

Query 2

  1. select count(*), month(dt) as mon
  2. from wikistat where year(dt)=2008
  3. and month(dt) between 1 and 10
  4. group by month(dt)
  5. order by month(dt);

ClickHouse:

  1. :) select count(*), toMonth(date) as mon from wikistat
  2. where toYear(date)=2008 and toMonth(date) between 1 and 10 group by mon;
  3.  
  4. SELECT
  5. count(*),
  6. toMonth(date) AS mon
  7. FROM wikistat
  8. WHERE (toYear(date) = 2008) AND ((toMonth(date) >= 1) AND (toMonth(date) <= 10))
  9. GROUP BY mon
  10.  
  11. ┌────count()─┬─mon─┐
  12. 2100162604 1
  13. 1969757069 2
  14. 2081371530 3
  15. 2156878512 4
  16. 2476890621 5
  17. 2526662896 6
  18. 2489723244 7
  19. 2480356358 8
  20. 2522746544 9
  21. 2614372352 10
  22. └────────────┴─────┘
  23.  
  24. 10 rows in set. Elapsed: 37.450 sec. Processed 23.37 billion rows, 46.74 GB (623.97 million rows/s., 1.25 GB/s.)

Spark:

  1. spark-sql> select count(*), month(dt) as mon from wikistat where year(dt)=2008 and month(dt) between 1 and 10 group by month(dt) order by month(dt);
  2. 2100162604 1
  3. 1969757069 2
  4. 2081371530 3
  5. 2156878512 4
  6. 2476890621 5
  7. 2526662896 6
  8. 2489723244 7
  9. 2480356358 8
  10. 2522746544 9
  11. 2614372352 10
  12. Time taken: 792.552 seconds, Fetched 10 row(s)

Query 3

  1. SELECT
  2. path,
  3. count(*),
  4. sum(hits) AS sum_hits,
  5. round(sum(hits) / count(*), 2) AS hit_ratio
  6. FROM wikistat
  7. WHERE project = 'en'
  8. GROUP BY path
  9. ORDER BY sum_hits DESC
  10. LIMIT 100;

ClickHouse:

  1. :) SELECT
  2. :-] path,
  3. :-] count(*),
  4. :-] sum(hits) AS sum_hits,
  5. :-] round(sum(hits) / count(*), 2) AS hit_ratio
  6. :-] FROM wikistat
  7. :-] WHERE (project = 'en')
  8. :-] GROUP BY path
  9. :-] ORDER BY sum_hits DESC
  10. :-] LIMIT 100;
  11.  
  12. SELECT
  13. path,
  14. count(*),
  15. sum(hits) AS sum_hits,
  16. round(sum(hits) / count(*), 2) AS hit_ratio
  17. FROM wikistat
  18. WHERE project = 'en'
  19. GROUP BY path
  20. ORDER BY sum_hits DESC
  21. LIMIT 100
  22.  
  23. ┌─path────────────────────────────────────────────────┬─count()─┬───sum_hits─┬─hit_ratio─┐
  24. Special:Search 44795 4544605711 101453.41
  25. Main_Page 31930 2115896977 66266.74
  26. Special:Random 30159 533830534 17700.54
  27. Wiki 10237 40488416 3955.11
  28. Special:Watchlist 38206 37200069 973.67
  29. YouTube 9960 34349804 3448.78
  30. Special:Randompage 8085 28959624 3581.9
  31. Special:AutoLogin 34413 24436845 710.11
  32. Facebook 7153 18263353 2553.24
  33. Wikipedia 23732 17848385 752.08
  34. Barack_Obama 13832 16965775 1226.56
  35. index.html 6658 16921583 2541.54
  36.  
  37. 100 rows in set. Elapsed: 398.550 sec. Processed 26.88 billion rows, 1.24 TB (67.45 million rows/s., 3.10 GB/s.)

Spark:

  1. spark-sql> SELECT
  2. > path,
  3. > count(*),
  4. > sum(hits) AS sum_hits,
  5. > round(sum(hits) / count(*), 2) AS hit_ratio
  6. > FROM wikistat
  7. > WHERE (project = 'en')
  8. > GROUP BY path
  9. > ORDER BY sum_hits DESC
  10. > LIMIT 100;
  11. ...
  12. Time taken: 2522.903 seconds, Fetched 100 row(s)

ClickHouse适用场景

1. Web和App数据分析

2. 广告网络和RTB

3. 电信

4. 电子商务和金融

5. 信息安全

6. 监测和遥测

7. 时序数据

8. 商业智能

9. 在线游戏

10. 物联网

ClickHouse不适用场景

1. 事物性工作(OLTP)

2. 高并发的键值访问

3. Blob或者文档存储

4. 超标准化的数据

参考:

https://www.percona.com/blog/2017/02/13/clickhouse-new-opensource-columnar-database/

https://clickhouse.yandex/docs/en/single/#ClickHouse%20features%20that%20can%20be%20considered%20disadvantages

ClickHouse开源数据库的更多相关文章

  1. 【转】 MySQL与PostgreSQL:该选择哪个开源数据库?哪一个更好?

    转载地址:http://www.infoq.com/cn/news/2013/12/mysql-vs-postgresql 如果打算为项目选择一款免费.开源的数据库,那么你可能会在MySQL与Post ...

  2. MySQL、PostgreSQL、Ingres r3、MaxDB等开源数据库的详细比较

    1.MySQL 5 作为当今最流行的开放源码数据库之一,MySQL数据库为用户提供了一个相对简单的 解决方案,适用于广泛的应用程序部署,能够降低用户的TCO.MySQL是一个多线程.结构化查询语言(S ...

  3. MySQL全世界最流行的开源数据库软件

    誉天全国首推全球市场占有率第二的数据库——MySQL培训课程,阿里巴巴.新浪等知名企业正在使用MySQL数据库系统,而这方面的人才需求也是供不应求,誉天作为国内2014年首批ORACLE官方授权MyS ...

  4. Java免费开源数据库、Java嵌入式数据库、Java内存数据库

    Java免费开源数据库.Java嵌入式数据库.Java内存数据库 http://blog.csdn.net/leiyinsu/article/details/8597680

  5. Android开发——使用LitePal开源数据库

    前言:之前使用Android内置的数据库,感觉一大堆SQL语句,一不小心就错了,很难受,学习了这个LItePal的开源数据库,瞬间觉得Android内置的数据库简直是垃圾般的存在 LitePal Gi ...

  6. LitepalNewDemo【开源数据库ORM框架-LitePal2.0.0版本的使用】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 本Demo使用的是LitePal2.0.0版本,对于旧项目如何升级到2.0.0版本,请阅读<赶快使用LitePal 2.0版本 ...

  7. Android开发——使用LitePal开源数据库框架

    前言:之前使用Android内置的数据库,感觉一大堆SQL语句,一不小心就错了,很难受,学习了这个LItePal的开源数据库框架,瞬间觉得Android内置的数据库简直是垃圾般的存在 LitePal ...

  8. 我发起了一个 .Net 开源 数据库 项目 SqlNet

    大家好 , 我发起了一个 .Net 开源 数据库 项目 SqlNet . 项目计划 是 用 C# 写一个 关系数据库 . 可以先参考我之前写的 2 篇文章 : 谈谈数据库原理    https://w ...

  9. MySQL VS PostgreSQL:该选择哪个开源数据库?

    Naresh Kumar 是一位软件工程师与热情的博主,对编程与新事物充满了激情和兴趣.近日,Naresh撰写了一篇博文,对开源世界最常见的两种数据库 MySQL 与 PostgreSQL 的特点进行 ...

随机推荐

  1. MongoDB - 内嵌角色

    数据库用户角色(每个数据库都有的角色)   角色名 说明 read 对non-system集合的读取权限,以及以下system集合的读取权限:system.indexes,system.js,syst ...

  2. 读取properties属性文件——国际化

    public class PropertiesInfo { /** * PropertiesInfo实例 */ private static PropertiesInfo pi = null; pri ...

  3. 【HDOJ 5379】 Mahjong tree

    [HDOJ 5379] Mahjong tree 往一颗树上标号 要求同一父亲节点的节点们标号连续 同一子树的节点们标号连续 问一共同拥有几种标法 画了一画 发现标号有二叉树的感觉 初始标号1~n 根 ...

  4. Android图片二级缓存

    点击下载源代码 想起刚開始写代码的时候,领导叫我写一个头像下载的方法,当时屁颠屁颠就写了一个图片下载的,每次都要去网络上请求,最后直接被pass掉了 当时的思路是这种 后来渐渐地就知道了有二级缓存这东 ...

  5. vncviewer鼠标不同步问题

    sh-4.1# virsh edit win7 把下面的参数: <input type='mouse' bus='ps2'/> 改成: <input type='tablet' bu ...

  6. 怎么解决ORACLE 中 CHAR类型的索引问题

    在很多场景中,都有如下情况 trim(a.colunm1) = trim(b.colunm2) 应该怎么优化呢? 用到 TRIM 的很多原因是某些系统为了提高查询效率,不使用  ORACLE 的特有的 ...

  7. JVM Specification 9th Edition (2) Chapter 1. Introduction

    Chapter 1. Introduction 翻译太累了,我就这样的看英文吧. 内容列表 1.1. A Bit of History 1.2. The Java Virtual Machine 1. ...

  8. PHP——上传文件

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. idea编译修改jdk版本

    由于项目需要,需要修改jdk的版本为1.8,这里记录一下修改的地方 1,项目的jdk版本 右键点击项目-> open module setting ->project,然后如图所示 2,在 ...

  10. 第一百四十八节,封装库--JavaScript,菜单切换

    第一百四十八节,封装库--JavaScript,菜单切换 首先在封装库封装点击切换方法 /** dian_ji_qie_huan()方法,设置点击切换,将元素设置成点击切换,也就是点击目标元素后,循环 ...