概览
之前完成了一个使用Trino + hive connector + hive metastore + postgres + localstack s3 的快速搭建 Trino(Presto)集群的项目,以s3作为数据源,hive作为connector是目前Trino(Presto)使用较多的搭配,此外由于AWS S3是收费的,所以这里使用localstack s3来代替。
集群搭建
执行如下命令
git clone https://github.com/PHaoGhost/presto-docker.git
切换到compose目录,执行如下命令
docker compose -p presto up
等候片刻即可完成presto集群搭建。 具体使用示例可以查看我这个项目的README文档。
关于数据库元数据的一些补充
在使用示例中,我们先创建了一个schema,这是创建table的前提,代码如下所示
CREATE SCHEMA IF NOT EXISTS hive.iris
WITH (location = 's3a://test-data/');
由于我们使用postgres作为hive metastore存储元数据的数据库,因此当上述SQL语句执行时,会在postgres的 DBS表中创建一条schema的记录,如下所示。
# 注意因为表名和列名都是大写,所以在postgres里面查询时需要加啥双引号,否则会提示不存在
postgres=# select *from "DBS" where "NAME"='iris';
-[ RECORD 1 ]---+-----------------
DB_ID | 2
DESC |
DB_LOCATION_URI | s3a://test-data/
NAME | iris
OWNER_NAME | root
OWNER_TYPE | USER
CTLG_NAME | hive
创建完schema之后,就可以创建表格了,并指定数据存储的s3 object路径。
CREATE TABLE IF NOT EXISTS hive.iris.iris_parquet (
sepal_length DOUBLE,
sepal_width DOUBLE,
petal_length DOUBLE,
petal_width DOUBLE,
class VARCHAR
)
WITH (
external_location = 's3a://test-data/iris_parquet',
format = 'PARQUET'
);
同时在TBLS表存储了iris_parquet表的定义,在COLUMNS_V2表中存储了列的定义。
postgres=# select *from "TBLS" where "TBL_NAME"='iris_parquet';
-[ RECORD 1 ]------+---------------
TBL_ID | 1
CREATE_TIME | 1680513241
DB_ID | 2
LAST_ACCESS_TIME | 0
OWNER | root
OWNER_TYPE | USER
RETENTION | 0
SD_ID | 1
TBL_NAME | iris_parquet
TBL_TYPE | EXTERNAL_TABLE
VIEW_EXPANDED_TEXT |
VIEW_ORIGINAL_TEXT |
IS_REWRITE_ENABLED | f
postgres=# select *from "COLUMNS_V2" where "CD_ID"=1;
-[ RECORD 1 ]-------------
CD_ID | 1
COMMENT |
COLUMN_NAME | class
TYPE_NAME | string
INTEGER_IDX | 4
-[ RECORD 2 ]-------------
CD_ID | 1
COMMENT |
COLUMN_NAME | petal_length
TYPE_NAME | double
INTEGER_IDX | 2
...