clickhouse 使用demo

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.單機安裝

 

rpm -ivh clickhouse-server-common- 1.1 . 54236 - 4 .el7.x86_64.rpm
 
rpm -ivh clickhouse-server- 1.1 . 54236 - 4 .el7.x86_64.rpm
 
rpm -ivh libtool-ltdl- 2.4 . 2 - 21 .el7_2.x86_64.rpm
 
rpm -ivh clickhouse-debuginfo- 1.1 . 54236 - 4 .el7.x86_64.rpm
 
rpm -ivh clickhouse-compressor- 1.1 . 54236 - 4 .el7.x86_64.rpm

 

 

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>
 
   <min_part_size_ratio> 0.01 </min_part_size_ratio>
 
   <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中,並容許您對錶進行INSERTSELECT查詢,以方便您在ClickHouse與MySQL之間進行數據交換。

 

MySQL數據庫引擎會將對其的查詢轉換爲MySQL語法併發送到MySQL服務器中,所以您能夠執行諸如SHOW TABLESSHOW 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>
<artifactId>clickhouse-jdbc</artifactId>
<version> 0.1 . 52 </version>
</dependency>

b.建立一個clickhouse管理類

 

 
 
import java.sql.*;
 
 
/**
  * Copyright 2004-2020 by xdja.com  All rights reserved.
  *
  * @author gjl
  * @Description TODO
  * @createTime 2020/09/17 15:55:32
  */
public class ClickHouseUtils {
    static Logger logger = LoggerFactory.getLogger(ClickHouseUtils. class );
    private static Connection connection;
    private static Statement statement;
 
    /**
     * 初始化鏈接(能夠修改成配置文件獲取或者採用數據源配置的形式)
     */
    public ClickHouseUtils(){
       String address = "jdbc:clickhouse://11.12.108.28:8123" ;
       try {
          connection = DriverManager.getConnection(address);
          statement = connection.createStatement();
       } catch (Exception e){
          logger.error( "獲取鏈接失敗:{}" ,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();
 
 
 
          conductAudits.setName( "測試" +i);
 
          conductAudits.setCode( "120000" +i);
 
 
          conductAudits.setDept( "鄭州市" );
 
          conductAudits.setIdNumber( "411424199208015956" );
 
          conductAudits.setContent( "測試內容" );
 
 
          conductAudits.setLogType( 3 );
 
          conductAudits.setResult( "1" );
 
          conductAudits.setSn( "0B110000000000C3" );
 
 
          ll.add(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 );
 
          list.add(conductAudits);
 
       }
 
 
    }
 
 
  /**
 
     * 建立表
 
     */
 
    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 {
 
          long begin = System.currentTimeMillis();
 
          results = statement.executeQuery(sql);
 
          long end = System.currentTimeMillis();
 
          System.out.println( "執行(" +sql+ ")耗時:" +(end-begin)+ "ms" );
 
          if (results!= null ){
 
             ResultSetMetaData rsmd = results.getMetaData();
 
             while (results.next()){
 
                Map map = new HashMap();
 
                for ( int i = 1 ;i<=rsmd.getColumnCount();i++){
 
 
                }
 
                list.add(map);
 
             }
 
          }
 
       } catch (Exception e) {
 
          logger.error( "執行操做clickhouse數據庫失敗:{}" ,e);
 
       } finally { //關閉鏈接
 
         try {
 
             if (results!= null ){
 
                results.close();
 
             }
 
             if (statement!= null ){
 
                statement.close();
 
             }
 
             if (connection!= null ){
 
                connection.close();
 
             }
 
          } catch (SQLException e) {
 
             e.printStackTrace();
 
          }
 
       }
 
       return list;
 
    }
 
/**
 
     * 批量存儲數據
 
     * @param list
 
     */
 
    public static void BatchSave(List<ConductAudits> list){
 
       StringBuilder stringBuilder = new StringBuilder();
 
       for (ConductAudits conductAudits:list){
 
          StringBuilder string = getString(stringBuilder, conductAudits);
 
          stringBuilder.append(string);
 
          if (!(list.size() - 1 == list.indexOf(conductAudits))){
 
             stringBuilder.append( "," );
 
          }
 
       }
 
       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){
 
       stringBuilder.append( "(" );
 
 
       stringBuilder.append( "," );
 
 
       stringBuilder.append( "," );
 
 
       stringBuilder.append( "," );
 
 
       stringBuilder.append( "," );
 
 
       stringBuilder.append( "," );
 
 
       stringBuilder.append( "," );
 
 
       stringBuilder.append( "," );
 
 
       stringBuilder.append( "," );
 
 
       stringBuilder.append( "," );
 
 
       stringBuilder.append( "," );
 
 
       stringBuilder.append( "," );
 
       stringBuilder.append( "'" + Const.ASSET_PULL + "'" );
 
       stringBuilder.append( "," );
 
 
       stringBuilder.append( "," );
 
 
       String s = ")" ;
 
 
       return stringBuilder;
 
    }
 
}

 

//模擬存入了4億條數據經測試,統計查詢86毫秒左右,分頁查詢14毫秒左右

相關文章
相關標籤/搜索