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毫秒左右