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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM