OpenLK安装成功后,先后用Docker为OpenLK创建了3个数据源集群,Kafaka,Hive & Elasticsearch。
颇费了些周折,终于成功地创建了Elasticsearch Connector,把踩过的坑总结如下
Elasticsearch集群的搭建
使用ES 6搭建集群,不要使用ES 7搭建集群,目前OpenLK使用的是Prestosql的ES插件,版本号是1,使用ES client 6.0连接ES集群,而连接到ES 7需要ES client版本大于6.8.
注意需要映射主节点的9300端口, OpenLK使用TCP连接ES服务器,而不是9200 HTTP端口。ES 8要全面取消TCP连接,希望OpenLK/Presto尽快更新连接方式。使用下面的docker指令创建docker网络和ES集群。
docker network create --driver bridge --subnet=172.18.12.0/16 --gateway=172.18.1.1 dockernet
version: '2.2'
services:
elasticsearch:
image:docker.elastic.co/elasticsearch/elasticsearch:6.8.13
container_name:elasticsearch
environment:
-cluster.name=docker-cluster
-bootstrap.memory_lock=true
-"ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
-esdata1:/usr/share/elasticsearch/data
ports:
- 9200:9200
- 9300:9300
networks:
dockernet:
ipv4_address:172.18.12.2
elasticsearch2:
image:docker.elastic.co/elasticsearch/elasticsearch:6.8.13
container_name:elasticsearch2
environment:
-cluster.name=docker-cluster
-bootstrap.memory_lock=true
-"ES_JAVA_OPTS=-Xms512m -Xmx512m"
-"discovery.zen.ping.unicast.hosts=elasticsearch"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
-esdata2:/usr/share/elasticsearch/data
networks:
dockernet:
ipv4_address:172.18.12.3
kibana:
image:docker.elastic.co/kibana/kibana:6.8.9
container_name:kibana
ports:
- 5601:5601
environment:
ELASTICSEARCH_HOSTS: http://elasticsearch:9200
logging:
driver: none
networks:
dockernet:
ipv4_address:172.18.12.4
volumes:
esdata1:
driver: local
esdata2:
driver: local
networks:
dockernet:
external:
name: dockernet
ES Docker集群启动时间比较长,耐心等待两分钟。 进入docker container修改ES的配置文件,添加属性network.publish_host, 注意这个属性的设置为你的Docker的宿主机的IP地址,不是docker内部的虚拟网络地址, OpenLK/Presto使用publish_host与群集通信。使用下面的指令修改ES的配置文件。
docker-compose exec elasticsearch bash
vi /usr/share/elasticsearch/config/elasticsearch.yml
cluster.name: "docker-cluster"
network.host: 0.0.0.0
network.publish_host: x.x.x.x
注:在docker compose的yml中设置这个环境变量似乎不生效。如果不设置这个属性,默认属性是container在docker网络中的IP地址,OpenLK的客户端访问ES集群的时候会报如下错误:
java.lang.RuntimeException: NoNodeAvailableException[None of the configured nodes are available: [{#transport#-1}{O3R6uQdnSjO3GTjeusUZwQ}{172.17.0.2}{172.17.0.2:9300}]]
从错误信息来看,OpenLK试图用Docker的虚拟网络地址去访问ES集群。改成docker宿主的IP后,错误消除。
使用同样的指令修改elasticsearch2的配置。然后重启动docker compose。
启动Kibana,导入Kibana自带的测试数据。
创建OpenLK ES connector
在 /opt/openlookeng/hetu-server/etc/catalog/下创建文件 elasticsearch.properties。 注意正确设置elasticsearch.table-description-directory属性。默认目录是etc/elasticsearch,而不是etc/catalog/elasticsearch。在此目录下可以配置多个ES index到OpenLK的表的对应关系, OpenLK启动时会解析该目录下所有的json文件
connector.name=elasticsearch
elasticsearch.default-schema-name=default
elasticsearch.table-description-directory=/opt/openlookeng/hetu-server/etc/catalog/elasticsearch/
elasticsearch.scroll-size=10000
elasticsearch.scroll-timeout=1m
elasticsearch.request-timeout=2s
elasticsearch.max-request-retries=5
elasticsearch.max-request-retry-time=10s
elasticsearch.max-hits=10000000
在/opt/openlookeng/hetu-server/etc/catalog/elasticsearch/下创建Json文件描述ES和OpenLK之间的对应关系,OpenLK和Presto的官方文档都很坑,按照官方文档配置后甚至无法启动服务。按照以下格式配置表映射
{
"tableName": "shakespeare",
"host": "192.168.20.54",
"port": 9300,
"clusterName": "docker-cluster",
"schemaName": "test",
"index": "shakespeare",
"indexExactMatch": true,
"type": "doc",
"columns": [
{
"name": "speaker",
"type": "varchar",
"jsonPath": "speaker",
"jsonType": "varchar",
"ordinalPosition": "0"
}
]
}
需要注意的是目前OpenLK/Presto使用9300 TCP端口连接ES,不要使用9200 HTTP端口。
"tableName": "xxxxx",自定义的虚拟表的名字,OpenLK的SQL查询的时候使用这个表名。
"host": "192.168.20.54",ES服务器地址和端口。注意不是hostAddress,OpenLK和Presto'的官方文档都给的是hostAdress,然而使用hostAdress时,服务器读取配置文件时抛异常。
"clusterName": "docker-cluster", ES的cluster name,不知道的话, 可以通过访问http://$es:9200/_cluster/health?pretty得到。
"schemaName": "test",schema的名字可以任意指定,OpenLK在读取配置文件的时候自动创建schema,我曾经在控制台使用SQL去创建schema,创建不成功,查看Java源代码发现,这个方式Presto没有实现,直接抛异常。
"index": "shakespeare", ES的index。访问ES服务器,http://es:9200/_cat/indices?v可以列出可以使用的index
"type": "doc",通过http://es:9200/$ESindex/_search?pretty得到。
columns的type和jsonType填varchar,按照官方文档的提示填写ES的映射类型会导致服务器启动失败,通过日志可以发现java代码无法解析诸如"text"的ES数据类型。
重启服务
目前通过重启服务加载配置文件,OpenLK应该已经提供了配置热加载和自动集群同步的指令,知道的网友请留言。
测试
执行./openlk-cli --catalog elasticsearch
SQL例子: select * from test.shakespeare;
我使用的shakespeare测试数据有10万多条,如果没有配置elasticsearch.max-hits属性执行sql的会提示The number of hits for the query (xxxxx) exceeds the configured max hits (1000)的错误。