1.ClickHouse概述
ClickHouse是一个列式数据库管理系统(DBMS)。在 ClickHouse 中,数据始终是按列存储的,包括矢量(向量或列块)执行的过程。只要有可能,操做都是基于矢量进行分派的,而不是单个的值,这被称为«矢量化查询执行»,它有利于下降实际的数据处理开销。javascript
2.安装
2.1安装前查看Centos配置文件数限制
a.在/etc/security/limits.d/20-nproc.conf和/etc/security/limits.conf配置文件中分别进行以下配置:
* soft nofile
65536
* hard nofile
65536
//某个框架容许打开的最大文件数
* soft nproc
131072
//某个框架容许打开的最大进程数
* hard nproc
131072
|
前面黑点为符号*表明的是全部框架java
配置完成后重启服务生效,可经过ulimit -n查看mysql
b.修改/etc/sclinux/config 配置
SELINUX=disable 后重启linux
c.关闭防火墙
service iptables stop
|
d.安装依赖
yum install -y libtool
yum insatll -y unixODBC
|
2.2安装
a.建立一个路径用来安装ClickHouse
mkdir -p /opt/clickhouse
|
下载地址:http://repo.red-soft.biz/repos/clickhouse/stable/el7/算法
b.进入到安装目录下载
c.单机安装
|
d.启动
cd /etc/clickhouse-server/
clickhouse-server
|
启动成功后以下图sql
e.集群安装
e1. 另外两台机器重复1.2的安装步骤
e2. 三台机器修改配置文件config.xml //修改的目的是让用户在任意机器均可以访问clickhouse节点上的数据
vim /etc/clickhouse-server/config.xml
|
<listen_host>::</listen_host> //放开后可被其它机器访问到,<listen_host>::1</listen_host>只能被本机访问数据库
e3.在三台机器的etc目录下新建metrika.xml文件
<yandex>
<!-- 集群配置 -->
<clickhouse_remote_servers>
<default_cluster>
<!-- 数据分片
1
-->
<shard>
<internal_replication>
false
</internal_replication>
<replica>
<host>机器host</host>
<port>
9000
</port>
<user>帐号</user>
<password>密码</password>
</replica>
</shard>
<!-- 数据分片
2
-->
<shard>
<replica>
<host>机器host</host>
<port>
9000
</port>
<user>帐号</user>
<password>密码</password>
</replica>
</shard>
<!-- 数据分片
3
-->
<shard>
<replica>
<host>机器host</host>
<port>
9000
</port>
<user>帐号</user>
<password>密码</password>
</replica>
</shard>
</default_cluster>
</clickhouse_remote_servers>
<macros>
<cluster>default_cluster</cluster>
<replica>机器host‘</replica>
<shard>
1
</shard>
</macros>
<networks>
<ip>::/
0
</ip>
</networks>
<!-- 数据压缩算法 -->
<clickhouse_compression>
<
case
>
<min_part_size>
10000000000
</min_part_size>
<method>lz4</method>
</
case
>
</clickhouse_compression>
</yandex>
|
e4.三台机器配置完成后启动服务便可
3.数据类型
a.与其它数据库对比好比mysql
byte | Int8 |
short | Int16 |
int | Int32 |
long | Int64 |
varchar | String |
timestamp | DateTime |
float | Float32 |
double | Float64 |
boolean | -- |
类型说明参考注释json
4.数据库引擎
a.延时引擎lazy
在距最近一次访问间隔expiration_time_in_seconds
时间段内,将表保存在内存中,仅适用于 *Log引擎表vim
因为针对这类表的访问间隔较长,对保存大量小的 *Log引擎表进行了优化,服务器
建立数据库
CREATE DATABASE testlazy ENGINE = Lazy(expiration_time_in_seconds);
b.mysql引擎
MySQL引擎用于将远程的MySQL服务器中的表映射到ClickHouse中,并容许您对表进行INSERT
和SELECT
查询,以方便您在ClickHouse与MySQL之间进行数据交换。
MySQL
数据库引擎会将对其的查询转换为MySQL语法并发送到MySQL服务器中,所以您能够执行诸如SHOW TABLES
或SHOW CREATE TABLE
之类的操做。
建立数据库
CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster] ENGINE = MySQL('host:port', ['database' | database], 'user', 'password')
c.数据库引擎
默认状况下,ClickHouse使用本身的数据库引擎,该引擎提供可配置的表引擎和全部支持的SQL语法。除此以外,还能够选择使用MySQL数据库引擎。
5.表引擎
表引擎决定了:
a.数据存储的方式和位置,写到哪里以及从哪里读取数据
b.支持哪些查询以及如何支持
c.并发数据访问
d.索引使用
e.是否可执行多线程请求
f.数据复制参数
注释:具体参数和概念可参考 https://clickhouse.tech/docs/en/
6.操做实例(单机版的存储和查询)
实际中只有日志数据的量比较大写,主要是把日志数据存入到clickhouse中
a.pom中添加依赖
<dependency>
<groupId>ru.yandex.clickhouse</groupId>
<artifactId>clickhouse-jdbc</artifactId>
<version>
0.1
.
52
</version>
</dependency>
|
b.建立一个clickhouse管理类
package
com.xdja.topsec.demo;
import
com.alibaba.fastjson.JSON;
import
com.xdja.topsec.util.GenID;
import
org.slf4j.Logger;
import
org.slf4j.LoggerFactory;
import
java.sql.*;
import
java.util.ArrayList;
import
java.util.HashMap;
import
java.util.List;
import
java.util.Map;
/**
* Copyright 2004-2020 by xdja.com All rights reserved.
*
* @author gjl
* @Description TODO
* @createTime 2020/09/17 15:55:32
*/
public
class
ClickHouseUtils {
private
static
Connection connection;
private
static
Statement statement;
/**
* 初始化链接(能够修改成配置文件获取或者采用数据源配置的形式)
*/
public
ClickHouseUtils(){
try
{
connection = DriverManager.getConnection(address);
statement = connection.createStatement();
}
catch
(Exception e){
}
}
public
static
void
main(String[] args) {
//测试存储数据和分页查询数据
new
ClickHouseUtils();
//存储数据
List<ConductAudits> ll =
new
ArrayList<>();
for
(
int
i=
0
;i<
5
;i++) {
ConductAudits conductAudits =
new
ConductAudits();
}
BatchSave(ll);
//查询数据
//createTable();
String select =
"select * from T_TSPS_CONDUCT_AUDITS limit 1,10;"
;
List<Map> maps = exeSql(select);
List<ConductAudits> list =
new
ArrayList<>();
for
(Map map :maps){
ConductAudits conductAudits = JSONObject.parseObject(JSON.toJSONString(map), ConductAudits.
class
);
}
}
/**
* 建立表
*/
public
static
void
createTable(){
String createTab =
"CREATE TABLE T_TSPS_CONDUCT_AUDITS( "
+
"id String, "
+
"personId UInt64, "
+
"deptId UInt64, "
+
"code String, "
+
"name String, "
+
"dept String, "
+
"logTime UInt64, "
+
"logType UInt32, "
+
"content String, "
+
"result String, "
+
"sn String, "
+
"blackFlag String, "
+
"createTime Date, "
+
"idNumber String) "
+
"ENGINE = MergeTree(createTime,(logTime,id),8192)"
;
List<Map> maps = exeSql(createTab);
}
/**
* 执行sql
* @param sql
* @return
*/
public
static
List<Map> exeSql(String sql){
ResultSet results =
null
;
List<Map> list =
new
ArrayList();
try
{
results = statement.executeQuery(sql);
if
(results!=
null
){
ResultSetMetaData rsmd = results.getMetaData();
Map map =
new
HashMap();
}
}
}
}
catch
(Exception e) {
}
finally
{
//关闭链接
try
{
if
(results!=
null
){
}
if
(statement!=
null
){
}
if
(connection!=
null
){
}
}
catch
(SQLException e) {
}
}
return
list;
}
/**
* 批量存储数据
* @param list
*/
public
static
void
BatchSave(List<ConductAudits> list){
StringBuilder stringBuilder =
new
StringBuilder();
for
(ConductAudits conductAudits:list){
StringBuilder string = getString(stringBuilder, conductAudits);
}
}
String sql =
"insert into T_TSPS_CONDUCT_AUDITS values"
;
String s = stringBuilder.toString();
String exc = sql+s;
exeSql(exc);
}
/**
* 组装sql
* @param stringBuilder
* @param conductAudits
* @return
*/
public
static
StringBuilder getString(StringBuilder stringBuilder,ConductAudits conductAudits){
String s =
")"
;
return
stringBuilder;
}
}
|
//模拟存入了4亿条数据经测试,统计查询86毫秒左右,分页查询14毫秒左右