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

相关文章
相关标签/搜索