1. 概览

ClickHouse的底层访问接口支持TCP和HTTP两种协议,其中,TCP协议拥有更好的性能,其默认端口为9000,主要用于集群间的内部通信及CLI客户端;而HTTP协议则拥有更好的兼容性,可以通过REST服务的形式被广泛用于JAVA、Python等编程语言的客户端,其默认端口为8123。通常而言,并不建议用户直接使用底层接口访问ClickHouse,更为推荐的方式是通过CLI和JDBC这些封装接口,因为它们更加简单易用。

1.1 开启允许远程访问连接

(1)编辑/etc/clickhouse-server/config.xml配置文件

vim /etc/clickhouse-server/config.xml
<listen_host>::</listen_host>

clickhouse java整合 clickhouse java客户端_clickhouse java整合


(2)编辑/etc/clickhouse-server/users.xml配置文件

vim /etc/clickhouse-server/users.xml

clickhouse java整合 clickhouse java客户端_SQL_02


(3) 重启clickhouse-server

sudo -u clickhouse clickhouse-server start

2. CLI

CLI(Command Line Interface)即命令行接口,其底层是基于TCP接口进行通信的,是通过clickhouse-client脚本运行的。它拥有两种执行模式。

2.1.交互式执行

交互式执行交互式执行可以广泛用于调试、运维、开发和测试等场景,它的使用方法是直接运行clickhouse-client进行登录,具体如下所示:

(base) [root@ck1 ~]# clickhouse-client --password
ClickHouse client version 21.1.6.13 (official build).
Password for user (default): 
Connecting to localhost:9000 as user default.
Connected to ClickHouse server version 21.1.6 revision 54443.

ck1.bankbigdata.cn :)

在登录之后,便可以使用SQL进行一问一答的交互式查询了,例如:

ck1.bankbigdata.cn :) select bar(number,0,6) from numbers(6);

SELECT bar(number, 0, 6)
FROM numbers(6)

Query id: b601c0cb-933d-4dfa-be67-771007e49d1d

┌─bar(number, 0, 6)───────────────────────────────────────────────────┐
│                                                                     │
│ █████████████▎                                                      │
│ ██████████████████████████▋                                         │
│ ████████████████████████████████████████                            │
│ █████████████████████████████████████████████████████▎              │
│ ██████████████████████████████████████████████████████████████████▋ │
└─────────────────────────────────────────────────────────────────────┘

6 rows in set. Elapsed: 0.006 sec.

通过交互式执行的SQL语句,相关查询结果会统一被记录到~/.clickhouse-client-history文件,该记录可以作为审计之用,例如:

(base) [root@ck1 ~]# cat ~/.clickhouse-client-history 
### 2021-04-29 02:54:34.614
show databases;
### 2021-04-29 16:29:31.982
use system;
### 2021-04-29 16:29:35.578
show tables;
### 2021-04-29 16:29:55.233
select 1
### 2021-04-29 16:30:01.713
select 1+3
### 2021-04-29 16:39:03.888
select bar(number(0,4)) from numbers(4);
### 2021-04-29 16:39:31.838
select bar(number,0,6) from numbers(6);
### 2021-04-29 16:40:40.025
quit

可以看到,执行记录的顺序是由下至上,从新到旧。

2.2. 非交互式执行

非交互式模式主要用于批处理场景,诸如对数据的导入和导出等操作。在执行脚本命令时,需要追加–query参数指定执行的SQL语句。在导入数据时,它可以接收操作系统的stdin标准输入作为写入的数据源。例如以文件作为数据源:

创建表

use default;
create table if not exists chtest (id Int32,name String) engine=Memory;

cat命令读取的文件流,将会作为INSERT查询的数据输入。
test1_fetch.tsv文件内容:

cat /opt/chbase/test1_fetch.tsv
110     test
111     test1
112     test2
cat /opt/chbase/test1_fetch.tsv |clickhouse-client --password ch123 --query "insert into chtest format TSV"

导入成功后查询表chtest

ck1.bankbigdata.cn :) select * from chtest;

SELECT *
FROM chtest

Query id: 597b2c67-a6b9-434b-98d0-2a37530314ba
┌──id─┬─name──┐
│ 110 │ test  │
│ 111 │ test1 │
│ 112 │ test2 │
└─────┴───────┘

4 rows in set. Elapsed: 0.004 sec.

而在数据导出时,则可以将输出流重定向到文件:

clickhouse-client  --password ch123 --query="select * from chtest">/opt/chbase/test2_fetch.tsv

在上述脚本执行后,SELECT查询的结果集将输出到test2_fetch.tsv文件。
在默认的情况下,clickhouse-client一次只能运行一条SQL语句,如果需要执行多次查询,此时可以追加–multiquery参数,它可以支持一次运行多条SQL查询,多条查询语句之间使用分号间隔,例如:

(base) [root@ck1 ~]# clickhouse-client -h 192.168.2.11 --password ch123 --multiquery --query="select 1;select 2;select 3;"
1
2
3

多条SQL的查询结果集会依次按顺序返回。

2.3. 重要参数

