本文介绍如何通过Lindorm计算引擎的OLAP或ETL资源组快速使用SQL语言读写数据。
前提条件
使用OLAP资源组
计算引擎OLAP资源组提供了兼容MySQL的访问接口,面向查询分析场景,具备高并发低延迟查询响应能力。OLAP资源组开通后分配常驻计算资源,确保查询快速响应。
步骤一:创建OLAP资源组
登录Lindorm管理控制台。在左上角选择实例所属的地域。在实例列表页,单击目标实例ID或者目标实例所在行操作列的管理。
在实例详情页的配置信息区域,单击计算引擎操作列的资源组管理。
在资源组详情页中单击创建资源组,配置以下内容:
参数
说明
资源组类型
选择OLAP资源组。
资源组名称
资源组的名字,仅支持小写字母和数字,且长度不超过63个字符。例如
cg0
。节点规格
选择节点规格。
作业工作节点数
取值范围:[4,1024],默认值为
4
。单击确定,创建资源组。
说明创建过程大约需要20分钟。
在资源组详情界面,新创建的资源组状态&描述信息处于运行中后,您可以将悬浮鼠标在OLAP资源组名称之上,获取OLAP资源组VPC内网连接地址,例如
jdbc:mysql://ld-bp1dv48fk0yg0****-olap-proxy-ldps.lindorm.aliyuncs.com:9030
。配置MySQL客户端后,通过JDBC连接指定OLAP资源组的VPC内网地址,并使用Lindorm宽表引擎的用户名和密码登录,即可通过MySQL协议连接到OLAP资源组执行SQL查询。
mysql -hld-bp1dv48fk0yg0****-olap-proxy-ldps.lindorm.aliyuncs.com -P9030 -uroot -p
步骤二:访问数据
访问列存数据
列存数据是兼容Iceberg生态的列式存储数据湖。数据存储在Lindorm实例的文件引擎之中,可以通过OLAP资源组写入与查询数据。
列存数据存储在名为lindorm_columnar
的Catalog(用来标识不同的数据源)中,通过MySQL协议连接成功后,默认访问列存数据的Catalog。您也可以执行SET CATALOG lindorm_columnar;
显式切换到列存数据Catalog中。
创建并使用数据库。
-- 创建数据库 CREATE DATABASE olapdemo; -- 使用该数据库 USE olapdemo;
创建数据表并写入数据。
-- 创建表 CREATE TABLE test (id INT, name STRING) ENGINE = iceberg; -- 插入数据 INSERT INTO test VALUES (0, 'Jay'), (1, 'Edison');
查询数据。
示例1:
SELECT id, name FROM test WHERE id != 0;
返回结果:
+------+--------+ | id | name | +------+--------+ | 1 | Edison | +------+--------+
示例2:
SELECT count(distinct name) FROM test;
返回结果:
+----------------------+ | count(DISTINCT name) | +----------------------+ | 2 | +----------------------+
示例3:
SELECT * FROM (SELECT id, name FROM test WHERE id != 0) t0 JOIN (SELECT id, name FROM test WHERE id != 2) t1 ON t0.id=t1.id;
+------+--------+------+--------+ | id | name | id | name | +------+--------+------+--------+ | 1 | Edison | 1 | Edison | +------+--------+------+--------+
删除表。
DROP TABLE test;
删除数据库。
DROP DATABASE olapdemo;
访问宽表数据
OLAP资源组支持直接查询宽表引擎中的数据,可借助其计算能力高效执行复杂查询计算。OLAP资源组不支持创建或写入宽表引擎数据表,只支持数据的查询操作。
宽表引擎数据存储在名为lindorm_table
的Catalog中。访问宽表引擎中的数据,需显式执行SET CATALOG lindorm_table;
切换至该Catalog中。
若您已有可使用的宽表,请直接进入下一步。若您尚未创建,请连接宽表引擎,参考以下语句创建宽表tb
。
-- 创建数据库
CREATE DATABASE test;
--使用该数据库
USE test;
--创建数据表,并插入两条数据
CREATE TABLE tb (id varchar, name varchar, address varchar, primary key(id, name)) ;
UPSERT INTO tb (id, name, address) values ('001', 'Jack', 'hz');
UPSERT INTO tb (id, name, address) values ('002', 'Edison', 'bj');
在连接OLAP资源组的MySQL命令行工具中,执行以下查询语句访问宽表数据。
显式切换数据源并使用数据库。
-- 显式切换数据源 SET CATALOG lindorm_table; -- 使用test数据库 USE test;
查询宽表数据。
示例1:
SELECT * FROM tb LIMIT 5;
返回结果:
+------+--------+---------+ | id | name | address | +------+--------+---------+ | 001 | Jack | hz | | 002 | Edison | bj | +------+--------+---------+
示例2:
SELECT count(*) FROM tb;
返回结果:
+----------+ | count(*) | +----------+ | 2 | +----------+
使用ETL资源组
计算引擎ETL资源组提供Serverless的Spark SQL查询与写入能力,资源按需申请,自动释放,适合低频查询或离线报表查询场景。
步骤一:开通资源组
登录Lindorm管理控制台。在左上角选择实例所属的地域。在实例列表页,单击目标实例ID或者目标实例所在行操作列的管理。
在实例详情页的配置信息区域,单击计算引擎操作列的资源组管理。
在资源组详情页中单击创建资源组,配置以下内容:
参数
说明
资源组类型
选择ETL资源组。
资源组名称
资源组的名字,仅支持小写字母和数字,且长度不超过63个字符。例如
cg0
。单日资源消耗限额
资源组每日消耗的能力单元CU(Capacity Unit)资源上限,单位为
CU*Hour
。默认值为100000
。重要超出上限,作业会被强制立即删除。稳定性要求高的资源组可以配置为
0
,表示无限制。CPU上限(核)
资源组CPU上限。取值范围:[100,100000]。
内存上限(GB)
资源组内存上限。取值范围:[400G,1000000G],无默认值。
授权用户
默认值为
*
,代表允许所有用户访问资源组。单击确定,创建资源组。
步骤二:环境准备
以下环境均部署于与Lindorm实例处于同一VPC网络的ECS实例内。
安装Java环境且JDK为1.8及以上版本。
下载Spark发布包。
解压Spark发布包。
使用解压后的路径设置SPARK_HOME环境变量。
export SPARK_HOME=/path/to/spark/;
填写配置文件:
$SPARK_HOME/conf/beeline.conf
。endpoint:Lindorm计算引擎的JDBC地址。如何获取,请参见查看连接地址。
user:宽表引擎的用户名。
password:宽表用户名对应的密码。
shareResource:相同用户的多个会话之间是否共享计算资源,默认值为
true
。compute-group:设置要使用的计算引擎ETL资源组的名字,不设置则默认为
default
。
进入
$SPARK_HOME/bin
目录并运行./beeline
命令。您将看到以下信息:Welcome to Lindorm Distributed Processing System (LDPS) !!! Initializing environment. It might take minutes ... Environemnt prepared. You may visit your jdbc cluster by below url: http://alb-boqak6zfns5gzx****.cn-hangzhou.alb.aliyuncsslb.com/proxy/75ce76086b61470da7046bd4c2b7**** Please note -- you are sharing this JDBC cluster between SQL sessions from the same user. The cluster will be released by auto if idle for 4 hours. You may also kill it manually by visiting above web url and clicking 'kill' in tab of 'Query Engine' lindorm-beeline>
在交互会话中输入SQL语句,执行写入或查询操作。
说明通过返回信息中的链接
http://alb-boqak6zfns5gzx****.cn-hangzhou.alb.aliyuncsslb.com/proxy/75ce76086b61470da7046bd4c2b7****
,您可以访问计算引擎的SparkUI界面。
步骤三:访问数据
访问列存数据
列存数据是兼容Iceberg生态的列式存储数据湖,数据存储在Lindorm实例的文件引擎之中,可以通过Spark SQL来写入和查询数据。
列存数据存储在名为lindorm_columnar
的Catalog(用来标识不同的数据源)中,通过MySQL协议连接成功后,默认访问列存数据的Catalog。您也可以执行SET CATALOG lindorm_columnar;
显式切换到列存数据Catalog中。
创建并使用数据库。
-- 创建数据库 CREATE DATABASE etldemo; -- 使用该数据库 USE etldemo;
创建数据表并写入数据
-- 创建表 CREATE TABLE test (id INT, name STRING); -- 插入数据 INSERT INTO test VALUES (0, 'Jay'), (1, 'Edison');
查询数据。
示例1:
SELECT id, name FROM test WHERE id != 0;
返回结果:
+------+--------+ | id | name | +------+--------+ | 1 | Edison | +------+--------+
示例2:
SELECT count(distinct name) FROM test;
返回结果:
+----------------------+ | count(DISTINCT name) | +----------------------+ | 2 | +----------------------+
示例3:
SELECT * FROM (SELECT id, name FROM test WHERE id != 0) t0 JOIN (SELECT id, name FROM test WHERE id != 2) t1 ON t0.id=t1.id;
+------+--------+------+--------+ | id | name | id | name | +------+--------+------+--------+ | 1 | Edison | 1 | Edison | +------+--------+------+--------+
删除表。
DROP TABLE test;
删除数据库。
DROP DATABASE etldemo;
访问宽表数据
ETL资源组中的Spark SQL连接可以查询宽表引擎中的数据,可以利用弹性的计算能力,在宽表的数据上完成比较复杂的查询计算。Spark SQL连接不支持宽表引擎的DDL语句,比如建表、删表等,可以查询宽表引擎中的数据。
宽表引擎数据存储在名为lindorm_table
的Catalog中。访问宽表引擎中的数据,需显式执行SET CATALOG lindorm_table;
切换至该Catalog中。
若您已有可使用的宽表,请直接进入下一步。若您尚未创建,请连接宽表引擎,参考以下语句创建宽表tb
。
-- 创建数据库
CREATE DATABASE test;
--使用该数据库
USE test;
--创建数据表,并插入两条数据
CREATE TABLE tb (id varchar, name varchar, address varchar, primary key(id, name)) ;
UPSERT INTO tb (id, name, address) values ('001', 'Jack', 'hz');
UPSERT INTO tb (id, name, address) values ('002', 'Edison', 'bj');
在lindorm-beeline交互会话中,执行以下查询语句访问宽表数据。
显式切换数据源并使用数据库。
-- 显式切换数据源 SET CATALOG lindorm_table; -- 使用test数据库 USE test;
查询宽表数据。
示例1:
SELECT * FROM tb LIMIT 5;
返回结果:
+------+--------+---------+ | id | name | address | +------+--------+---------+ | 001 | Jack | hz | | 002 | Edison | bj | +------+--------+---------+
示例2:
SELECT count(*) FROM tb;
返回结果:
+-----------+ | count(1) | +-----------+ | 2 | +-----------+