大数据之实时数据分析之Apache Doris数据库
一、概要
Apache Doris是一款現(xiàn)代 MPP (Massively Parallel Processing大規(guī)模并行處理)的分布式 SQL 分析數(shù)據(jù)庫(kù),所謂分析數(shù)據(jù)庫(kù)就是將其數(shù)據(jù)集分布在許多機(jī)器或節(jié)點(diǎn)上,以處理大量數(shù)據(jù),采用 Apache 2.0認(rèn)證授權(quán)。它的前身是原百度 Palo,由百度在2017年開源,2018年進(jìn)入 Apache 孵化器。Apache Doris它可以提供亞秒級(jí)查詢和高效的實(shí)時(shí)數(shù)據(jù)分析。憑借其分布式架構(gòu),將支持高達(dá) 10PB 級(jí)別的數(shù)據(jù)集,并且易于操作。它可以滿足各種數(shù)據(jù)分析場(chǎng)景,比如:歷史數(shù)據(jù)報(bào)告、實(shí)時(shí)數(shù)據(jù)分析、交互式數(shù)據(jù)分析、探索性數(shù)據(jù)分析等。
關(guān)于MPP (Massively Parallel Processing),即大規(guī)模并行處理,它是將任務(wù)并行的分散到多個(gè)服務(wù)器和節(jié)點(diǎn)上,在每個(gè)節(jié)點(diǎn)上計(jì)算完成后,將各自部分的結(jié)果匯總在一起得到最終的結(jié)果(與Hadoop相似)。每臺(tái)數(shù)據(jù)節(jié)點(diǎn)通過專用網(wǎng)絡(luò)或者商業(yè)通用網(wǎng)絡(luò)互相連接,彼此協(xié)同計(jì)算,作為整體提供數(shù)據(jù)庫(kù)服務(wù)。整個(gè)集群稱為非共享數(shù)據(jù)庫(kù)集群,非共享數(shù)據(jù)庫(kù)集群有完全的可伸縮性、高可用、高性能、優(yōu)秀的性價(jià)比、資源共享等優(yōu)勢(shì)。故MPP數(shù)據(jù)庫(kù)作為一款 Shared Nothing架構(gòu)的分布式并行結(jié)構(gòu)化數(shù)據(jù)庫(kù)集群,它的高性能、高可用及高擴(kuò)展特性,可以為超大規(guī)模數(shù)據(jù)管理提供高性價(jià)比的通用計(jì)算平臺(tái),并廣泛地用于支撐各類數(shù)據(jù)倉(cāng)庫(kù)系統(tǒng)、BI 系統(tǒng)和決策支持系統(tǒng)。
MPP 采用完全并行的MPP + Shared Nothing 的分布式扁平架構(gòu),這種架構(gòu)中的每一個(gè)節(jié)點(diǎn)(node)都是獨(dú)立的、自給的、節(jié)點(diǎn)之間對(duì)等,而且整個(gè)系統(tǒng)中不存在單點(diǎn)瓶頸,具有非常強(qiáng)的擴(kuò)展性。
MPP數(shù)據(jù)庫(kù)適合存儲(chǔ)高密度價(jià)值數(shù)據(jù),并且是長(zhǎng)期存儲(chǔ)和頻繁使用(讀/消費(fèi)),MPP并行數(shù)據(jù)庫(kù)會(huì)花大量的精力在Load階段,把數(shù)據(jù)處理成適合分析的中間格式。帶來的優(yōu)點(diǎn)就是從查詢速度快,通常在秒級(jí)甚至毫秒級(jí)以內(nèi)就可以返回查詢結(jié)果。缺點(diǎn)是不支持細(xì)粒度的容錯(cuò)。MPP 具備以下技術(shù)特征:
1、相對(duì)低的硬件成本:完全兼容 x86 架構(gòu)的 PC Server,無需昂貴的 Unix 服務(wù)器和磁盤陣列;
2、集群架構(gòu)與部署:完全并行的 MPP + Shared Nothing 的分布式架構(gòu),采用 Non-Master 部署,節(jié)點(diǎn)對(duì)等的扁平結(jié)構(gòu);
3、海量數(shù)據(jù)分布?jí)嚎s存儲(chǔ):可處理 PB 級(jí)別以上的結(jié)構(gòu)化數(shù)據(jù),采用 hash分布、random 存儲(chǔ)策略進(jìn)行數(shù)據(jù)存儲(chǔ);同時(shí)采用先進(jìn)的壓縮算法,減少存儲(chǔ)數(shù)據(jù)所需的空間,可以將所用空間減少 1~20 倍,并相應(yīng)地提高 I/O 性能;
4、 數(shù)據(jù)加載高效性:基于策略的數(shù)據(jù)加載模式,集群整體加載速度可達(dá)2TB/h;
5、高擴(kuò)展、高可靠:支持集群節(jié)點(diǎn)的擴(kuò)容和縮容,支持全量、增量的備份/恢復(fù);但當(dāng)節(jié)點(diǎn)數(shù)達(dá)到100左右時(shí),MPP會(huì)遇到SQScalability的問題,速度變慢,或者不穩(wěn)定。增加或者刪除節(jié)點(diǎn)時(shí),需要的維護(hù)工作比較大,集群會(huì)遇到數(shù)據(jù)遷移和重新平衡的問題;
6、 高可用、易維護(hù):數(shù)據(jù)通過副本提供冗余保護(hù),自動(dòng)故障探測(cè)和管理,自動(dòng)同步元數(shù)據(jù)和業(yè)務(wù)數(shù)據(jù)。提供圖形化工具,以簡(jiǎn)化管理員對(duì)數(shù)據(jù)庫(kù)的管理工作;
7、高并發(fā):讀寫不互斥,支持?jǐn)?shù)據(jù)的邊加載邊查詢,單個(gè)節(jié)點(diǎn)并發(fā)能力大于 300 用戶;
8、行列混合存儲(chǔ):提供行列混合存儲(chǔ)方案,從而提高了列存數(shù)據(jù)庫(kù)特殊查詢場(chǎng)景的查詢響應(yīng)耗時(shí);MPP數(shù)據(jù)庫(kù)一般是列式的,即MPP數(shù)據(jù)庫(kù)通常將每一列存儲(chǔ)為一個(gè)對(duì)象,而不是將表中的每一行存儲(chǔ)為一個(gè)對(duì)象(事務(wù)數(shù)據(jù)庫(kù)的功能)。這種體系結(jié)構(gòu)使復(fù)雜的分析查詢可以更快,更有效地處理。
9、標(biāo)準(zhǔn)化:支持SQL92 標(biāo)準(zhǔn),支持 C API、ODBC、JDBC、ADO.NET 等接口規(guī)范。
我們這里順帶回顧下OLTP與OLAP區(qū)別:
OLTP(OnLine Transaction Processing ,聯(lián)機(jī)事務(wù)處理)系統(tǒng):如mysql,這種關(guān)系型數(shù)據(jù)庫(kù)擅長(zhǎng)事務(wù)處理,在數(shù)據(jù)操作中保持著很強(qiáng)的一致性和原子性 ,能夠很好的支持頻繁的數(shù)據(jù)插入和修改 ,但是,一旦數(shù)據(jù)量過大,OLTP便力不從心了。
OLAP(On-Line Analytical Processing,聯(lián)機(jī)分析處理)系統(tǒng):例如Greenplum。并不特別關(guān)心對(duì)數(shù)據(jù)進(jìn)行輸入、修改等事務(wù)性處理,它更關(guān)心對(duì)已有的大量數(shù)據(jù)進(jìn)行多維度的、復(fù)雜的分析的一類數(shù)據(jù)系統(tǒng)。
與Hadoop的區(qū)別:
1、.底層數(shù)據(jù)庫(kù)不同:MPP跑的是SQL,而Hadoop底層處理的是MapReduce程序。SQL on Hadoop是利用Hadoop平臺(tái)存儲(chǔ)數(shù)據(jù),在其之上實(shí)現(xiàn)SQL查詢引擎。最大的特點(diǎn)是Scalability非常好,可以支持超過1000個(gè)節(jié)點(diǎn)的集群。但是由于Hadoop的特點(diǎn),很多查詢還是需要做大量的數(shù)據(jù)掃描操作,因此查詢速度往往比MPP要慢,而且支持的并發(fā)查詢數(shù)一般也比較低。
2、擴(kuò)展能力不同:MPP雖然是宣稱可以橫向擴(kuò)展Scale OUT,但是這種擴(kuò)展一般是擴(kuò)展到100左右,而Hadoop一般可以擴(kuò)展1000+。
3、應(yīng)用場(chǎng)景不同:Hadoop更適合處理非結(jié)構(gòu)化和半結(jié)構(gòu)化數(shù)據(jù),尤其適合海量數(shù)據(jù)批處理等應(yīng)用要求,多用于海量數(shù)據(jù)存儲(chǔ)查詢、批量數(shù)據(jù)ETL、非機(jī)構(gòu)化數(shù)據(jù)分析(日志分析、文本分析)等;而MPP適合替代現(xiàn)有關(guān)系數(shù)據(jù)進(jìn)行現(xiàn)有條件下的大數(shù)據(jù)處理,且具有較高的效率,適合多維度數(shù)據(jù)自助分析、數(shù)據(jù)集市等。如何場(chǎng)景中數(shù)據(jù)都是結(jié)構(gòu)化的數(shù)據(jù),且習(xí)慣使用傳統(tǒng)的RDBMS,可以考慮MPP,例如Greenplum/Gbase/elasticsearch/doris/MemSQL/Teradata等;但是如有很多非結(jié)構(gòu)化數(shù)據(jù),或者數(shù)據(jù)量巨大,有需要擴(kuò)展到成百上千個(gè)數(shù)據(jù)節(jié)點(diǎn)需求的,這個(gè)時(shí)候Hadoop是更好的選擇,如Hive/Spark等。
與傳統(tǒng)數(shù)據(jù)庫(kù)的對(duì)比:
Doris 主要集成了 Google Mesa 和 Apache Impala 的技術(shù),基于列式存儲(chǔ)引擎,可以通過 MySQL 客戶端進(jìn)行通信。Doris 的定位是面向在線報(bào)表和分析的數(shù)據(jù)倉(cāng)庫(kù)系統(tǒng),可以對(duì)標(biāo)于商業(yè)的MPP 數(shù)據(jù)倉(cāng)庫(kù)系統(tǒng),比如Greenplum、Vertica、Teradata 等。Doris 的目標(biāo):
Doris優(yōu)勢(shì):
完全兼容MySQL協(xié)議;
采用列式存儲(chǔ)、對(duì)數(shù)據(jù)以高壓縮比進(jìn)行壓縮存儲(chǔ)、向量化執(zhí)行等先進(jìn)技術(shù),因此獲得了極高的查詢效率;
支持多種存儲(chǔ)模型:同時(shí)支持類似于Mesa將列分為Key和Value的存儲(chǔ)模型,同時(shí)支持Unique Key和Dup Key的存儲(chǔ)模型。用戶可以根據(jù)自己的業(yè)務(wù)場(chǎng)景,選用不同的存儲(chǔ)模型;
支持兩層分區(qū);
支持多種數(shù)據(jù)導(dǎo)入方式;
安全資源隔離擴(kuò)容縮容;
備份和恢復(fù);
支持web監(jiān)控和管理;
相關(guān)知識(shí)參考:
1、Apache Doris : 一個(gè)開源 MPP 數(shù)據(jù)庫(kù)的架構(gòu)與實(shí)踐
2、Doris 建表、數(shù)據(jù)導(dǎo)入與刪除
3、Doris 數(shù)據(jù)模型、ROLLUP 及前綴索引
4、Doris官網(wǎng); 官方中文文檔;
二、產(chǎn)品架構(gòu)及原理
整體架構(gòu)如下圖:
如上圖所示,Doris 的整體架構(gòu)分為了兩層。多個(gè) FE 組成第一層,提供 FE 的橫向擴(kuò)展和高可用。多個(gè) BE 組成第二層,負(fù)責(zé)數(shù)據(jù)存儲(chǔ)于管理。Doris 的整體架構(gòu)和 TiDB 類似,借助 MySQL 協(xié)議,用戶使用任意 MySQL 的 ODBC/JDBC以及MySQL 的客戶端,都可以直接訪問 Doris。Doris 中的模塊包括 FE 和 BE 兩類:FE 主要負(fù)責(zé)元數(shù)據(jù)的管理、存儲(chǔ),以及查詢的解析等;一個(gè)用戶請(qǐng)求經(jīng)過 FE 解析、規(guī)劃后,具體的執(zhí)行計(jì)劃會(huì)發(fā)送給 BE,BE 則會(huì)完成查詢的具體執(zhí)行。BE 節(jié)點(diǎn)主要負(fù)責(zé)數(shù)據(jù)的存儲(chǔ)、以及查詢計(jì)劃的執(zhí)行。目前平臺(tái)的 FE 部分主要使用 Java,BE 部分主要使用 C++。
2.1、組件及原理
FE(Frontend):,Doris的前端節(jié)點(diǎn)。它主要負(fù)責(zé)接收和返回客戶端請(qǐng)求、元數(shù)據(jù)、集群管理和查詢計(jì)劃生成。各個(gè) FE 之間,通過 bdbje(BerkeleyDB Java Edition,在 Doris 中,使用 bdbje 完成元數(shù)據(jù)操作日志的持久化、FE 高可用等功能)協(xié)議進(jìn)行 leader 選舉,數(shù)據(jù)同步等工作。FE角色分為追隨者Follower和觀察者 Observer,其中Leader是Follower組中選舉產(chǎn)生的;其中一個(gè) follower 成為 leader 節(jié)點(diǎn),負(fù)責(zé)元數(shù)據(jù)的寫入操作。當(dāng) leader 節(jié)點(diǎn)宕機(jī)后,其他 follower 節(jié)點(diǎn)會(huì)重新選舉出一個(gè) leader,保證服務(wù)的高可用。observer 節(jié)點(diǎn)僅從 leader 節(jié)點(diǎn)進(jìn)行元數(shù)據(jù)同步,不參與選舉。可以橫向擴(kuò)展以提供元數(shù)據(jù)的讀服務(wù)的擴(kuò)展性。
BE(Backend): Doris的后端節(jié)點(diǎn)。主要負(fù)責(zé)數(shù)據(jù)存儲(chǔ)與管理、查詢計(jì)劃執(zhí)行等工作。
Broker:Broker是一個(gè)無狀態(tài)的進(jìn)程。主要是讓 Doris 在類 Unix 的文件系統(tǒng)接口中可以訪問如 HDFS 上的數(shù)據(jù)那樣的外部數(shù)據(jù)源,從而可以用于數(shù)據(jù)導(dǎo)入或數(shù)據(jù)導(dǎo)出操作。
Tablet:Tablet是一張表的實(shí)際物理存儲(chǔ)單元。在由BE組成的分布式存儲(chǔ)層中,經(jīng)過分區(qū)和分桶后,以Tablet為單位存儲(chǔ)一張表。每個(gè) Tablet 包括元信息和幾個(gè)連續(xù)的 RowSet。 .
Rowset:Rowset是tablet中某次數(shù)據(jù)變化的數(shù)據(jù)集合,數(shù)據(jù)變化包括:數(shù)據(jù)的導(dǎo)入、刪除、更新。Rowset按版本信息記錄。每次更改都會(huì)生成一個(gè)版本。
Version:由Start和End兩個(gè)屬性組成,維護(hù)數(shù)據(jù)變化的記錄信息。通常用來表示 Rowset 的版本范圍,新導(dǎo)入后會(huì)生成一個(gè) Start 和 End 相等的 Rowset,在 Compaction 之后生成一個(gè)有范圍的 Rowset 版本。
Segment:表示Rowset中的數(shù)據(jù)段。多個(gè) Segment 形成一個(gè) Rowset。
Compaction:合并連續(xù)版本的Rowset的過程稱為Compaction,合并過程中數(shù)據(jù)會(huì)被壓縮。
1)Doris 各節(jié)點(diǎn)認(rèn)證機(jī)制
除了 Master FE 以外,其余角色節(jié)點(diǎn)(Follower FE,Observer FE,Backend),都需要通過 ALTER SYSTEM ADD 語句先注冊(cè)到集群,然后才能加入集群。
Master FE 在第一次啟動(dòng)時(shí),會(huì)在 doris-meta/image/VERSION 文件中生成一個(gè) cluster_id。
FE 在第一次加入集群時(shí),會(huì)首先從 Master FE 獲取這個(gè)文件。之后每次 FE 之間的重新連接(FE 重啟),都會(huì)校驗(yàn)自身 cluster id 是否與已存在的其它 FE 的 cluster id 相同。如果不同,則該 FE 會(huì)自動(dòng)退出。
BE 在第一次接收到 Master FE 的心跳時(shí),會(huì)從心跳中獲取到 cluster id,并記錄到數(shù)據(jù)目錄的 cluster_id 文件中。之后的每次心跳都會(huì)比對(duì) FE 發(fā)來的 cluster id。如果 cluster id 不相等,則 BE 會(huì)拒絕響應(yīng) FE 的心跳。
心跳中同時(shí)會(huì)包含 Master FE 的 ip。當(dāng) FE 切主時(shí),新的 Master FE 會(huì)攜帶自身的 ip 發(fā)送心跳給 BE,BE 會(huì)更新自身保存的 Master FE 的 ip。
2)BE 進(jìn)程文件句柄數(shù):
BE進(jìn)程文件句柄數(shù),受min_file_descriptor_number/max_file_descriptor_number兩個(gè)參數(shù)控制。
如果不在[min_file_descriptor_number, max_file_descriptor_number]區(qū)間內(nèi),BE進(jìn)程啟動(dòng)會(huì)出錯(cuò),可以使用ulimit進(jìn)行設(shè)置。
min_file_descriptor_number的默認(rèn)值為65536。
max_file_descriptor_number的默認(rèn)值為131072.
ulimit -n 65536; 表示將文件句柄設(shè)成65536。
啟動(dòng)BE進(jìn)程之后,可以通過 cat /proc/$pid/limits 查看進(jìn)程實(shí)際生效的句柄數(shù);如果使用了supervisord,遇到句柄數(shù)錯(cuò)誤,可以通過修改supervisord的minfds參數(shù)解決。
vim /etc/supervisord.conf //修改如下minfds=65535 ; (min. avail startup file descriptors;default 1024)2.2、Doris 數(shù)據(jù)分布
如果從表的角度來看數(shù)據(jù)結(jié)構(gòu),用戶的一張 Table 會(huì)拆成多個(gè) Tablet,Tablet 寫入/存儲(chǔ)到Doris會(huì)存成多副本,存儲(chǔ)在不同的 BE 中,從而保證數(shù)據(jù)的高可用和高可靠。類似于kafka的分區(qū)存儲(chǔ)多副本。
2.3、Doris 數(shù)據(jù)模型
1)Doris 數(shù)據(jù)模型特點(diǎn)
1、鍵值對(duì)存儲(chǔ)形式:類似于字典搜索查詢的鍵值對(duì)格式,Doris 中所有數(shù)據(jù)分成兩列:Key 列和 Value 列。如下圖所示,Time、Id、Country 列共同組成 Key 列,Clicks、Cost 列為 Value 列。Key 列有序可進(jìn)行快速查找,Value 列可以按照具體聚合類型內(nèi)部完成數(shù)據(jù)聚合。
2、Key 列全局有序排列,查詢時(shí)方便快速定位查找。Doris 數(shù)據(jù)模型的一個(gè)顯著特點(diǎn)是 Key 列全局唯一,因此存在相同 Key 值的不同 Value,則后面的數(shù)據(jù)與前面的數(shù)據(jù)自動(dòng)做 ( SUM,MIN,MAX,REPLACE ) 等聚合處理。例如,下圖中綠色方框中的兩行,相同的 Key 值對(duì)應(yīng)不同的 Value;因此,新的 Value 到達(dá)后,就會(huì)與先前的中間數(shù)據(jù)作 SUM 處理,得到最新的數(shù)據(jù),不僅提升效率,還可提高數(shù)據(jù)處理的準(zhǔn)確性。
2)按列存儲(chǔ)
在 Doris 中,數(shù)據(jù)以表(Table)的形式進(jìn)行邏輯上的描述。Column 可以分為兩大類:Key 和 Value。從業(yè)務(wù)角度看,Key 和 Value 可以分別對(duì)應(yīng)維度列和指標(biāo)列。
1、Doris 的數(shù)據(jù)是按列存儲(chǔ)的,每一列單獨(dú)存放。
2、查詢時(shí),只訪問查詢涉及的列,大量降低 I/O。
3、數(shù)據(jù)類型一致,方便壓縮。
4、數(shù)據(jù)包建索引,數(shù)據(jù)即索引。
5、利用原始過濾條件以及 min、max 和 sum 等智能索引技術(shù),將數(shù)據(jù)集查詢范圍盡可能地縮小,大大減少 I/O,提升查詢效率。
3)物化視圖
物化視圖是提取某些維度的組合建立對(duì)用戶透明的卻有真實(shí)數(shù)據(jù)的視圖表格。Doris 的物化視圖可以保證用戶在更新時(shí),直接更新原始表,Doris 會(huì)保證原表、物化視圖原子生效。在查詢的時(shí)候用戶也只需指定原始表,Doris 會(huì)根據(jù)查詢的具體條件,選擇適合的物化視圖完成查詢。通常用戶可以通過物化視圖功能完成以下兩種功能:
1、更換索引列進(jìn)行重排列
2、針對(duì)指定列做聚合查詢
示例如下:
2.4、Doris 關(guān)鍵技術(shù)
1)數(shù)據(jù)可靠性
1、元數(shù)據(jù)使用 Memory+Checkpoint+Journal ,使用 BTBJE ( 類似于 Raft ) 協(xié)議實(shí)現(xiàn)高可用性和高可靠性。
2、Doris 內(nèi)部自行管理數(shù)據(jù)的多副本和自動(dòng)修復(fù)。保證數(shù)據(jù)的高可用、高可靠。在服務(wù)器宕機(jī)的情況下,服務(wù)依然可用,數(shù)據(jù)也不會(huì)丟失。
2)易運(yùn)維
1、部署方便:Doris 部署無外部依賴,只需要部署 BE 和 IBE 即可搭建起一個(gè)集群。
2、操作方便:它支持 Online Schema Change(在線更改表模式( 加減列,創(chuàng)建 Rollup )) ,不會(huì)影響當(dāng)前服務(wù),不會(huì)阻塞讀、寫等操作;這種執(zhí)行是異步的 ( 用戶不需要一直盯在那里 );
3、副本自動(dòng)均衡:傳統(tǒng)數(shù)據(jù)庫(kù)的擴(kuò)(縮)容比較麻煩,有時(shí)甚至需要重做數(shù)據(jù);而 Doris 數(shù)據(jù)庫(kù)只需要一條 SQL ( 無須額外操作 ) 即可實(shí)現(xiàn)擴(kuò)(縮)容。
4、內(nèi)置監(jiān)控:使用 Prometheus、Grafana 將監(jiān)控項(xiàng)指標(biāo)列出。
數(shù)據(jù)庫(kù)同步操作和異步操作卻別:
同步,是所有的操作都做完,才返回給用戶結(jié)果;即寫完數(shù)據(jù)庫(kù)之后,再響應(yīng)用戶,用戶體驗(yàn)不好;
異步,不用等所有操作等做完,就相應(yīng)用戶請(qǐng)求;即先相應(yīng)用戶請(qǐng)求,然后慢慢去寫數(shù)據(jù)庫(kù),用戶體驗(yàn)較好。緩存機(jī)制(也就是消息隊(duì)列),就是異步操作的一個(gè)典型應(yīng)用。
3)MySQL 兼容性
MySQL 的兼容性主要體現(xiàn)在以下兩方面:
1、兼容 MySQL 的網(wǎng)絡(luò)協(xié)議 ( MySQL Network Protocol )
2、兼容 MySQL 語法,使用 MySQL 語法可對(duì) Doris 數(shù)據(jù)庫(kù)進(jìn)行查詢;比如:MySQL 的調(diào)度服務(wù)器 Proxy,可以直接用作 Doris 的 Proxy。
3、Doris 的前端展示,可以使用 MySQL 專屬展示器 Tableu。
4、Doris 與 R 語言可以實(shí)現(xiàn)無縫對(duì)接,用 R 語言可直接操作 Doris 數(shù)據(jù)庫(kù),進(jìn)行數(shù)據(jù)分析、數(shù)據(jù)挖掘等工作。
4)支持 MPP
MPP 即 Massively Parallel Processing,大規(guī)模并行處理,即海量數(shù)據(jù)并發(fā)查詢。比如下面的語句:
SELECT k1,SUM(v1) FROM A,B WHERE A.k2=B.k2 GROUP BY k1 ORDER BY SUM(v1)上述語句包含了合并、聚合計(jì)算、排序等多種操作;在執(zhí)行時(shí),MPP 會(huì)將其拆分成多份,分布到每臺(tái)機(jī)器執(zhí)行,最后再將結(jié)果匯總。假如有10臺(tái)機(jī)器,在大數(shù)據(jù)量下,這種查詢執(zhí)行方式可以使得查詢性能達(dá)到10倍的提升。如下圖所示:
三、部署配置
3.1、最低環(huán)境要求
CPU:2C(最低)8C(推薦)
內(nèi)存:4G(最低)48G(推薦)
硬盤:100G(最低)400G(推薦),推薦使用 ext4 文件系統(tǒng);FE的磁盤空間主要用于存儲(chǔ)元數(shù)據(jù),包括日志和圖像。通常它的范圍從幾百 MB 到幾 GB。而BE的磁盤空間主要用于存儲(chǔ)用戶數(shù)據(jù)。總磁盤空間按用戶總數(shù)據(jù)*3(3份)計(jì)算。然后額外預(yù)留 40% 的空間用于后臺(tái)壓縮和一些中間數(shù)據(jù)存儲(chǔ)。
平臺(tái):MacOS(Intel)、LinuxOS、Windows虛擬機(jī)
系統(tǒng):CentOS(7.1及以上)、Ubuntu(16.04及以上)
軟件:JDK(1.8及以上)、GCC(4.8.2及以上)
下表是官網(wǎng)推薦的生產(chǎn)環(huán)境配置:
環(huán)境網(wǎng)絡(luò)要求:
其他注意事項(xiàng)及部署規(guī)劃參考:
1、單臺(tái)機(jī)器可以部署多個(gè)BE實(shí)例,但只能部署一個(gè)FE。如果需要三份數(shù)據(jù),則每臺(tái)機(jī)器至少需要一個(gè) BE 實(shí)例(而不是每臺(tái)機(jī)器三個(gè) BE 實(shí)例)。多個(gè)FE服務(wù)器時(shí)鐘必須一致(允許最大5秒時(shí)鐘偏差);
2、測(cè)試環(huán)境也可以只用一個(gè) BE 進(jìn)行測(cè)試。在實(shí)際生產(chǎn)環(huán)境中,BE實(shí)例的數(shù)量直接決定了整體的查詢延遲。
所有部署節(jié)點(diǎn)都關(guān)閉 Swap。
3、FE 節(jié)點(diǎn)數(shù)據(jù)至少為 1(1 個(gè) Follower)。當(dāng)部署一個(gè) Follower 和一個(gè) Observer 時(shí),可以實(shí)現(xiàn)高讀取可用性。當(dāng)部署三個(gè) Follower 時(shí),可以實(shí)現(xiàn)讀寫高可用性(HA)。Followers 的數(shù)量必須是奇數(shù),Observers 的數(shù)量是任意的。
4、當(dāng)集群可用性要求較高時(shí)(例如提供在線服務(wù)),可以部署三個(gè) Follower 和一到三個(gè) Observer。對(duì)于線下業(yè)務(wù),建議部署1個(gè)Follower和1-3個(gè)Observer。
5、通常我們推薦大約10到100臺(tái)機(jī)器來充分發(fā)揮Doris的性能(其中3臺(tái)部署FE(HA),其余部署B(yǎng)E);當(dāng)然,Doris 的性能與節(jié)點(diǎn)的數(shù)量和配置呈正相關(guān)。最少四臺(tái)機(jī)器(一臺(tái) FE,三臺(tái) BE,一臺(tái) BE 混合一臺(tái) Observer FE 提供元數(shù)據(jù)備份)和較低的配置,Doris 仍然可以流暢運(yùn)行。部署多個(gè) FE 實(shí)例時(shí),請(qǐng)確保 FE 的 http 端口配置相同。
6、如果 FE 和 BE 混用,要注意資源競(jìng)爭(zhēng),保證元數(shù)據(jù)目錄和數(shù)據(jù)目錄分配到不同的磁盤上。
7、Broker 是訪問外部數(shù)據(jù)源的進(jìn)程,例如 hdfs。通常,每臺(tái)機(jī)器上都會(huì)部署一個(gè)代理實(shí)例;
8、在多網(wǎng)卡/docker環(huán)境下,因目前 Doris 不會(huì)自動(dòng)識(shí)別可用 IP。所以我們必須通過FE和BE的priority_networks配置項(xiàng)強(qiáng)制指定正確的IP。配置項(xiàng)需要寫在fe.conf和be.conf中。該配置項(xiàng)用于告訴進(jìn)程在FE或BE啟動(dòng)時(shí)應(yīng)該綁定哪個(gè)IP。如:priority_networks=10.1.3.0/24;注意:當(dāng)配置了優(yōu)先網(wǎng)絡(luò)并啟動(dòng)了FE或BE時(shí),只能保證FE或BE的IP綁定正確。在 ADD BACKEND 或 ADD FRONTEND 語句中,還需要指定 IP 匹配優(yōu)先級(jí)網(wǎng)絡(luò)配置,否則無法建立集群。如果之前已經(jīng)綁定過,可DROP移除添加錯(cuò)誤的 BE,并重新使用正確的 IP 來執(zhí)行 ALTER SYSTEM ADD BACKEND “10.1.3.2:9050”;目前, Broker 的服務(wù)默認(rèn)綁定到 0.0.0.0。只需使用 ADD BROKER 時(shí)配置正確的可訪問代理 IP即可。
9、默認(rèn)情況下,doris 區(qū)分大小寫。如果需要不區(qū)分大小寫的表名,則需要在集群初始化之前進(jìn)行設(shè)置。集群初始化完成后無法更改表名區(qū)分大小寫。配置參看Variable。
10、FE配置文件fe.conf中的JAVA_OPTS默認(rèn)為java最大堆內(nèi)存為4GB,建議生產(chǎn)環(huán)境調(diào)整為8G以上。尤其集群方式部署時(shí)。
3.2、環(huán)境部署
1)部署前準(zhǔn)備
vi /etc/security/limits.conf //修改系統(tǒng)可打開/操作最大文件數(shù)* soft nofile 65536 * hard nofile 65536//配置Doris需要的環(huán)境變量 vim /etc/profile.d/doris.shexport DORIS_HOME=/opt/app export JAVA_HOME=/usr/lib/jdk/jdk1.8.0_202 export CLASSPATH=.:$JAVA_HOME/lib export PATH=$PATH:$DORIS_HOME/fe/bin:$DORIS_HOME/be/bin:$JAVA_HOME/bin:$PATH # save and sourcesource /etc/profile.d/doris.sh//jdk安裝 https://www.oracle.com/webapps/redirect/signon?nexturl=https://download.oracle.com/otn/java/jdk/8u202-b08/1961070e4c9b4e26a04e7f5a083f551e/jdk-8u202-linux-x64.rpm #源碼 https://www.oracle.com/webapps/redirect/signon?nexturl=https://download.oracle.com/otn/java/jdk/8u202-b08/1961070e4c9b4e26a04e7f5a083f551e/jdk-8u202-linux-x64.tar.gztar -xzf jdk-8u301-linux-x64.tar.gz -C /opt/app/ java -version alternatives --list//Doris的元數(shù)據(jù)要求時(shí)間精度小于5000ms,所以集群內(nèi)所有機(jī)器需要同步時(shí)鐘,避免時(shí)鐘問題導(dǎo)致元數(shù)據(jù)不一致導(dǎo)致服務(wù)異常;配置NTP服務(wù);chrony 是網(wǎng)絡(luò)時(shí)間協(xié)議(NTP)的通用實(shí)現(xiàn)。chrony 包含兩個(gè)程序:chronyd 是一個(gè)可以在啟動(dòng)時(shí)啟動(dòng)的守護(hù)程序。chronyc 是一個(gè)命令行界面程序,用于監(jiān)視 chronyd 的性能并在運(yùn)行時(shí)更改各種操作參數(shù)。 yum -y install chronysystemctl enable chronyd systemctl start chronydvim /etc/chrony.conf# 使用 pool.ntp.org 項(xiàng)目中的公共服務(wù)器。以server開,理論上想添加多少時(shí)間服務(wù)器都可以。 # Use public servers from the pool.ntp.org project. # Please consider joining the pool (http://www.pool.ntp.org/join.html). server 0.centos.pool.ntp.org iburst server 1.centos.pool.ntp.org iburst server 2.centos.pool.ntp.org iburst server 3.centos.pool.ntp.org iburst server s1a.time.edu.cn iburst server ntp.aliyun.com iburst# 根據(jù)實(shí)際時(shí)間計(jì)算出服務(wù)器增減時(shí)間的比率,然后記錄到一個(gè)文件中,在系統(tǒng)重啟后為系統(tǒng)做出最佳時(shí)間補(bǔ)償調(diào)整。 # Record the rate at which the system clock gains/losses time. driftfile /var/lib/chrony/drift# 如果系統(tǒng)時(shí)鐘的偏移量大于1秒,則允許系統(tǒng)時(shí)鐘在前三次更新中步進(jìn)。 # Allow the system clock to be stepped in the first three updates if its offset is larger than 1 second. makestep 1.0 3# 啟用實(shí)時(shí)時(shí)鐘(RTC)的內(nèi)核同步。 # Enable kernel synchronization of the real-time clock (RTC). rtcsync# 通過使用 hwtimestamp 指令啟用硬件時(shí)間戳 # Enable hardware timestamping on all interfaces that support it. #hwtimestamp *# Increase the minimum number of selectable sources required to adjust the system clock. #minsources 2# 指定 NTP 客戶端地址,以允許或拒絕連接到扮演時(shí)鐘服務(wù)器的機(jī)器 # Allow NTP client access from local network. allow 172.168.18.0/24# Serve time even if not synchronized to a time source. #local stratum 10# 指定包含 NTP 身份驗(yàn)證密鑰的文件。 # Specify file containing keys for NTP authentication. #keyfile /etc/chrony.keys# 指定日志文件的目錄。 # Specify directory for log files. logdir /var/log/chrony# 選擇日志文件要記錄的信息。 # Select which information is logged. #log measurements statistics tracking# 查看時(shí)間同步狀態(tài) timedatectl status # 開啟網(wǎng)絡(luò)時(shí)間同步 timedatectl set-ntp true#客戶端配置,chrony.conf 修改兩處 server 192.168.8.5 iburst allow 192.168.8.5systemctl enable chronyd systemctl restart chronyd# 查看時(shí)間同步狀態(tài) timedatectl status # 開啟網(wǎng)絡(luò)時(shí)間同步 timedatectl set-ntp true# 查看 ntp_servers chronyc sources -v# 查看 ntp_servers 狀態(tài) chronyc sourcestats -v# 查看 ntp_servers 是否在線 chronyc activity -v# 查看 ntp 詳細(xì)信息 chronyc tracking -v # 查看日期時(shí)間、時(shí)區(qū)及 NTP 狀態(tài) timedatectl# 查看時(shí)區(qū)列表 timedatectl list-timezones timedatectl list-timezones | grep -E "Asia/S.*"# 修改時(shí)區(qū) timedatectl set-timezone Asia/Shanghai# 修改日期時(shí)間(可以只修改其中一個(gè)) timedatectl set-time "2019-09-19 15:50:20"# 開啟 NTP timedatectl set-ntp true/flase//Linux swap分區(qū)會(huì)對(duì)Doris造成嚴(yán)重的性能問題,安裝前需要禁用swap分區(qū) sudo swapoff -a //立刻生效 # 啟用命令 sudo swapon -a #永久生效 sudo mount -n -o remount,rw / vi /etc/fstab //在swap分區(qū)這行前加 # 禁用掉 reboot注意:對(duì)于JDK,2019年4月16日當(dāng)天,Oracle發(fā)布了Oracle JDK的8u211和8u212兩個(gè)版本(屬于JDK8系列),并從這兩個(gè)版本開始將JDK的授權(quán)許可從BCL換成了OTN!也就是從這兩個(gè)版本開始商用收費(fèi)了!
2)軟件下載安裝
軟件下載地址:https://doris.apache.org/zh-CN/downloads/downloads.html,目前最新版為1.0.0;
1》單機(jī)部署:
wget https://dist.apache.org/repos/dist/release/incubator/doris/1.0/1.0.0-incubating/apache-doris-1.0.0-incubating-bin.tar.gztar -zxvf apache-doris-1.0.0-incubating-bin.tar.gz mv apache-doris-1.0.0-incubating-bin /opt/doris cd /opt/doris## 編輯配置前端配置文件,即 FE-Config vi fe/conf/fe.conf # Uncomment priority_networks and modify parameters priority_networks = 127.0.0.0/24 # save and exit## 配置后端,即BE vi be/conf/be.conf # Uncomment priority_networks and modify parameters priority_networks = 127.0.0.0/24 # save and exit#啟動(dòng) start_fe.sh --daemon start_be.sh --daemon2》集群部署:
| Hadoop-master | 172.16.18.2 | FE-Leader+BE+broke+FE |
| Hadoop-slave1 | 172.16.18.3 | BE+FE-Flower+broke |
| Hadoop-slave2 | 172.16.18.4 | FE-Observer+broke |
注意: FE 節(jié)點(diǎn)數(shù)據(jù)至少為1(1 個(gè) Follower)。當(dāng)部署 1 個(gè) Follower 和 1 個(gè) Observer 時(shí),可以實(shí)現(xiàn)讀高可用。當(dāng)部署 3 個(gè) Follower 時(shí),可以實(shí)現(xiàn)讀寫高可用(HA)。Follower 的數(shù)量必須為奇數(shù),Observer 數(shù)量隨意。一個(gè)機(jī)器上只能部署一個(gè) FE ,因?yàn)?strong>所有 FE 節(jié)點(diǎn)的 http_port 需要相同,可以部署多個(gè) BE 或者 FE + BE 。
FE 集群從 Follower 中自動(dòng)選出 Master 節(jié)點(diǎn),所有更改狀態(tài)操作都由 Master 節(jié)點(diǎn)執(zhí)行, 從 FE 的 Master 節(jié)點(diǎn)可以讀到最新的狀態(tài)。更改操作可以從非 Master 節(jié)點(diǎn)發(fā)起,繼而轉(zhuǎn)發(fā)給 Master 節(jié)點(diǎn)執(zhí)行, 非 Master 節(jié)點(diǎn)記錄最近一次更改操作在復(fù)制日志中的 LSN ,讀操作可以直接在非 Master 節(jié)點(diǎn)上執(zhí)行,但需要等待非 Master 節(jié)點(diǎn)的狀態(tài)已經(jīng)同步到最近一次更改操作的 LSN,因此讀寫非 Master 節(jié)點(diǎn)滿足順序一致性。
Observer 節(jié)點(diǎn)能夠增加FE集群的讀負(fù)載能力,時(shí)效性要求放寬的非緊要用戶可以讀 Observer 節(jié)點(diǎn)。FE 節(jié)點(diǎn)之間的時(shí)鐘相差不能超過5s, 使用 NTP 協(xié)議校準(zhǔn)時(shí)間。Broker的節(jié)點(diǎn)上提前裝置JDK環(huán)境,版本最低值1.8 及以上。
生產(chǎn)環(huán)境可使用3臺(tái)FE+7臺(tái)BE組成,3臺(tái)FE組成HA,用戶可以在多個(gè) FE 之上部署負(fù)載均衡層來實(shí)現(xiàn) Doris 的高可用。而BE計(jì)算能力不足時(shí),隨時(shí)擴(kuò)展BE即可。下表是一個(gè)網(wǎng)絡(luò)示例:
1> FE前端部署
下載源碼包,解壓,將源碼編譯生成的 output下的fe文件夾拷貝到 FE的節(jié)點(diǎn)指定部署路徑下并進(jìn)入該目錄其中,meta_dir目錄是Metadata存儲(chǔ)目錄;默認(rèn)值為 ${DORIS_HOME}/doris-meta。該目錄需要手動(dòng)創(chuàng)建。生產(chǎn)環(huán)境強(qiáng)烈建議單獨(dú)指定目錄,不要放在Doris安裝目錄下,最好是單獨(dú)的磁盤下。
#源碼包下載,需要編譯 wget https://www.apache.org/dyn/closer.cgi/incubator/doris/1.0/1.0.0-incubating/apache-doris-1.0.0-incubating-src.tar.gz#sudo yum groupinstall 'Development Tools' && sudo yum install maven cmake byacc flex automake libtool bison binutils-devel zip unzip ncurses-devel curl git wget python2 glibc-static libstdc++-static java-1.8.0-openjdk sudo yum install centos-release-scl sudo yum install devtoolset-10 scl enable devtoolset-10 bash#如果當(dāng)前倉(cāng)庫(kù)沒有提供devtoolset-10 可以添加如下repo 使用oracle 提供 package [ol7_software_collections] name=Software Collection packages for Oracle Linux 7 ($basearch) baseurl=http://yum.oracle.com/repo/OracleLinux/OL7/SoftwareCollections/$basearch/ gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle gpgcheck=1 enabled=1cat /proc/cpuinfo | grep avx2 //編譯之前先檢查是否支持avx2指令,如不支持需要加 USE_AVX2=0 #編譯,編譯完成后,產(chǎn)出文件在 output/ 目錄中 sh build.sh USE_AVX2=0 sh build.sh#二進(jìn)制包,362M大小 wget https://www.apache.org/dyn/closer.cgi/incubator/doris/1.0/1.0.0-incubating/apache-doris-1.0.0-incubating-bin.tar.gztar -zxvf apache-doris-1.0.0-incubating-bin.tar.gz -C /opt/app/mkdir /opt/app/doris-metavim conf/fe.conf //修改如下meta_dir = /opt/app/doris-meta#或者 grep -vE "^$|^#" /opt/app/apache-doris-1.0.0/fe/conf/fe.conf > /opt/app/apache-doris-1.0.0/fe/conf/fe.conf //修改配置如下LOG_DIR = ${DORIS_HOME}/log meta_dir = /opt/app/doris-meta DATE = `date +%Y%m%d-%H%M%S` JAVA_OPTS="-Xmx4096m -XX:+UseMembar -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:SoftRefLRUPolicyMSPerMB=0 -Xloggc:$DORIS_HOME/log/fe.gc.log.$DATE"JAVA_OPTS_FOR_JDK_9="-Xmx4096m -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:+CMSClassUnloadingEnabled -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:SoftRefLRUPolicyMSPerMB=0 -Xlog:gc*:$DORIS_HOME/log/fe.gc.log.$DATE:time" sys_log_level = INFO enable_http_server_v2 = true http_port = 8030 rpc_port = 9020 query_port = 9030 edit_log_port = 9010 mysql_service_nio_enabled = true priority_networks = 172.16.18.0/24 //是 FE 和 BE 都有一個(gè)配置,其主要目的是在多網(wǎng)卡的情況下,協(xié)助 FE 或 BE 識(shí)別自身 ip 地址。priority_network 采用 CIDR 表示法#完成后,啟動(dòng)FE,FE后臺(tái)執(zhí)行 sh bin/start_fe.sh --daemon#修改第一臺(tái)fe節(jié)點(diǎn)為helper節(jié)點(diǎn) bin/start_fe.sh --helper 172.16.18.2:9010 --daemon //FE集群實(shí)例首次啟動(dòng),必需使用--helper參數(shù),不然后續(xù)加入集群不成功#擴(kuò)容FE節(jié)點(diǎn),可以將新節(jié)點(diǎn)添加為follower mysql -h 127.0.0.1 -P 9030 -uroot -p > ALTER SYSTEM ADD FOLLOWER "172.16.18.3:9010"; > ALTER SYSTEM ADD OBSERVER "172.16.18.4:9010"; > SHOW FRONTENDS;將上述配置好的FE配置文件,復(fù)制到其他FE實(shí)例的主機(jī)上,分別啟動(dòng)FE。FE 進(jìn)程啟動(dòng)后,會(huì)首先加載元數(shù)據(jù),根據(jù) FE 角色的不同,在日志中會(huì)看到 transfer from UNKNOWN to MASTER/FOLLOWER/OBSERVER。最終會(huì)看到 thrift server started 日志,并且可以通過 mysql 客戶端連接到 FE,則表示 FE 啟動(dòng)成功。FE 節(jié)點(diǎn)首次啟動(dòng)時(shí),需要指定現(xiàn)有集群中的一個(gè)節(jié)點(diǎn)作為 helper 節(jié)點(diǎn),從該節(jié)點(diǎn)獲得集群的所有 FE 節(jié)點(diǎn)的配置信息,才能建立通信連接,因此首次啟動(dòng)需要指定 --helper 參數(shù)。
3》部署B(yǎng)E:
BE配置文件中,主要是配置項(xiàng) storage_root_path:數(shù)據(jù)存放目錄。默認(rèn)在be/storage下,需要手動(dòng)創(chuàng)建該目錄。多個(gè)路徑之間使用英文狀態(tài)的分號(hào) ; 分隔(最后一個(gè)目錄后不要加 ;)。可以通過路徑區(qū)別存儲(chǔ)目錄的介質(zhì),HDD或SSD。可以添加容量限制在每個(gè)路徑的末尾,通過英文狀態(tài)逗號(hào),隔開。示例:
配置1:storage_root_path=/home/disk1/doris.HDD,50;/home/disk2/doris.SSD,10;/home/disk2/doris
說明:
/home/disk1/doris.HDD,50,表示存儲(chǔ)限制為50GB,HDD;
/home/disk2/doris.SSD,10,存儲(chǔ)限制為10GB,SSD;
/home/disk2/doris,存儲(chǔ)限制為磁盤最大容量,默認(rèn)為HDD
配置2:不論HDD磁盤目錄還是SSD磁盤目錄,都無需添加后綴,而用storage_root_path參數(shù)里指定medium
storage_root_path=/home/disk1/doris,medium:hdd,capacity:50;/home/disk2/doris,medium:ssd,capacity:50
說明:
/home/disk1/doris,medium:hdd,capacity:10,表示存儲(chǔ)限制為10GB, HDD;
/home/disk2/doris,medium:ssd,capacity:50,表示存儲(chǔ)限制為50GB, SSD;
注: BE 的第一次啟動(dòng),或者該 BE 尚未加入任何集群,則 BE 日志會(huì)定期滾動(dòng) waiting to receive first heartbeat from frontend 字樣。表示 BE 還未通過 FE 的心跳收到 Master 的地址,正在被動(dòng)等待。這種錯(cuò)誤日志,在 FE 中 ADD BACKEND 并發(fā)送心跳后,就會(huì)消失。如果在接到心跳后,又重復(fù)出現(xiàn) master client, get client from cache failed.host: , port: 0, code: 7 字樣,說明 FE 成功連接了 BE,但 BE 無法主動(dòng)連接 FE。可能需要檢查 BE 到 FE 的 rpc_port 的連通性。當(dāng)BE 已經(jīng)被加入集群,日志中應(yīng)該每隔 5 秒滾動(dòng)來自 FE 的心跳日志:get heartbeat, host: xx.xx.xx.xx, port: 9020, cluster id: xxxxxx,表示心跳正常。其次,日志中應(yīng)該每隔 10 秒滾動(dòng) finish report task success. return code: 0 的字樣,表示 BE 向 FE 的通信正常。同時(shí),如果有數(shù)據(jù)查詢,應(yīng)該能看到不停滾動(dòng)的日志,并且有 execute time is xxx 日志,表示 BE 啟動(dòng)成功,并且查詢正常。
4》FS_Broker 部署
Broker 以插件的形式,獨(dú)立于 Doris 部署。如果需要從第三方存儲(chǔ)系統(tǒng)導(dǎo)入數(shù)據(jù),需要部署相應(yīng)的 Broker,默認(rèn)提供了讀取 HDFS ;fs_broker 是無狀態(tài)的,建議每一個(gè) FE 和 BE 節(jié)點(diǎn)都部署一個(gè) Broker。
1、在相應(yīng) broker/conf/ 目錄下對(duì)應(yīng)的配置文件中,可以修改相應(yīng)配置;
2、啟動(dòng):bin/start_broker.sh --daemon
3、添加 Broker:要讓 Doris 的 FE 和 BE 知道 Broker 在哪些節(jié)點(diǎn)上,通過 sql 命令添加 Broker 節(jié)點(diǎn)列表
4、mysql -h 127.0.0.1 -P 9030 -uroot //連接FE,其中broker_ipc_port 在 Broker 配置文件中conf/apache_hdfs_broker.conf配置的
ALTER SYSTEM ADD BROKER broker_name “broker_host1:broker_ipc_port1”,“broker_host2:broker_ipc_port2”,…;
SHOW PROC “/brokers”; //查看 Broker 狀態(tài)
示例:使用 load broker 從 hdfs 導(dǎo)入數(shù)據(jù)至 doris(網(wǎng)絡(luò)示例)
> create database example_db; > CREATE TABLE example_db.table_hash ( k1 BOOLEAN, k2 TINYINT, k3 DECIMAL(10, 2) DEFAULT "10.5", v1 CHAR(10) REPLACE, v2 INT SUM ) ENGINE=olap AGGREGATE KEY(k1, k2, k3) COMMENT "my first doris table" DISTRIBUTED BY HASH(k1) BUCKETS 32;#在hdfs上創(chuàng)建一個(gè)txt文件 cat hytest.txt 0,100,9,xxx 1,200,8,sss 0,300,7,bbbhdfs dfs -put hytest.txt hdfs://172.16.18.201:8020/tmp/hy/#使用load broker導(dǎo)入數(shù)據(jù) > LOAD LABEL example_db.label_filter (DATA INFILE("hdfs://10.202.77.201:8020/hive/warehouse/sfbdp/TMP/tmp_test_etl/emp_dept")INTO TABLE `table_hash`COLUMNS TERMINATED BY ","(k1,k2,v1,v2) ) with broker 'my_broker' ("username"="root","password"="" );#查看導(dǎo)入情況 > SHOW LOAD FROM example_db order by createtime desc limit 1\G;3)驗(yàn)證
FE:瀏覽器輸入http://fe_host:fe_http_port/api/bootstrap //返回 {“status”:“OK”,“msg”:“Success”}即表啟動(dòng)成功
BE:瀏覽器輸入http://be_host:be_http_port/api/health //返回:{“status”: “OK”,“msg”: “To Be added”},則表示啟動(dòng)成功
Doris Web UI:http://FE_IP:FE_HTTP_PORT(默認(rèn)8030),賬號(hào)root,密碼為空
配置FE的參數(shù),打開web端頁面:
驗(yàn)證:http://doris_fe:8030/rest/v1/system?path=//backends
4)使用mysql-client注冊(cè)BE到FE
Doris 使用 MySQL 協(xié)議進(jìn)行通信,用戶可以通過 MySQL Client 或 MySQL JDBC 連接到 Doris 集群。選擇 MySQL 客戶端版本時(shí),建議使用 5.1 之后的版本,因?yàn)?5.1 之前不支持超過 16 個(gè)字符的用戶名。Doris SQL 語法基本遵循 MySQL 語法。BE 節(jié)點(diǎn)需要先在 FE 中添加,才可加入集群。注冊(cè)執(zhí)行以下命令:
yum install -y mysql #./mysql-client -h fe_host -P query_port -uroot mysql -h 127.0.0.1 -P 9030 -uroot > SHOW FRONTENDS; //查看當(dāng)前集群的FE節(jié)點(diǎn) # Register BE 添加BE節(jié)點(diǎn),執(zhí)行:ALTER SYSTEM ADD BACKEND "be_host:heartbeat-service_port"; > ALTER SYSTEM ADD BACKEND "127.0.0.1:9050"; > #添加Broker節(jié)點(diǎn) ALTER SYSTEM ADD BROKER broker_name "host:port"; > > ALTER SYSTEM ADD BROKER my_broker "127.0.0.1:8000";#訪問FE mysql -h FE-host -P 9030 -u username -p password > set enable_profile=true; //啟用FE report功能 > SHOW PROC '/backends'; //查看 BE 運(yùn)行情況 > SHOW BACKENDS; //查看當(dāng)前集群的BE節(jié)點(diǎn) > SHOW BROKER; //查看當(dāng)前集群的Broker節(jié)點(diǎn)更多sql使用參看:查詢執(zhí)行統(tǒng)計(jì);
注意:BE注冊(cè)成功FE后,如果心跳正常,BE 的日志中會(huì)顯示 get heartbeat, host: xx.xx.xx.xx, port: 9020, cluster id: xxxxxx。如果心跳失敗,在 FE 的日志中會(huì)出現(xiàn) backend[10001] got Exception: org.apache.thrift.transport.TTransportException 類似的字樣,或者其他 thrift 通信異常日志,表示 FE 向 10001 這個(gè) BE 的心跳失敗。這里需要檢查 FE 向 BE host 的心跳端口的連通性。如果 BE 向 FE 的通信正常,則 BE 日志中會(huì)顯示 finish report task success. return code: 0 的字樣。否則會(huì)出現(xiàn) master client, get client from cache failed 的字樣。這種情況下,需要檢查 BE 向 FE 的 rpc_port 的連通性。
5)FE負(fù)載均衡
1>
2>ProxySQL負(fù)載部署
四、配置文件說明
五、應(yīng)用案例借鑒
5.1、Doris 在 Elasticsearch 的應(yīng)用
我們知道,在處理大量數(shù)據(jù)時(shí),全文查找會(huì)用到ES,然ES 的優(yōu)點(diǎn)是索引,可支持多列索引,甚至可支持全文語義索引(如 term,match,fuzzy 等);然而其缺點(diǎn)是沒有分布式計(jì)算引擎,不支持 join 等操作;對(duì)此,Palo 提供了豐富的 SQL 計(jì)算能力,以及分布式查詢能力;然而其索引性能較低,不支持全文索引。而Doris 可分別借鑒 ES 和 Palo 的長(zhǎng)處,支持 Elasticsearch 多表 Join 操作,同時(shí)引入 Elasticsearch 的語義搜索功能,擴(kuò)充了 Doris 的查詢能力。
示例:
1)建立一張 ES 的外部表。
2)在 ES 外部表中導(dǎo)入一些數(shù)據(jù)
3)使用和 ES 一樣的搜索語句,進(jìn)行全文檢索查詢;類似于下圖這樣的搜索語句,在 SQL 中比較難以表達(dá),但是在 ES 中較容易實(shí)現(xiàn)。
5.2、與Kafka 消息隊(duì)列配合使用
1)Doris 內(nèi)部支持訂閱 Kafka 數(shù)據(jù)流,實(shí)現(xiàn)直接對(duì)接 Kafka,創(chuàng)建如下sql:
2)用戶數(shù)據(jù)源經(jīng) Kafka 消息隊(duì)列收集后,可以依次進(jìn)入到 Doris 中,通過 Doris 做報(bào)表展示和決策分析等工作。
3)方案優(yōu)點(diǎn)
無需額外組件,用戶可直接通過命令實(shí)現(xiàn) Kafka 消息訂閱。
精確傳輸,秒級(jí)延遲。
Doris 可自動(dòng)感知 Kafka 中 partition 變化,合理調(diào)度并發(fā)導(dǎo)入。
在數(shù)據(jù)導(dǎo)入這一過程中,支持對(duì) Kafka 原始數(shù)據(jù)做二次處理(如轉(zhuǎn)換,過濾等)。
六、FAQ
6.1、FE啟動(dòng)報(bào)錯(cuò):java.lang.IllegalArgumentException: type mismatch
-Xmx8192m -XX:+UseMembar -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:SoftRefLRUPolicyMSPerMB=0 -Xloggc:/home/doris/fe/log/fe.gc.log.20220623-184807 Thu Jun 23 18:48:07 CST 2022 java.lang.IllegalArgumentException: type mismatchat org.apache.doris.common.ConfigBase.isBoolean(ConfigBase.java:289)at org.apache.doris.common.ConfigBase.setConfigField(ConfigBase.java:233)at org.apache.doris.common.ConfigBase.setFields(ConfigBase.java:201)at org.apache.doris.common.ConfigBase.initConf(ConfigBase.java:116)at org.apache.doris.common.ConfigBase.init(ConfigBase.java:94)at org.apache.doris.PaloFe.start(PaloFe.java:88)at org.apache.doris.PaloFe.main(PaloFe.java:63)啟動(dòng)腳本如下所示:
curdir=$(dirname "$0") #獲取當(dāng)前啟動(dòng)腳本的路徑 curdir=$(cd "$curdir"pwd )OPTS=$(getopt \-n $0 \-o '' \-l 'daemon' \-l 'helper:' \-- "$@")eval set -- "$OPTS"RUN_DAEMON=0 HELPER= while true; docase "$1" in--daemon)RUN_DAEMON=1shift;;--helper)HELPER=$2shift 2;;--)shiftbreak;;*)ehco "Internal error"exit 1;;esac doneexport DORIS_HOME=$(cd "$curdir/.."pwd )# export env variables from fe.conf # # JAVA_OPTS # LOG_DIR # PID_DIR export JAVA_OPTS="-Xmx1024m" export LOG_DIR="$DORIS_HOME/log" export PID_DIR=$(cd "$curdir"pwd )while read line; doenvline=$(echo $line | sed 's/[[:blank:]]*=[[:blank:]]*/=/g' | sed 's/^[[:blank:]]*//g' | egrep "^[[:upper:]]([[:upper:]]|_|[[:digit:]])*=")envline=$(eval "echo $envline")if [[ $envline == *"="* ]]; theneval 'export "$envline"'fi done < $DORIS_HOME/conf/fe.confif [ -e $DORIS_HOME/bin/palo_env.sh ]; thensource $DORIS_HOME/bin/palo_env.sh fiif [ -z "$JAVA_HOME" ]; thenJAVA=$(which java) elseJAVA="$JAVA_HOME/bin/java" fiif [ ! -x "$JAVA" ]; thenecho "The JAVA_HOME environment variable is not defined correctly"echo "This environment variable is needed to run this program"echo "NB: JAVA_HOME should point to a JDK not a JRE"exit 1 fi# get jdk version, return version as an Integer. # 1.8 => 8, 13.0 => 13 jdk_version() {local resultlocal IFS=$'\n'# remove \r for Cygwinlocal lines=$("$JAVA" -Xms32M -Xmx32M -version 2>&1 | tr '\r' '\n')for line in $lines; doif [[ (-z $result) && ($line = *"version \""*) ]]; thenlocal ver=$(echo $line | sed -e 's/.*version "\(.*\)"\(.*\)/\1/; 1q')# on macOS, sed doesn't support '?'if [[ $ver = "1."* ]]; thenresult=$(echo $ver | sed -e 's/1\.\([0-9]*\)\(.*\)/\1/; 1q')elseresult=$(echo $ver | sed -e 's/\([0-9]*\)\(.*\)/\1/; 1q')fifidoneecho "$result" }# need check and create if the log directory existed before outing message to the log file. if [ ! -d $LOG_DIR ]; thenmkdir -p $LOG_DIR fi# check java version and choose correct JAVA_OPTS java_version=$(jdk_version) final_java_opt=$JAVA_OPTS if [ $java_version -gt 8 ]; thenif [ -z "$JAVA_OPTS_FOR_JDK_9" ]; thenecho "JAVA_OPTS_FOR_JDK_9 is not set in fe.conf" >> $LOG_DIR/fe.outexit 1fifinal_java_opt=$JAVA_OPTS_FOR_JDK_9 fi echo "using java version $java_version" >> $LOG_DIR/fe.out echo $final_java_opt >> $LOG_DIR/fe.out # add libs to CLASSPATH for f in $DORIS_HOME/lib/*.jar; doCLASSPATH=$f:${CLASSPATH} done export CLASSPATH=${CLASSPATH}:${DORIS_HOME}/libpidfile=$PID_DIR/fe.pidif [ -f $pidfile ]; thenif kill -0 $(cat $pidfile) > /dev/null 2>&1; thenecho Frontend running as process $(cat $pidfile). Stop it first.exit 1fi fiif [ ! -f /bin/limit ]; thenLIMIT= elseLIMIT=/bin/limit fiecho $(date) >> $LOG_DIR/fe.outif [ x"$HELPER" != x"" ]; then# change it to '-helper' to be compatible with code in FrontendHELPER="-helper $HELPER" fiif [ ${RUN_DAEMON} -eq 1 ]; thennohup $LIMIT $JAVA $final_java_opt org.apache.doris.PaloFe ${HELPER} "$@" >> $LOG_DIR/fe.out 2>&1 < /dev/null & else$LIMIT $JAVA $final_java_opt org.apache.doris.PaloFe ${HELPER} "$@" < /dev/null fiecho $! > $pidfile調(diào)試如下:
從上圖看,問題出現(xiàn)在腳本的166-167行,如下所示:
發(fā)現(xiàn)之前調(diào)試,未加–daemon參數(shù),重新調(diào)試:
查看:tail -200f /home/doris/fe/log/fe.gc.log.20220623-192315
gcc --version //驗(yàn)證gcc版本,輸出如下
gcc (GCC) 10.2.0
可能原因: Doris會(huì)檢查編譯和運(yùn)行的Java版本是否兼容,如果不兼容,會(huì)拋出Java版本不匹配異常信息并終止啟動(dòng)。
java -version //默認(rèn)的java版本 java version "1.8.0_333" Java(TM) SE Runtime Environment (build 1.8.0_333-b02) Java HotSpot(TM) 64-Bit Server VM (build 25.333-b02, mixed mode)經(jīng)最后最小化調(diào)試發(fā)現(xiàn),是配置文件dynamic_partition_enable = ture導(dǎo)致的上述錯(cuò)誤。應(yīng)該是true,修正dynamic_partition_enable = true(寫入永久生效)后程序啟動(dòng)正常。查詢官網(wǎng),該配置項(xiàng)為FE master獨(dú)有,且默認(rèn)是true,即開啟狀態(tài),而是FE啟動(dòng)后通過 ADMIN SHOW FRONTEND CONFIG;來查看當(dāng)前值。然后可以連接任意FE,執(zhí)行如下命令修改配置:
ADMIN SET FRONTEND CONFIG ("dynamic_partition_enable" = "true"); #驗(yàn)證 set forward_to_master = true; ADMIN SHOW FRONTEND CONFIG;#重新啟動(dòng)FE,注意helper后的ip不能是本機(jī) sh ./bin/start_fe.sh --helper 172.18.1.74:9010 --daemon #啟動(dòng)驗(yàn)證 jps 16608 PaloFe 17694 Jpsnetstat -antp|grep 9030 tcp6 0 0 :::9030 :::* LISTEN 16608/java /usr/local/mysql/bin/mysql -h 172.18.1.38 -P 9030 -uroot -p Enter password:總結(jié)
以上是生活随笔為你收集整理的大数据之实时数据分析之Apache Doris数据库的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机网络原理-计算题汇总
- 下一篇: AI 之 OpenCvSharp 安卓手