除了上述两种运行模式之外,这里再列举一些clickhouse-client的重要参数,它们分别是:(1)–host / -h:服务端的地址,默认值为localhost。如果修改了config.xml内的listen_host,则需要依靠此参数指定服务端地址,例如下面所示的代码:

clickhouse-client -h 192.168.2.11 --password ch123

(2)–port:服务端的TCP端口,默认值为9000。如果要修改config.xml内的tcp_port,则需要使用此参数指定。
(3)–user / -u:登录的用户名,默认值为default。如果使用非default的其他用户名登录,则需要使用此参数指定(如何添加用户及分配权限,我们下一博文讲解)。
(4)–password:登录的密码,默认值为空。如果在用户定义中未设置密码,则不需要填写(例如默认的default用户)。
(5)–database / -d:登录的数据库,默认值为default。
(6)–query / -q:只能在非交互式查询时使用,用于指定SQL语句。
(7)–multiquery / -n:在非交互式执行时,允许一次运行多条SQL语句,多条语句之间以分号间隔。
(8)–time / -t:在非交互式执行时,会打印每条SQL的执行时间,例如下面所示代码。
完整的参数列表,可以通过–help查阅。

3.JDBC

ClickHouse支持标准的JDBC协议,底层基于HTTP接口通信。使用下面的Maven依赖,即可为Java程序引入官方提供的数据库驱动包:

监听8123端口

[root@ck1 access]# lsof -i :8123
COMMAND    PID       USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
clickhous 5464 clickhouse   38u  IPv6 139044      0t0  TCP *:8123 (LISTEN)

# 检查防火墙关闭状态
systemctl status firewalld.service

加载驱动包

<!-- https://mvnrepository.com/artifact/ru.yandex.clickhouse/clickhouse-jdbc -->
<dependency>
    <groupId>ru.yandex.clickhouse</groupId>
    <artifactId>clickhouse-jdbc</artifactId>
    <version>0.2.4</version>
</dependency>

该驱动有两种使用方式:
1.标准形式是我们常用的方式,通过JDK原生接口获取连接,其关键参数如下:
❑ JDBC Driver Class为ru.yandex.clickhouse.ClickHouseDriver;
❑ JDBC URL为jdbc:clickhouse://:[/]。
接下来我们打开idea开发工具,代码用例演示:

package ch.example;

import com.mysql.cj.protocol.Resultset;

import java.sql.*;

/**
 * @author : jizhuang.wang寻找手艺人
 * @version V1.0
 * @Project: elastic-edg
 * @Package ch.example
 * @Description: Clickhouse JDBC链接demo
 * @date Date : 20210429 9:37
 */
public class chjdbctest {

    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        // 初始化加载驱动
        Class.forName("ru.yandex.clickhouse.ClickHouseDriver");
        // url
        String url = "jdbc:clickhouse://192.168.2.11:8123/default";
        // 用户名密码
        String user = "default";
        String password = "ch123";
        //链接
        Connection conn = DriverManager.getConnection(url,user,password);
        Statement stm = conn.createStatement();
        //查询
        String sql = "select id,name from chtest";
        ResultSet rs =  stm.executeQuery(sql);
        while (rs.next()){
            int id = rs.getInt("id");
            String name = rs.getString("name");
            System.out.println("id:"+id+"-姓名:"+name);
        }
    }
}

clickhouse java整合 clickhouse java客户端_clickhouse_03


远程连接

clickhouse java整合 clickhouse java客户端_SQL_04

3.1. 高可用模式

高可用模式允许设置多个host地址,每次会从可用的地址中随机选择一个进行连接,其URL声明格式如下

jdbc:clickhouse://[first-host]:<port>,[second-host]:<port>,[...]/<database>

在高可用模式下,需要通过BalancedClickhouseDataSource对象获取连接,接下来是一段伪代码用例:

// 多个地址使用逗号分隔
        String urls = "jdbc:clickhouse://ck1.bankbigdata.cn:8123,ck2.bankbigdata.cn:8123/default";
        //设置JDBC参数
        ClickHouseProperties properties = new ClickHouseProperties();
        properties.setUser(user);
        properties.setPassword(password);
        //声明数据源
        BalancedClickhouseDataSource dataSource = new BalancedClickhouseDataSource(urls,properties);
        //对每个host进行ping,排除不可用节点
        dataSource.actualize();
        // 获取jdbc链接
        Connection connection = dataSource.getConnection();
        Statement statement = connection.createStatement();
        // 查询
        ResultSet resultSet = statement.executeQuery("select 1,hostName()");
        resultSet.next();
        System.out.println(resultSet.getInt(1)+"-"+resultSet.getString(2));

本篇博文只介绍了两个典型的封装接口,即CLI(基于TCP)和JDBC(基于HTTP)。但ClickHouse的访问接口并不仅限于此、它还拥有原生的C++、ODBC接口及众多第三方的集成接口(Python、NodeJS、Go、PHP等),如果想进一步了解可参阅官方手册。


下篇博文介绍讲解Clickhouse20.1.6.13内置实用工具