利用clickhouse的信息搜集

#介绍

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

它不同于一般的关系数据库。像mysql,sqlserver都是以行为单位存储的,像这样:

但是clickhouse不是,它是以列式为单位存储的:

那么这样存储有什么不一样呢?

在讲为什么之前我们首先先说一个概念:OLAP(来源百度百科)

1
OLAP:联机分析处理OLAP是一种软件技术,它使分析人员能够迅速、一致、交互地从各个方面观察信息,以达到深入理解数据的目的。它具有FASMI(Fast Analysis of Shared Multidimensional Information),即共享多维信息的快速分析的特征。

也就是一个字,快!

OLAP场景的关键特征:

  • 大多数是读请求
  • 数据总是以相当大的批(> 1000 rows)进行写入
  • 不修改已添加的数据
  • 每次查询都从数据库中读取大量的行,但是同时又仅需要少量的列
  • 宽表,即每个表包含着大量的列
  • 较少的查询(通常每台服务器每秒数百个查询或更少)
  • 对于简单查询,允许延迟大约50毫秒
  • 列中的数据相对较小: 数字和短字符串(例如,每个URL 60个字节)
  • 处理单个查询时需要高吞吐量(每个服务器每秒高达数十亿行)
  • 事务不是必须的
  • 对数据一致性要求低
  • 每一个查询除了一个大表外都很小
  • 查询结果明显小于源数据,换句话说,数据被过滤或聚合后能够被盛放在单台服务器的内存中

也就是说如果我们要从互联网上筛选大数据进行分析的话,需要存入数据库,即符合OLAP的应用特征。

而相对于行数据库而言,列数据库是更适合OLAP场景的。原因在官方文档里面有很明确的说明https://clickhouse.tech/docs/zh/#input-output

通俗易懂的就是:

  1. 行存储使用逐行处理模式,每次只处理一行数据;而列存储索引使用批处理模式,每次处理一批数据行。

  2. 行存储是逐行存储(Row Store),每一个Page存储多行数据,而列存储(Column Store)把数据表中的每一列单独存储在Page集合中,这意味着,Page集合中存储的是某一列的数据,而不是一行中所有列的数据。

    在读取数据时,行存储把一行的所有列都加载到内存,即使有些列根本不会用到;而列存储只把需要的列加载到内存中,不需要的列不会被加载到内存中。

  3. 列存储索引自动对数据进行压缩处理,由于同一行的数据具有很高的相似性,压缩率很高,数据读取更快速。

安装

安装之前先说一下,我用的parallels desktop虚拟机,内存我是4个g(越大越好),1个T的硬盘,安装好后还要扩展一下虚拟空间,要不然还是很小的,以下连接是扩充的教程。

https://blog.csdn.net/weixin_40436144/article/details/86235432

在ubuntu下:

先在源文件加一句话:

1
deb http://repo.yandex.ru/clickhouse/deb/stable/ main/

然后安装:

1
2
3
4
sudo apt-get install dirmngr    # optional
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv E0C56BD4 # optional
sudo apt-get update
sudo apt-get install clickhouse-client clickhouse-server

在centos7下建议用rpm安装,快一点(推荐):

可以在这里下载rpm包
https://repo.yandex.ru/clickhouse/rpm/stable/x86_64/

1
rpm -ivh *.rpm

使用

我用clickhouse去收集dns记录,就是看中了它的高效性的列存储。

我下载了opendata上的fdns总共大概600个g左右,全部导入clickhouse。

sql的增删改查基本上还是一样的。

启动服务

1
sudo service clickhouse-server start

命令行连接服务:

1
sudo clickhouse-client

然后把数据导入数据库就ok了。没什么难度,官方手册上有详细说明。

结果

可以看到这里搜索速度是每秒接近三百万行。如果是mysql这种行式数据库,就很慢了,得搜索很久了。

最后看到有七十亿行的数据。

最后我是针对某个src做的一个子域名信息搜集的结果。可以看到信息量还是很大的。

思考

clickhouse本身是适合集群工作的,这样可以充分发挥它的优势,但是限于资源有限,所以这个就只能留着以后有机会改进了。