用openLooKeng查询ClickHouse

ClickHouse + openLooKeng = ?

用openLooKeng查询ClickHouse

为什么要用OLK来使用CH呢?

当然不是为了快(毫无疑问)~

如果你有clickhouse和其他多个数据源交互的需求,比如mysql,hbase呀。

如果你有跨DC的需求呀。

使用openLooKeng是一个好的选择,使用olk来接入clickhouse,避免了不同数据源之间数据类型的转换,但同样也对数据类型和sql语法进行了限制,需要根据需求进行选择。

简单的尝试

oPenLooKeng提供了对其特性的试用,

OLK的基本安装使用

安装

按照官方文档,可以手动部署自动部署,如果想自己上手玩一玩,可以自己去编译源代码,参考开发者指南

命令行接口

openLooKeng CLI提供了一个基于终端的交互shell,用于运行查询。CLI是一个可执行的JAR文件,可以通过java -jar ./hetu-cli-*.jar执行。

下载于服务器对应版本的 CLI 文件,例如:hetu-cli-1.0.0-executable.jar,运行:

1
java -jar ./hetu-cli-1.0.0-executable.jar --server localhost:8080 --catalog hive --schema default

使用--help选项运行CLI,查看可用选项。

使用JDBC操作

mvn依赖:

1
2
3
4
5
<dependency>
<groupId>io.hetu.core</groupId>
<artifactId>hetu-jdbc</artifactId>
<version>1.0.1</version>
</dependency>

这里是1.0.1,目前社区版本已经到1.1.0。

JDBC URL支持的格式为:

1
2
3
jdbc:lk://host:port
jdbc:lk://host:port/catalog
jdbc:lk://host:port/catalog/schema

这里catalog可以视为不同的数据源,schema可以视为不同的database,比如:

1
2
String url = "jdbc:lk://example.net:8080/hive/sales";
Connection connection = DriverManager.getConnection(url, "test", null);

具体的连接参数参考文档

编译源代码

如果你想自己折腾一下olk,从源码入手直接编译是一个不错的选择。

环境要求:

  • Mac OS X或Linux
  • Java 8 Update 161或更高版本(8u161+)(64位)。同时支持Oracle JDK和OpenJDK。
  • Maven 3.3.9+(用于构建)
  • Python 2.4+(与启动器脚本一起运行)

从Gitee上pull最新版本代码:

https://gitee.com/openlookeng/hetu-core?_from=gitee_search

运行mvn命令编译并跳过检查:

1
./mvnw clean install -DskipTests

可以用多进程加速

1
./mvnw -T 2C clean install -DskipTests

使用以下选项创建运行配置:

1
2
3
4
Main Class:io.prestosql.server.PrestoServer
VM Options:-ea -XX:+UseG1GC -XX:G1HeapRegionSize=32M -XX:+UseGCOverheadLimit -XX:+ExplicitGCInvokesConcurrent -Xmx2G -Dconfig=etc/config.properties -Dlog.levels-file=etc/log.properties
Working directory:$MODULE_DIR$
Use classpath of module:presto-main

点击IDEA上的运行,然后在浏览器中输入http://localhost:8080/进入olk的web端。

踩坑需知:

presto/openLooKeng要求开发环境为MacOS或Linux,如果你是winodws代码,修改很小部分的代码也能运行,参考这里

maven仓库路径需要为默认.m2/repository,这个问题当时搞了我好久!

加入ClickHouse驱动

OLK支持接入不同的数据源,包括hive,hana,mysql等,除了官网列举的这些,还可以从Gitee/Github下载其他贡献者提交的connector。

olk的clickhouse驱动可以去我的Gitee仓库下载https://gitee.com/heatao/hetu-core。

编译完成后移动到openLooKeng plugin目录k并在catalog目录下添加clickhouse的catalog,重启olk即可。

具体可以参考clickhouse connector文档

函数和语法的转变

尤其需要注意的是,clickhouse的语法并非完全和sql03的标准一致,很多clickhouse的函数或语法并不在olk中支持,即便下推也很难做到这一点。

使用olk查询clickhouse,为了兼容不同的数据源,需要使用olk的语法。

olk支持的全部语法:

https://openlookeng.io/zh-cn/docs/docs/functions/logical.html

olk的语法在connector中并非全部支持,还需要数据源有对应的实现,大部分语法只要数据类型一致,在==非下推==的条件下,大部分函数皆可使用,数据会从不同的数据源,比如clickhouse被查询到内存中,openlookeng再进一步处理。

在==下推==条件下,语法仅支持connector函数支持的,目前clickhouse支持的函数如下(未来会支持更多):

操作符

  • 逻辑运算:AND/OR/NOT
  • 算术运算:+-*=/|&
    • 注意在ol中的 / 是向下 取整,相当于intDiv
  • 比较运算:> < >=, <=,!=

表达式

Case表达式,between and表达式,in表达式,Like表达式,is null表达式

内置函数

聚合统计函数
1
2
3
4
5
6
7
8
CORR($1,$2)
STDDEV($1)
stddev_pop($1)
stddev_samp($1)
skewness($1)
kurtosis($1)
VARIANCE($1)
var_samp($1)
数学函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
ABS($1)
ACOS($1)
ASIN($1)
ATAN($1)
ATAN2($1,$2)
CEIL($1)
CEILING($1)
COS($1)
e()
EXP($1)
FLOOR($1)
LN($1)
LOG10($1)
LOG2($1)
MOD($1,$2)
pi()
POW($1,$2)
POWER($1,$2)
RAND()
RANDOM()
ROUND($1)
ROUND($1,$2)
SIGN($1)
SIN($1)
SQRT($1)
TAN($1)
字符串函数
1
2
3
4
5
6
7
8
9
10
11
12
CONCAT($1,$2)
LENGTH($1)
LOWER($1)
LTRIM($1)
REPLACE($1,$2)
REPLACE($1,$2,$3)
RTRIM($1)
STRPOS($1,$2)
SUBSTR($1,$2,$3)
POSITION($1,$2)
TRIM($1)
UPPER($1)
时间函数
1
2
3
4
5
6
7
8
9
10
11
YEAR($1)
MONTH($1)
QUARTER($1)
WEEK($1)
DAY($1)
HOUR($1)
MINUTE($1)
SECOND($1)
DAY_OF_WEEK($1)
DAY_OF_MONTH($1)
DAY_OF_YEAR($1)

子句

order by

group by

limit

having