clickhouse计算引擎

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了clickhouse计算引擎相关的知识,希望对你有一定的参考价值。

参考技术A

ROLAP类型,(多维度)即席查询语句

Int8 Int64
UInt8 UInt64
String FixedString
Float32 Float64
Date DateTime
Array(T) 强数据类型

Enum8 Enum16 枚举数据类型(没有声明的值是不能插入的)
Tuple 元组数据类型
(可以存储任意数据类型,定义的时候声明数据类型和数据元素类型,元组取值就是 x.1 x.2)

Nested 可以嵌套的数据类型
嵌套数据结构类似于嵌套表。嵌套数据结构的参数(列名和类型)与 CREATE 查询类似。每个表可以包含任意多行嵌套数据结构。

Decimal(P,S),Decimal32(S),Decimal64(S),Decimal128(S)

有符号的定点数,可在加、减和乘法运算过程中保持精度。对于除法,最低有效数字会被丢弃(不舍入)。
参数
P - 精度。有效范围:[1:38],决定可以有多少个十进制数字(包括分数)。
S - 规模。有效范围:[0:P],决定数字的小数部分中包含的小数位数。
对于不同的 P 参数值 Decimal 表示,以下例子都是同义的:
-P从[1:9]-对于Decimal32(S)
-P从[10:18]-对于Decimal64(小号)
-P从[19:38]-对于Decimal128(S)
十进制值范围
Decimal32(S) - ( -1 * 10^(9 - S),1 10^(9-S) )
Decimal64(S) - ( -1 * 10^(18 - S),1
10^(18-S) )
Decimal128(S) - ( -1 * 10^(38 - S),1*10^(38-S) )
例如,Decimal32(4) 可以表示 -99999.9999 至 99999.9999 的数值,步长为0.0001。

IPv4
可以自动的取验证你的Ip地址是否合法

create table test_array(
name String,
hobby Array(String)
)engine=Log;

测试可以嵌套的数据类型
create table test_nested(
uid Int8,
name String,
hobby Nested(
id Int8,
hname1 String,
hname2 String
)
)engine=Memory;

数据源管理 | OLAP查询引擎,ClickHouse集群化管理

本文源码:GitHub·点这里 || GitEE·点这里

一、列式库简介

ClickHouse是俄罗斯的Yandex公司于2016年开源的列式存储数据库(DBMS),主要用于OLAP在线分析处理查询,能够使用SQL查询实时生成分析数据报告。

列式存储

技术图片

行式存储和列式存储,数据在磁盘上的组织结构有着根本不同,数据分析计算时,行式存储需要遍历整表,列式存储只需要遍历单个列,所以列式库更适合做大宽表,用来做数据分析计算。

絮叨一句:注意这里比较的场景,是数据分析计算的场景。

二、集群配置

1、基础环境

ClickHouse单服务默认已经安装完毕

2、取消文件限制

vim /etc/security/limits.conf
vim /etc/security/limits.d/90-nproc.conf
文件末尾追加
* soft nofile 65536 
* hard nofile 65536 
* soft nproc 131072 
* hard nproc 131072

3、取消SELINUX

修改/etc/selinux/config中的SELINUX=disabled后重启

4、集群配置文件

服务分别添加集群配置:vim /etc/metrika.xml

<yandex>
<clickhouse_remote_servers>
    <clickhouse_cluster>
        <shard>
            <internal_replication>true</internal_replication>
            <replica>
                <host>192.168.72.133</host>
                <port>9000</port>
            </replica>
        </shard>
        <shard>
            <replica>
                <internal_replication>true</internal_replication>
                <host>192.168.72.136</host>
                <port>9000</port>
            </replica>
        </shard>
        <shard>
            <internal_replication>true</internal_replication>
            <replica>
                <host>192.168.72.137</host>
                <port>9000</port>
            </replica>
        </shard>
    </clickhouse_cluster>
</clickhouse_remote_servers>

<zookeeper-servers>
  <node index="1">
    <host>192.168.72.133</host>
    <port>2181</port>
  </node>
  <node index="2">
    <host>192.168.72.136</host>
    <port>2181</port>
  </node>
  <node index="3">
    <host>192.168.72.137</host>
    <port>2181</port>
  </node>
</zookeeper-servers>

<macros>
    <replica>192.168.72.133</replica>
</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>

注意这里

<macros>
    <replica>192.168.72.133</replica>
</macros>

配置各自服务的IP地址。

5、启动集群

分别启动三台服务

service clickhouse-server start

6、登录客户端查看

这里登录任意一台服务就好

clickhouse-client
en-master :) select * from system.clusters

技术图片

这里这里集群名称:clickhouse_cluster,后续使用。

7、基本环境测试

三台服务上同时创建表结构。

CREATE TABLE ontime_local (FlightDate Date,Year UInt16) ENGINE = MergeTree(FlightDate, (Year, FlightDate), 8192);

133环境创建分布表

CREATE TABLE ontime_all AS ontime_local ENGINE = Distributed(clickhouse_cluster, default, ontime_local, rand());

随便写入一台服务数据

