doris03-简单使用

Posted wenbronk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了doris03-简单使用相关的知识,希望对你有一定的参考价值。

doris03-简单使用

1. 设置用户名和密码

1.1) 修改root密码

登陆

mysql -h FE_HOST -P9030 -uroot

fe_host 是任一 FE 节点的 ip 地址。9030 是 fe.conf 中的 query_port 配置。

设置密码:

SET PASSWORD FOR 'root' = PASSWORD('root');

1.2) 创建新用户

CREATE USER 'test' IDENTIFIED BY 'test_passwd';

后续登陆可以使用新创建的用户登陆

mysql -h FE_HOST -P9030 -uwenbronk -pa75

授权: 需要先建库

GRANT ALL ON example_db TO wenbronk;

2 建库建表, 导入数据

2.1) 建库, 此步也是授权的前提

CREATE DATABASE testdb;

2.2) 建表

use testdb;

查看帮助

help create table;

此命令在terminal下可以正常执行, 但在navicat中不可以, 不知道为什么, 为了方便, 贴在最后

Doris支持支持单分区和复合分区两种建表方式。

  • 第一级称为 Partition,即分区。用户可以指定某一维度列作为分区列(当前只支持整型和时间类型的列),并指定每个分区的取值范围。
  • 第二级称为 Distribution,即分桶。用户可以指定一个或多个维度列以及桶数对数据进行 HASH 分布。

2.2.1) 单分区

CREATE TABLE table1
(
    siteid INT DEFAULT '10',
    citycode SMALLINT,
    username VARCHAR(32) DEFAULT '',
    pv BIGINT SUM DEFAULT '0'
)
AGGREGATE KEY(siteid, citycode, username)
DISTRIBUTED BY HASH(siteid) BUCKETS 32
PROPERTIES("replication_num" = "1");

导入数据

将 table1_data 导入 table1 中

1,1,jim,2
2,1,grace,2
3,2,tom,2
4,3,bush,3
5,3,helen,3
curl --location-trusted -u root:root -H "label:table1_20170707" -H "column_separator:," -T table1_data http://192.168.206.131:8030/api/testdb/table1/_stream_load

技术图片

2.2.2) 多分区

CREATE TABLE table2
(
    event_day DATE,
    siteid INT DEFAULT '10',
    citycode SMALLINT,
    username VARCHAR(32) DEFAULT '',
    pv BIGINT SUM DEFAULT '0'
)
AGGREGATE KEY(event_day, siteid, citycode, username)
PARTITION BY RANGE(event_day)
(
    PARTITION p201706 VALUES LESS THAN ('2017-07-01'),
    PARTITION p201707 VALUES LESS THAN ('2017-08-01'),
    PARTITION p201708 VALUES LESS THAN ('2017-09-01')
)
DISTRIBUTED BY HASH(siteid) BUCKETS 16
PROPERTIES("replication_num" = "1");

replication_num指分区数目, 想要3个分区必须有3个不同节点部署的be

导入数据

将 table2_data 导入 table2 中

2017-07-03|1|1|jim|2
2017-07-05|2|1|grace|2
2017-07-12|3|2|tom|2
2017-07-15|4|3|bush|3
2017-07-12|5|3|helen|3
curl --location-trusted -u root:root -H "label:table2_20170707" -H "column_separator:|" -T table2_data http://127.20.146.101:8030/api/testdb/table2/_stream_load

技术图片

从table1, 和table2中就可以查询到了

3. 简单查询

3.1) 简单查询

SELECT * FROM table1 LIMIT 3;
SELECT * FROM table1 ORDER BY citycode;

3.2) join

SELECT SUM(table1.pv) FROM table1 JOIN table2 WHERE table1.siteid = table2.siteid;
select table1.siteid, sum(table1.pv) from table1 join table2 where table1.siteid = table2.siteid group by table1.siteid;

3.3) 子查询

SELECT SUM(pv) FROM table2 WHERE siteid IN (SELECT siteid FROM table1 WHERE siteid > 2);

4. 高级功能

