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