Apache Doris技术实践
文章目錄
- 1 Doris簡述
- 1.1 Doris架構組成介紹
- 1.1.1 Doris的整體架構
- 1.1.2 FE
- 1.1.3 元數據
- 1.2 Doris特點
- 1.3 Doris的軟硬件需求
- 1.4 Doris各個實例通信網絡端口
- 1.5 中間件版本選取
- 2 Doris部署
- 2.1 環境準備
- 2.1.1 CentOS7
- 2.1.2 關閉防火墻
- 2.1.3 關閉Swap
- 2.1.4 HostName設置
- 2.1.5 安裝JDK
- 2.1.6 安裝JCC
- 2.1.7 安裝Docker
- 2.1.8 安裝mysql
- 2.2 Doris安裝
- 2.2.1 環境檢查
- 2.2.2 Doris編譯
- 2.2.3 部署和啟動FE
- 2.2.4 部署和啟動BE
- 2.3 安裝檢查
- 3 DORIS操作說明
- 3.1 DORIS配置項
- 3.1.1 靜態配置
- 3.1.2 動態配置
- 3.1.3 配置項列表
- 3.2 DORIS操作
- 3.2.1 添加BE
- 3.2.2 查詢BE
- 3.2.3 刪除BE
- 3.2.4 刪除FE
- 3.3 數據庫操作
- 3.3.1 修改默認用戶的密碼
- 3.3.2 創建數據庫
- 3.3.3 創建用戶
- 3.3.4 授權用戶
- 3.3.5 創建表
- 3.3.7 分區
- 3.3.8 表結構變更
- 3.3.9 其他常用模命令
- 3.4 通過JDBC訪問DORIS
- 3.5 導入數據
- 3.5.1 Broker load
- 3.5.2 Stream load
- 3.5.3 Insert
- 3.5.4 Multi load
- 3.5.5 Routine load
- 3.5.6 數據導入場景說明
- 3.5.7 參數說明
- 3.6 查詢操作
- 3.6.1 數據查詢
- 3.6.2 數據表查詢
- 3.6.3 查詢超時
- 3.6.4 Broadcast/Shuffle Join
- 3.7 備份與恢復
- 3.7.1 backup備份
- 3.7.2 restore恢復
- 3.7.3 常用命令
- 3.8 監控和報警
- 4 DORIS應用場景
- 4.1 DORIS添加KAFKA實時數據流
- 4.1.1 doris訂閱kafka
- 4.1.2 保證數據不丟失
- 4.1.3 保證數據不重復
- 4.2 MYSQL+DORIS
- 4.3 HDFS+DORIS
- 4.4 DORIS在EASTICSEARCH中的應用
- 4.5 DORIS個人感受
- 4.6 DORIS在美團點評的實踐
- 4.6.1 美團外賣Doris實踐概述
- 4.6.2 美團外賣Doris準實時數倉平臺建設
- Hive To Doris
- Kafka To Doris
- 5 DORIS FAQS
- 5.1 安裝GCC之后版本號仍然是CENTOS7默認的4.8
- 5.2 安裝MYSQL報錯UNIT MYSQLD.SERVICE COULD NOT BE FOUND
- 5.3 手動編譯SH BUILD.SH失敗
- 5.3.1 報錯download ora158.tar.gz failed
- 5.3.2 報錯gcc -V找不到指定的目錄
- 5.4 部署FE,報錯找不到IMAGE.0
- 5.5 使用MYSQL連接FE失敗
- 5.6 添加BE失敗
- 5.7 BE啟動失敗
- 5.8 BE連接失敗
1 Doris簡述
Doris(原百度Palo)是一款基于大規模并行處理技術的分布式 SQL 數據庫,由百度在2017年開源,2018年進入 Apache 孵化器。
1.1 Doris架構組成介紹
1.1.1 Doris的整體架構
Doris的架構組成主要是BackEnd,即Doris 的后端節點(以下簡稱BE);FrontEnd,即Doris 的前端節點(以下簡稱FE)和bdbje(BerkekeyDB Java Edition),負責元數據操作日志的持久化、FE 高可用等功能。
BE的磁盤空間主要用來存放用戶數據,總磁盤空間按照總用戶數量*3(副本數量)計算;然后再預留額外40% 的空間用作后臺 compaction 以及一些中間數據的存存放。FE的磁盤空間主要用于存儲元數據,包括日志和 image。通常從幾百 MB 到幾個 GB 不等。
一臺機器上可以部署多個 BE 實例,但是只能部署一個 FE。如果需要 3 副本數據,那么至少需要 3 臺機器各部署一個 BE 實例。(測試環境也可僅適用一個BE)。架構圖如圖1.1
Doris 的整體架構分為兩層。多個FE 組成第一層,提供 FE 的橫向擴展和高可用。多個 BE 組成第二層,負責數據存儲于管理。本文主要介紹 FE 這一層中,元數據的設計與實現方式。
1.1.2 FE
· FE 節點分為 follower 和 observer 兩類。各個 FE 之間,通過bdbje進行leader 選舉,數據同步等工作。
· follower節點通過選舉,其中一個 follower 成為 leader 節點,負責元數據的寫入操作。當 leader 節點宕機后,其他 follower 節點會重新選舉出一個 leader,保證服務的高可用。
· observer節點僅從 leader 節點進行元數據同步,不參與選舉。可以橫向擴展以提供元數據的讀服務的擴展性。
1.1.3 元數據
Doris 的元數據是全內存的。每個FE 內存中,都維護一個完整的元數據鏡像。
Doris的元數據主要存儲4類信息:
· 用戶數據信息。包括數據庫、表的 Schema、分片信息等。
· 各類作業信息。如導入作業,Clone 作業、SchemaChange 作業等。
· 用戶及權限信息。
· 集群及節點信息。
元數據的數據流具體過程如下:
只有leader FE 可以對元數據進行寫操作。寫操作在修改 leader 的內存后,會序列化為一條log,按照 key-value 的形式寫入 bdbje。其中 key 為連續的整型,作為 log id,value 即為序列化后的操作日志
日志寫入 bdbje 后,bdbje 會根據策略(寫多數/全寫),將日志復制到其他 non-leader 的 FE 節點。non-leader
FE 節點通過對日志回放,修改自身的元數據內存鏡像,完成與 leader 節點的元數據同步
leader 節點的日志條數達到閾值后(默認 10w 條),會啟動 checkpoint 線程。checkpoint 會讀取已有的 image 文件,和其之后的日志,重新在內存中回放出一份新的元數據鏡像副本。然后將該副本寫入到磁盤,形成一個新的 image。每次 checkpoint 會占用雙倍內存空間。
image 文件生成后,leader節點會通知其他 non-leader 節點新的 image 已生成。non-leader 主動通過 http 拉取最新的 image 文件,來更換本地的舊文件
1.2 Doris特點
Doris的主要特性
· 兼容Mysql協議,支持包括多表 Join、子查詢、窗口函數、CTE 在內的豐富的 SQL 語法。支持諸多常見 BI 報表系統,能極大降低用戶的學習和遷移成本
· 支持高并發點查詢和高吞吐的多維分析查詢場景。通過分區裁剪、預聚合、謂詞下推、向量化執行等技術,以及高效的列式存儲引擎即數據壓縮算法,滿足不同業務場景下的延遲和吞吐需求。
· 特有的數據預聚合功能。支持預聚合表和基準表同步原子更新,為報表場景提供更快速的查詢響應。
· 提供強大的擴展性和高可用特性。所有數據都采用多副本的方式保證數據的高可靠,同時提供全自動的副本選擇、均衡和修復功能,為用戶提供7*24小時的高可用數據庫系統。
· 提供友好的在線表結構變更功能,能有效應對業務上的需求變化。
· 提供兩級數據劃分功能以及分層存儲功能。用戶可以更靈活地對數據進行管理和維護。
1.3 Doris的軟硬件需求
| CentOS/Ubuntu | 7.1及以上/16.04及以上 |
| Java | 1.8及以上 |
| GCC | 4.8.2及以上 |
| cmake | |
| python | 2.7及以上 |
測試環境
| FrontEnd | 8核+ | 8G+ | 10GB+ | 千兆網卡 | 1 |
| BackEnd | 8核+ | 16G+ | 50GB+ | 千兆網卡 | 1-3 |
生產環境
| FrontEnd | 16核+ | 64G+ | 100GB+ | 萬兆網卡 | 1-5 |
| BackEnd | 16核+ | 64G+ | 100GB+ | 萬兆網卡 | 10-100 |
· Doris的性能與節點數量及配置正相關。最少4臺機器(一臺 FE,三臺 BE,其中一臺 BE 混部一個 Observer FE 提供元數據備份)。測試環境可以只部署一臺BE
· 如果 FE 和 BE 混部,需注意資源競爭問題,并保證元數據目錄和數據目錄分屬不同磁盤
1.4 Doris各個實例通信網絡端口
| BE | be_port | 9060 | FE --> BE | BE 上 thrift server 的端口,用于接收來自 FE 的請求 |
| BE | webserver_port | 8040 | BE <–> BE | BE 上的 http server 的端口 |
| BE | heartbeat_service_port | 9050 | FE --> BE | BE 上心跳服務端口(thrift),用于接收來自 FE 的心跳 |
| BE | brpc_port | 8060 | FE<–>BE, BE <–> BE | BE 上的 brpc 端口,用于 BE 之間通訊 |
| FE | http_port | 8030 | FE <–> FE,用戶 | FE 上的 http server 端口 |
| FE | rpc_port | 9020 | BE --> FE, FE <–> FE | FE 上的 thrift server 端口 |
| FE | query_port | 9030 | 用戶 | FE 上的 mysql server 端口 |
| FE | edit_log_port | 9010 | FE <–> FE | FE 上的 bdbje 之間通信用的端口 |
| Broker | broker_ipc_port | 8000 | FE --> Broker, BE --> Broker | Broker 上的 thrift server,用于接收請求 |
1.5 中間件版本選取
| CentOS | CentOS-7-x86_64-DVD-2003.iso |
| Java | 1.8.0_121 |
| Maven | 3.5.4 |
| Doris | 0.12.0 |
| cMake | 2.8.12.2 |
| python | 2.7.5 |
| gcc | 5.5.0 |
| docker | 18.03.1-ce |
2 Doris部署
2.1 環境準備
本次使用1臺機器進行集群搭建,適用混編的方式在一臺機器上同時部署FE和BE
2.1.1 CentOS7
CentOS7安裝過程省略。Apache Doris官方要求CentOS需要在7.1版本以上。請確保虛擬機的CentOS版本符合要求。
2.1.2 關閉防火墻
針對centos7以上
1.查看防火墻狀態
firewall-cmd --state
2.停止firewall
systemctl stop firewalld.service
3.禁止firewall開機啟動
systemctl disable firewalld.service
針對centos7以下
1.查看防火墻狀態
service iptables status
2.停止防火墻
service iptables stop
3.啟動防火墻
service iptablesstart
2.1.3 關閉Swap
1.查看swap
[root@CentOS7 opt]# free [root@CentOS7 opt]# cat /proc/vmstat |egrep "dirty|writeback" [root@CentOS7 opt]# sysctl -wvm.swappiness=02.關閉swap
[root@CentOS7 opt]# echo"vm.swappiness = 0">> /etc/sysctl.conf [root@CentOS7 opt]# swapoff -a3.檢查swap關閉
2.1.4 HostName設置
[root@CentOS7]# hostname -s CentOS72.1.5 安裝JDK
1.解壓jdk1.8的安裝包,并配置JAVA的環境變量
[root@CentOS7~]# vi /etc/profile.d/jdk.sh #JAVA_HOME exportJAVA_HOME=/opt/java/jdk1.8.0_121 exportJRE_HOME=$JAVA_HOME/jre exportPATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH2.添加環境變量,刷新文件使其生效
[hadoop@hadoop04~]$ /etc/profile.d/jdk.sh3.查閱是否安裝成功
2.1.6 安裝JCC
1.解壓GCC5.5的安裝包,并在環境變量中配置gcc
[root@CentOS7 ~]# vi ~/.bash_profile export CC=/usr/local/bin/gcc export CXX=/usr/local/bin/g++2.安裝GCC的依賴包:
yum -y install gmp-devel yum -y install mpfr-devel yum -y install libmpc-devel yum -y install bzip23.進入到gcc的解壓目錄,執行配置:
[root@CentOS7 gcc-5.5.0]# cd /opt/gcc-5.5.0/ [root@CentOS7 gcc-5.5.0]#./configure--enable-checking=release --enable-languages=c,c++ --disable-multilib [root@CentOS7 gcc-5.5.0]#export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib #--disable-multilib 不產生32位的編譯器4.編譯、安裝:
[root@CentOS7 gcc-5.5.0]# make -j 4 [root@CentOS7 gcc-5.5.0]# make install5.查看安裝結果(如果版本號依然是CentOS自帶的4.8,請檢查環境變量設置):
參考鏈接:Linux安裝gcc 7.3.0編譯器詳解(CentOS 7 64位系統)
2.1.7 安裝Docker
1.指定docker版本安裝即可
[root@CentOS7opt]# yum install docker-ce-18.03.1.ce2.安裝完成之后查看docker版本
3.啟動docker
4.設置開機自啟
[root@CentOS7opt]# systemctl enable docker2.1.8 安裝mysql
查看初始密碼:
[root@CentOS7 mysql]# cat/root/.mysql_secret查看mysql服務狀態并啟動
[root@CentOS7 package]# service mysqldstatus##如果報錯Unit mysqld.service could not be found.請查找mysql.server然后復制到/etc/init.d/mysqld [root@CentOS7 mysql]# cp mysql.server/etc/init.d/mysqld使用查詢到的初始密碼登陸客戶端
[root@CentOS7 package]# mysql -uroot-pMabbdrdTaRv0Gywq修改密碼:
mysql> SET PASSWORD=PASSWORD('000000');2.2 Doris安裝
2.2.1 環境檢查
2.2.2 Doris編譯
網上有很多教程指導Doris的編譯,眾多的信息反而讓人摸不清頭腦,這里使用官網推薦的模擬docker鏡像的鏡像的方式編譯Doris
官方鏈接
docker run -it apachedoris/doris-dev:build-env-1.2
見到這張圖就說明編譯成功了
2.2.3 部署和啟動FE
修改/conf/fe.conf中的meta_dir,指定元數據存放的位置
默認是${DORIS_HOME}/doris-meta 需要手動創建
修改FE節點IP
4.在mysql中連接FE
#連接 [root@CentOS7 ~]# mysql -h CentOS7 -P 9030 -uroot #添加BE mysql> ALTER SYSTEM ADD BACKEND'CentOS7:9050';2.2.4 部署和啟動BE
修改/conf/be.conf中的storage_root_path,指定數據存放的位置
多目錄使用;分隔,最后一個目錄不加;
添加BE節點
mysql連接FE:mysql -h CentOS7 -P 9030 -uroot
添加BE:ALTER SYSTEMADD FREE BACKEND “host:9050”;
host為BE所在節點
2.3 安裝檢查
1.mysql連接FE
2.界面訪問
http://CentOS7:8030/api/bootstrap
3 DORIS操作說明
3.1 DORIS配置項
3.1.1 靜態配置
修改conf/fe.conf或者conf/be.conf配置文件
3.1.2 動態配置
FE 啟動后,可以通過以下命令動態設置配置項。該命令需要管理員權限。
ADMIN SET FRONTEND CONFIG ("fe_config_name" = "fe_config_value");通過 ADMIN SHOW FRONTEND CONFIG; 命令結果中的 IsMutable 列查看是否支持動態配置
3.1.3 配置項列表
http://doris.apache.org/master/zh-CN/administrator-guide/config/fe_config.html#%E9%85%8D%E7%BD%AE%E9%A1%B9%E5%88%97%E8%A1%A8
http://doris.apache.org/master/zh-CN/administrator-guide/config/be_config.html#%E9%85%8D%E7%BD%AE%E9%A1%B9%E5%88%97%E8%A1%A8
3.2 DORIS操作
3.2.1 添加BE
見2.2.2
3.2.2 查詢BE
mysql> show proc '/backends';3.2.3 刪除BE
mysql> ALTER SYSTEM DROP BACKEND "CentOS7:9050"; ERROR 1064 (HY000): errCode = 2, detailMessage = It is highly NOT RECOMMENDED to use DROP BACKEND stmt.It is not safe to directly drop a backend. All data on this backend will be discarded permanently. If you insist, use DROPP BACKEND stmt (double P). mysql> ALTER SYSTEM DROPP BACKEND "CentOS7:9050"; Query OK, 0 rows affected (0.01 sec)3.2.4 刪除FE
mysql> ALTER SYSTEM DROPP FOLLOWER "CentOS7:9050";3.3 數據庫操作
3.3.1 修改默認用戶的密碼
默認用戶root/admin:
mysql> set password for 'admin' = PASSWORD('000000');修改完成之后可以訪問頁面查看系統信息
http://CentOS7:8030/system
3.3.2 創建數據庫
mysql> create database doris;3.3.3 創建用戶
mysql> create user 'doris' identified by '000000';3.3.4 授權用戶
mysql> grant all on doris to doris;3.3.5 創建表
Doris支持支持單分區和復合分區兩種建表方式。
在復合分區中:
? 第一級稱為 Partition,即分區。用戶可以指定某一維度列作為分區列(當前只支持整型和時間類型的列),并指定每個分區的取值范圍。
? 第二級稱為 Distribution,即分桶。用戶可以指定一個或多個維度列以及桶數對數據進行 HASH 分布。
以下場景推薦使用復合分區
? 有時間維度或類似帶有有序值的維度,可以以這類維度列作為分區列。分區粒度可以根據導入頻次、分區數據量等進行評估。
? 歷史數據刪除需求:如有刪除歷史數據的需求(比如僅保留最近N 天的數據)。使用復合分區,可以通過刪除歷史分區來達到目的。也可以通過在指定分區內發送 DELETE 語句進行數據刪除。
? 解決數據傾斜問題:每個分區可以單獨指定分桶數量。如按天分區,當每天的數據量差異很大時,可以通過指定分區的分桶數,合理劃分不同分區的數據,分桶列建議選擇區分度大的列。
用戶也可以不使用復合分區,即使用單分區。則數據只做 HASH 分布
單分區建表
這個表的 schema 如下:
? siteid:類型是INT(4字節), 默認值為10
? citycode:類型是SMALLINT(2字節)
? username:類型是VARCHAR, 最大長度為32, 默認值為空字符串
? pv:類型是BIGINT(8字節), 默認值是0; 這是一個指標列, Doris內部會對指標列做聚合操作, 這個列的聚合方法是求和(SUM)
復合分區建表
這個表的 schema 如下:
? event_day:類型是DATE,無默認值
? siteid:類型是INT(4字節), 默認值為10
? citycode:類型是SMALLINT(2字節)
? username:類型是VARCHAR, 最大長度為32, 默認值為空字符串
? pv:類型是BIGINT(8字節), 默認值是0; 這是一個指標列, Doris 內部會對指標列做聚合操作, 這個列的聚合方法是求和(SUM)
我們使用 event_day 列作為分區列,建立3個分區: p201706, p201707, p201708
? p201706:范圍為 [最小值, 2017-07-01)
? p201707:范圍為 [2017-07-01, 2017-08-01)
? p201708:范圍為 [2017-08-01, 2017-09-01)
注意區間為左閉右開。
每個分區使用 siteid 進行哈希分桶,桶數為10
3.3.6 查看表
3.3.7 分區
在0.12.0版本中添加了臨時分區的功能。只有分區表能建臨時分區,歸屬于某一分區表
#添加臨時分區
#可以通過 ALTER TABLE ADD TEMPORARY PARTITION 語句對一個表添加臨時分區
#刪除臨時分區
#可以通過 ALTER TABLE DROP TEMPORARY PARTITION 語句刪除一個表的臨時分區
#替換分區
#可以通過 ALTER TABLE DROP TEMPORARY PARTITION 語句刪除一個表的臨時分區
3.3.8 表結構變更
類似于mysql
? 增加列
? 刪除列
? 修改列類型
? 改變列順序
#增加列
#查看修改
mysql> SHOW ALTER TABLE COLUMN;#取消正在執行的作業
CANCEL ALTER TABLE COLUMN FROM table13.3.9 其他常用模命令
#drop
? 使用 Drop 操作直接刪除數據庫或表后,可以通過 Recover 命令恢復數據庫或表(限定時間內),但臨時分區不會被恢復。
? 使用 Alter 命令刪除正式分區后,可以通過 Recover 命令恢復分區(限定時間內)。操作正式分區和臨時分區無關。
? 使用 Alter 命令刪除臨時分區后,無法通過 Recover 命令恢復臨時分區。
#truncate
? 使用 Truncate 命令清空表,表的臨時分區會被刪除,且不可恢復。
? 使用 Truncate 命令清空正式分區時,不影響臨時分區。
? 不可使用 Truncate 命令清空臨時分區。
#alter
? 當表存在臨時分區時,無法使用 Alter 命令對表進行 Schema Change、Rollup 等變更操作。
? 當表在進行變更操作時,無法對表添加臨時分區。
3.4 通過JDBC訪問DORIS
doris可以直接使用JDBC編程的方式訪問:
查詢結果:
3.5 導入數據
3.5.1 Broker load
通過 Broker 進程訪問并讀取外部數據源(如 HDFS)導入到 Doris。用戶通過 Mysql 協議提交導入作業后,異步執行。通過 SHOW LOAD 命令查看導入結果。
3.5.2 Stream load
用戶通過 HTTP 協議提交請求并攜帶原始數據創建導入。主要用于快速將本地文件或數據流中的數據導入到 Doris。導入命令同步返回導入結果。
[root@CentOS7 data]# curl --location-trusted -u root:000000 -T table1.txt -XPUT http://CentOS7:8030/api/doris/tables1/_stream_load3.5.3 Insert
類似 MySQL 中的 Insert 語句,Doris 提供 INSERT INTO tbl SELECT …; 的方式從 Doris 的表中讀取數據并導入到另一張表。或者通過 INSERT INTO tbl VALUES(…); 插入單條數據
mysql> insert into table1 values(5,3,'helen',3);3.5.4 Multi load
用戶通過 HTTP 協議提交多個導入作業。Multi Load 可以保證多個導入作業的原子生效
3.5.5 Routine load
用戶通過 MySQL 協議提交例行導入作業,生成一個常駐線程,不間斷的從數據源(如 Kafka)中讀取數據并導入到 Doris 中
3.5.6 數據導入場景說明
用戶在接入 Doris 導入時,一般會采用程序接入的方式,這樣可以保證數據被定期的導入到 Doris 中。下面主要說明了程序接入 Doris 的最佳實踐。
幾種導入方式的比較:
3.5.7 參數說明
FE配置:
stream_load_default_timeout_second
導入任務的超時時間(以秒為單位),導入任務在設定的 timeout 時間內未完成則會被系統取消,變成 CANCELLED;默認的 timeout 時間為 600 秒。如果導入的源文件無法在規定時間內完成導入,用戶可以在 stream load 請求中設置單獨的超時時間。
BE配置:
streaming_load_max_mb
Stream load 的最大導入大小,默認為 10G,單位是 MB
3.6 查詢操作
3.6.1 數據查詢
3.6.2 數據表查詢
#查詢表的內存限制
mysql> SHOW VARIABLES LIKE "exec_mem_limit";exec_mem_limit 的單位是 byte,可以通過 SET 命令改變 exec_mem_limit 的值。如改為 8GB。
mysql> SET exec_mem_limit = 8589934592;3.6.3 查詢超時
#默認查詢時間為 300 秒,超時會被 Doris 系統 cancel 掉
mysql> SHOW VARIABLES LIKE "%query_timeout%";#設置超時時間,單位s
mysql> SET query_timeout = 60;? 當前超時的檢查間隔為 5 秒,所以小于 5 秒的超時不會太準確。
? 以上修改同樣為 session 級別。可以通過 SET GLOBAL 修改全局有效
3.6.4 Broadcast/Shuffle Join
Broadcast(默認查詢方式)
將小表進行條件過濾后,將其廣播到大表所在的各個節點上,形成一個內存 Hash 表,然后流式讀出大表的數據進行Hash Join。但是如果當小表過濾后的數據量無法放入內存的話,此時 Join 將無法完成,通常的報錯應該是首先造成內存超限
#顯示指定使用BroadCast
mysql> select sum(table1.pv) from table1 join [broadcast] table2 where table1.siteid = 2; Shuffle Join也稱作 Partitioned Join。即將小表和大表都按照 Join 的 key 進行 Hash,然后進行分布式的 Join。這個對內存的消耗就會分攤到集群的所有計算節點上
#顯示指定使用Shuffle Join
mysql> select sum(table1.pv) from table1 join [shuffle] table2 where table1.siteid = 2;3.7 備份與恢復
數據備份功能只支持版本0.8.2+
Doris 支持將當前數據以文件的形式,通過 broker 備份到遠端存儲系統中。之后可以通過 恢復 命令,從遠端存儲系統中將數據恢復到任意 Doris 集群。
使用該功能,需要部署對應遠端存儲的 broker。如 BOS、HDFS 等。可以通過 SHOW BROKER; 查看當前部署的 broker
3.7.1 backup備份
將指定表或分區的數據,直接以 Doris 存儲的文件的形式,上傳到遠端倉庫中進行存儲。當用戶提交 Backup 請求后,系統內部會做如下操作:
? 快照及快照上傳
快照階段會對指定的表或分區數據文件進行快照。之后,備份都是對快照進行操作。在快照之后,對表進行的更改、導入等操作都不再影響備份的結果。快照只是對當前數據文件產生一個硬鏈,耗時很少。快照完成后,會開始對這些快照文件進行逐一上傳。快照上傳由各個 Backend 并發完成。
? 元數據準備及上傳
數據文件快照上傳完成后,Frontend 會首先將對應元數據寫成本地文件,然后通過 broker 將本地元數據文件上傳到遠端倉庫。完成最終備份作業
3.7.2 restore恢復
需要指定一個遠端倉庫中已存在的備份,然后將這個備份的內容恢復到本地集群中。當用戶提交 Restore 請求后,系統內部會做如下操作:
? 在本地創建對應的元數據
這一步首先會在本地集群中,創建恢復對應的表分區等結構。創建完成后,該表可見,但是不可訪問。
? 本地snapshot
這一步是將上一步創建的表做一個快照。這其實是一個空快照(因為剛創建的表是沒有數據的),其目的主要是在 Backend 上產生對應的快照目錄,用于之后接收從遠端倉庫下載的快照文件。
? 下載快照
遠端倉庫中的快照文件,會被下載到對應的上一步生成的快照目錄中。這一步由各個 Backend 并發完成。
? 生效快照
快照下載完成后,我們要將各個快照映射為當前本地表的元數據。然后重新加載這些快照,使之生效,完成最終的恢復作業
3.7.3 常用命令
#REATE REPOSITORY
創建一個遠端倉庫路徑,用于備份或恢復。該命令需要借助 Broker 進程訪問遠端存儲,不同的 Broker 需要提供不同的參數
#BACKUP
執行一次備份操作
#SHOW BACKUP
查看最近一次backup的執行情況
#SHOW SNAPSHOT
查看遠端倉庫存在的備份
#RESTORE
執行一次恢復操作
#SHOW RESTORE
查看最近一次restore的執行情況
#CANCEL BACKUP
取消正在執行的backup操作
#CANCEL RESTORE
取消正在執行的restore操作
#DROP REPOSITORY
刪除已創建的遠端倉庫。僅僅是刪除該倉庫在 Doris 中的映射,不會刪除實際的倉庫數據
3.8 監控和報警
Doris 使用 Prometheus 和 Grafana 進項監控項的采集和展示
省略。
4 DORIS應用場景
4.1 DORIS添加KAFKA實時數據流
4.1.1 doris訂閱kafka
使用routine load的方式將kafka中的數據實時的導入到doris中。
1、Doris內部支持訂閱 Kafka 數據流,實現直接對接 Kafka:
2、用戶數據源經 Kafka 消息隊列收集后,可以依次進入到 Doris 中,通過 Doris 做報表展示和決策分析等工作
4.1.2 保證數據不丟失
精確記錄 Kafka 消費的 Offset,只有在確認 Kafka 消息成功被 Doris 消費時,對應的 Kafka 消息才會在 Mysql Meta 中被標記為 Committed
4.1.3 保證數據不重復
4.2 MYSQL+DORIS
將 Doris偽裝成一個 MySQL 的存儲后端,類似于 MyISAM、InnoDB 一樣。這樣既能夠利用上 MySQL 對于 SQL 的支持,也能利用上 Doris對于大數據量的支持。由于這里 MySQL 是計算單點,為了減輕 MySQL 的計算壓力,Doris 應用了 MySQL 的 BKA(Batched Key Access)以及 MRR(Multi-Range Read)等機制盡量將計算下推到 Doris來完成,從而減輕 MySQL 的計算壓力
架構圖如下:
4.3 HDFS+DORIS
使用broker load的方式將hdfs中的數據導入到Doris中。依賴broker。
fs-site.xml 把你集群對應的內容寫進去
添加borker節點
4.4 DORIS在EASTICSEARCH中的應用
1、ES 的優點是索引,可支持多列索引,甚至可支持全文語義索引(如 term,match,fuzzy 等);然而其缺點是沒有分布式計算引擎,不支持 join 等操作
2、與 ES 相反,Palo 具備豐富的 SQL 計算能力,以及分布式查詢能力;然而其索引性能較低,不支持全文索引。
3、Doris 在 ES 開發的過程中,分別借鑒 ES 和 Palo 的長處,支持了 Elasticsearch 多表 Join 操作,同時引入 Elasticsearch 的語義搜索功能,擴充了 Doris 的查詢能力。
使用方式:
第一步:建立一張 ES 的外部表。
第二步:在 ES 外部表中導入一些數據:
第三步:使用和 ES 一樣的搜索語句,進行全文檢索查詢:
4.5 DORIS個人感受
從個人的使用中,我覺得DORIS比較適合實時/離線的業務數據的計算。
首先從計算方面將,Doris兼容sql協議,讓它能很好的處理業務庫中的關系型數據,然后它的缺點就在于對非關系型數據的處理了,因為doris實際上也是以表作為處理單位的。
其次說說Doris的存儲。Doris的存儲十分類似于HDFS,分為FE和BE兩個組件。FE負責存儲元數據,BE負責實際的數據存儲。但是從官網的介紹來看,它的功能又沒有HDFS那么強大,至少不能像HDFS那樣創建目錄,這樣就沒法做到數據的分層管理,只能是存儲。這個地方就有點類似于HBASE了。但是又和HBASE有一些不同,HBASE支持的數據存儲方式更加靈活,Doris對數據的計算又更加方便。
再說說Doris的數據導入問題。Doris支持的五種兩類數據導入方式,大概就是流式、http方式的文件還有insert into了。方式多種多樣基本能覆蓋kafka、hdfs、mysql等作為數據上游。但是從官方的介紹來看,doris的數據導入是有一個弊端的,就是導入數據的部分異常,可能會導致整個任務的失敗:
從以上幾點來看,個人認為DORIS比較合適的場景架構是mysql -> sqoop/canal ->kafka -> [hdfs] -> Doris。其中Doris在架構中扮演的角色是作為實時查詢的計算引擎。Doris的insert into TableName select […]的導數據的方式,可以建立新表專門用來存儲計算的結果;
但是當數據量超過PB級別的時候,官方還是建議使用Hive。
4.6 DORIS在美團點評的實踐
參考鏈接:
https://blog.bcmeng.com/post/meituan-doris.html
4.6.1 美團外賣Doris實踐概述
Apache Doris已經在百度,美團,京東,小米等互聯網期中中廣泛使用。在這里只簡單介紹下Doris與美團外賣的準實時數倉。
美團外賣Doris準實時數倉結構圖如下:
上圖是Doris在美團外賣準實時數倉中應用的簡單架構。數據會從kafka和hive中進入Doris,然后每 15 分鐘會通過 Doris to Doris ETL 計算實時和離線的同環比(外賣的特殊業務需求)。
這個應用中主要依賴了 Doris 以下特性:
? 同時支持實時和離線數據導入。
? Doris To Doris ETL, 這個指的是 Doris insert into select 的功能
? 還有一個是主鍵去重,建模時用的是 Doris 的 UNIQUE KEY 模型,Doris 的主鍵去重和主鍵更新也是我們用戶廣泛使用的功能。
另外,帖子中還對比了Storm實時數倉和Doris準實時數倉的開發效率:
| Storm實時 | 20人日 | 代碼運維成本高 |
| Doris準實時 | 10人日 | SQL運維成本低 |
源于Doris對SQL協議的兼容,Doris的開發效率要遠遠高于Storm。
4.6.2 美團外賣Doris準實時數倉平臺建設
美團外賣的Doris數倉建設大致分兩條線:hive to doris 和 kafka to doris。
Hive To Doris
流程示意圖:
Hive To Doris 是基于 Doris 的 Http mini load 實現的。首先會用 Hive 客戶端將 Hive 表數據經過過濾,Null 值處理,格式轉換,Split 后存儲到 HDFS 上,然后多線程從 HDFS 將數據拉取到本地,緊接著將數據通過 Http 方式導入到 Doris 中。
Doris HTTP mini Load 對單次導入文件的大小是有限制的。這里分享這個 Hive 小文件合并過程,是用 Hive 小文件合并解決了大文件 Split 的問題,可以利用 MR 來分布式 Split,讓 Split 過程十分高效:
這里需要注意的一點是,在極端情況下,有些 ORC 格式存儲的 Hive 表壓縮比很高,導致第一步MR的單個 Mapper 輸出文件大小達到好幾 G,進而無法觸發 Hive 小文件合并過程。 解決方法可以調大 Doris BE 的mini_load_max_mb參數,或者讓用戶修改 Hive 表存儲格式。
Kafka To Doris
流程示意圖:

5.4 部署FE,報錯找不到IMAGE.0
報錯:
/opt/doris/output/fe/doris-meta/image/image.0 not found
配置文件的問題,配置文件需要指定并創建meta_dir。詳見FE配置文件2.2.3
5.5 使用MYSQL連接FE失敗
報錯:
ERROR 2003 (HY000) Cant’t connect to MySQL server on ‘CentOS7’(111)解決方案:
配置文件中綁定的IP需要帶上網關
priority_networks =CentOS7/24
使用免密登陸
mysql -h CentOS7 -P 9030 -uroot
5.6 添加BE失敗
報錯
連接FE之后使用Alter語句添加BE失敗:
失敗原因:
mysql連接FE失敗,使用正確的連接方式、端口號連接FE才能創建BE
[root@CentOS7]# mysql -h CentOS7 -P 9030 -uroot
界面訪問UI失敗
http://CentOS7:8030/system
5.7 BE啟動失敗
報錯:
解決:
1.修改最大文件句柄數
修改 /etc/sysctl.conf, 加入
echo fs.file-max = 6553560 >> /etc/sysctl.conf2.查看是否修改成功
cat /etc/security/limits.conf cat /etc/sysctl.conf3.重啟
reboot -h now5.8 BE連接失敗
報錯如下:可以查詢到BE,但是顯示BE連接失敗
解決:
在 be/bin/be.pid中有BE的進程號,查看進程是否啟動成功
總結
以上是生活随笔為你收集整理的Apache Doris技术实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是高防CDN防护
- 下一篇: 华硕主板win10 使用固态硬盘,机