4.1) 表结构变更

使用alter table 命令, 可进行

  • 增加列
  • 删除列
  • 修改列类型
  • 改变列顺序

对上面的table1 添加一列

ALTER TABLE table1 ADD COLUMN uv BIGINT SUM DEFAULT '0' after pv;

之后执行查看进度

show alter table column;

执行中

技术图片

执行成功

技术图片

查看数据表结构变更

技术图片

如果想取消掉正在执行的alter, 则使用

CANCEL ALTER TABLE COLUMN FROM table1

4.2) rollup

Rollup 可以理解为 Table 的一个物化索引结构。物化 是因为其数据在物理上独立存储,而 索引 的意思是,Rollup可以调整列顺序以增加前缀索引的命中率,也可以减少key列以增加数据的聚合度。

对于 table1 明细数据是 siteid, citycode, username 三者构成一组 key,从而对 pv 字段进行聚合;如果业务方经常有看城市 pv 总量的需求,可以建立一个只有 citycode, pv 的rollup。

ALTER TABLE table1 ADD ROLLUP rollup_city(citycode, pv);

通过命令查看完成状态

SHOW ALTER TABLE ROLLUP;

之后可以查看完成情况

DESC table1 ALL

技术图片

如果不想创建, 可取消掉

CANCEL ALTER TABLE ROLLUP FROM table1;

5. 高级设置

5.1) 增大内存

内存不够时, 查询可能会出现‘Memory limit exceeded’, 这是因为doris对每个用户默认设置内存限制为 2g

mysql> show variables like '%mem_limit%';
+----------------+------------+
| Variable_name  | Value      |
+----------------+------------+
| exec_mem_limit | 2147483648 |
| load_mem_limit | 0          |
+----------------+------------+
2 rows in set (0.00 sec)

可以修改为 8g

SET exec_mem_limit = 8589934592;

上述设置仅仅在当前session有效, 如果想永久有效, 需要添加 global 参数

SET GLOBAL exec_mem_limit = 8589934592;

5.2) 修改超时时间

doris默认最长查询时间为300s, 如果仍然未完成, 会被cancel掉

mysql> SHOW VARIABLES LIKE "%query_timeout%";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| QUERY_TIMEOUT | 300   |
+---------------+-------+
1 row in set (0.00 sec)

可以修改为60s

SET query_timeout = 60;

同样, 如果需要全局生效需要添加参数 global

set global query_timeout = 60;

5.3) Broadcast/Shuffle Join

doris在join操作的时候时候, 默认使用broadcast的方式进行join, 即将小表通过广播的方式广播到大表所在的节点, 形成内存hash, 然后流式读出大表数据进行hashjoin

但如果小表的数据量也很大的时候, 就会造成内存溢出, 此时需要通过shuffle join的方式进行, 也被称为partition join. 即将大表小表都按照join的key进行hash, 然后进行分布式join

braodcast join

select sum(table1.pv) from table1 join table2 where table1.siteid = 2;

显示制定braodcast

select sum(table1.pv) from table1 join [broadcast] table2 where table1.siteid = 2;

suffle join

select sum(table1.pv) from table1 join [shuffle] table2 where table1.siteid = 2;

5.4) doris的高可用方案

用户可以在多个fe上部署负载均衡实现

或者通过mysql connect 自动重连

jdbc:mysql://[host:port],[host:port].../[database][?propertyName1][=propertyValue1][&propertyName2][=propertyValue2]...

或者应用可以连接到和应用部署到同一机器上的 MySQL Proxy,通过配置 MySQL Proxy 的 Failover 和 Load Balance 功能来达到目的。

http://dev.mysql.com/doc/refman/5.6/en/mysql-proxy-using.html

以上是关于doris03-简单使用的主要内容,如果未能解决你的问题,请参考以下文章

Doris--简单使用

如何使用Android片段管理器传递变量[重复]

Clickhouse与Doris的区别

Doris 数据模型及自动分区使用案例

Doris 数据模型及自动分区使用案例

Doris 数据模型及自动分区使用案例