insert into ontime_local (FlightDate,Year) values (‘2020-03-12‘,2020);

查询总表

select * from ontime_all;

写入总表,数据会分布到各个单表中

insert into ontime_all (FlightDate,Year)values(‘2001-10-12‘,2001);
insert into ontime_all (FlightDate,Year)values(‘2002-10-12‘,2002);
insert into ontime_all (FlightDate,Year)values(‘2003-10-12‘,2003);

任意关闭一台服务,集群查询直接挂掉

三、集群环境整合

1、基础配置

url:配置全部的服务列表,主要用来管理表结构,批量处理;

cluster:集群连接服务,可以基于Nginx代理服务配置;

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    click:
      driverClassName: ru.yandex.clickhouse.ClickHouseDriver
      url: jdbc:clickhouse://127.0.0.1:8123/default,jdbc:clickhouse://127.0.0.1:8123/default,jdbc:clickhouse://127.0.0.1:8123/default
      cluster: jdbc:clickhouse://127.0.0.1:8123/default
      initialSize: 10
      maxActive: 100
      minIdle: 10
      maxWait: 6000

2、管理接口

分别向每个单节点服务创建表和写入数据:

data_shard(单节点数据)

data_all(分布数据)

@RestController
public class DataShardWeb {

    @Resource
    private JdbcFactory jdbcFactory ;

    /**
     * 基础表结构创建
     */
    @GetMapping("/createTable")
    public String createTable (){
        List<JdbcTemplate> jdbcTemplateList = jdbcFactory.getJdbcList();
        for (JdbcTemplate jdbcTemplate:jdbcTemplateList){
            jdbcTemplate.execute("CREATE TABLE data_shard (FlightDate Date,Year UInt16) ENGINE = MergeTree(FlightDate, (Year, FlightDate), 8192)");
            jdbcTemplate.execute("CREATE TABLE data_all AS data_shard ENGINE = Distributed(clickhouse_cluster, default, data_shard, rand())");
        }
        return "success" ;
    }

    /**
     * 节点表写入数据
     */
    @GetMapping("/insertData")
    public String insertData (){
        List<JdbcTemplate> jdbcTemplateList = jdbcFactory.getJdbcList();
        for (JdbcTemplate jdbcTemplate:jdbcTemplateList){
            jdbcTemplate.execute("insert into data_shard (FlightDate,Year) values (‘2020-04-12‘,2020)");
        }
        return "success" ;
    }
}

3、集群查询

上述步骤执行完成后,可以连接集群服务查询分布总表和单表的数据。

基于Druid连接

@Configuration
public class DruidConfig {

    @Resource
    private JdbcParamConfig jdbcParamConfig ;

    @Bean
    public DataSource dataSource() {
        DruidDataSource datasource = new DruidDataSource();
        datasource.setUrl(jdbcParamConfig.getCluster());
        datasource.setDriverClassName(jdbcParamConfig.getDriverClassName());
        datasource.setInitialSize(jdbcParamConfig.getInitialSize());
        datasource.setMinIdle(jdbcParamConfig.getMinIdle());
        datasource.setMaxActive(jdbcParamConfig.getMaxActive());
        datasource.setMaxWait(jdbcParamConfig.getMaxWait());
        return datasource;
    }
}

基于mapper查询

<mapper namespace="com.ckhouse.cluster.mapper.DataAllMapper">

    <resultMap id="BaseResultMap" type="com.ckhouse.cluster.entity.DataAllEntity">
        <result column="FlightDate" jdbcType="VARCHAR" property="flightDate" />
        <result column="Year" jdbcType="INTEGER" property="year" />
    </resultMap>

    <select id="getList" resultMap="BaseResultMap" >
        select * from data_all where Year=2020
    </select>
</mapper>

四、源代码地址

GitHub·地址
https://github.com/cicadasmile/data-manage-parent
GitEE·地址
https://gitee.com/cicadasmile/data-manage-parent

技术图片

推荐阅读:数据源管理

序号 标题
A01 数据源管理:主从库动态路由,AOP模式读写分离
A02 数据源管理:基于JDBC模式,适配和管理动态数据源
A03 数据源管理:动态权限校验,表结构和数据迁移流程
A04 数据源管理:关系型分库分表,列式库分布式计算
A05 数据源管理:PostGreSQL环境整合,JSON类型应用
A06 数据源管理:基于DataX组件,同步数据和源码分析

以上是关于clickhouse计算引擎的主要内容,如果未能解决你的问题,请参考以下文章

大数据 OLAP ClickHouse 引擎ClickHouse 系统架构和存储引擎实现原理 : 为什么 ClickHouse 这么快? Why is ClickHouse so fast?

最强OLAP分析引擎-Clickhouse快速精通-上

最强OLAP分析引擎-Clickhouse快速精通-上

极富参考价值!第1章 ClickHouse 简介《ClickHouse 企业级大数据分析引擎实战》...

精华收藏ClickHouse 系统架构存储引擎 查询引擎原理分析

数据源管理 | OLAP查询引擎,ClickHouse集群化管理