Trino(Presto)集群快速搭建

876 阅读1分钟

概览

之前完成了一个使用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
...