hadoop生態(tài)圈列式存儲(chǔ)系統(tǒng)--kudu介紹及安裝配置
介紹Kudu 是一個(gè)針對(duì) Apache Hadoop 平臺(tái)而開(kāi)發(fā)的列式存儲(chǔ)管理器。Kudu 共享 Hadoop 生態(tài)系統(tǒng)應(yīng)用的常見(jiàn)技術(shù)特性: 它在 commodity hardware(商品硬件)上運(yùn)行,horizontally scalable(水平可擴(kuò)展),并支持 highly available(高可用)性操作。此外,Kudu 還有更多優(yōu)化的特點(diǎn):
- OLAP 工作的快速處理。
- 與 MapReduce,Spark 和其他 Hadoop 生態(tài)系統(tǒng)組件集成。
- 與 Apache Impala(incubating)緊密集成,使其與 Apache Parquet 一起使用 HDFS 成為一個(gè)很好的可變的替代方案。
- 強(qiáng)大而靈活的一致性模型,允許您根據(jù)每個(gè) per-request(請(qǐng)求選擇)一致性要求,包括 strict-- serializable(嚴(yán)格可序列化)一致性的選項(xiàng)。
- 針對(duì)同時(shí)運(yùn)行順序和隨機(jī)工作負(fù)載的情況性能很好。
- 使用 Cloudera Manager 輕松維護(hù)和管理。
- High availability(高可用性)。Tablet server 和 Master 使用 Raft Consensus Algorithm 來(lái)保證節(jié)點(diǎn)的 -- 高可用,確保只要有一半以上的副本可用,該 tablet 便可用于讀寫。例如,如果 3 個(gè)副本中有 2 個(gè)或 5 個(gè)副本中的 3 個(gè)可用,則該 tablet 可用。即使在 leader tablet 出現(xiàn)故障的情況下,讀取功能也可以通過(guò) read-only(只讀的)follower tablets 來(lái)進(jìn)行服務(wù)。
- 結(jié)構(gòu)化數(shù)據(jù)模型。
通過(guò)結(jié)合這些所有的特性,Kudu 的目標(biāo)是支持應(yīng)用家庭中那些難以在當(dāng)前Hadoop 存儲(chǔ)技術(shù)中實(shí)現(xiàn)的應(yīng)用。Kudu 常見(jiàn)的幾個(gè)應(yīng)用場(chǎng)景:
- 實(shí)時(shí)更新的應(yīng)用。剛剛到達(dá)的數(shù)據(jù)就馬上要被終端用戶使用訪問(wèn)到。
- 時(shí)間序列相關(guān)的應(yīng)用,需要同時(shí)支持:
- 根據(jù)海量歷史數(shù)據(jù)查詢。
- 必須非??斓胤祷仃P(guān)于單個(gè)實(shí)體的細(xì)粒度查詢。
- 實(shí)時(shí)預(yù)測(cè)模型的應(yīng)用,支持根據(jù)所有歷史數(shù)據(jù)周期地更新模型。
- 有關(guān)這些和其他方案的更多信息,請(qǐng)參閱 Example Use Cases。
Kudu-Impala 集成特性
CREATE/ALTER/DROP TABLE
Impala 支持使用 Kudu 作為持久層來(lái) creating(創(chuàng)建),altering(修改)和 dropping(刪除)表。這些表遵循與 Impala 中其他表格相同的 Internal / external(內(nèi)部 / 外部)方法,允許靈活的數(shù)據(jù)采集和查詢。
INSERT
數(shù)據(jù)可以使用與那些使用 HDFS 或 HBase 持久性的任何其他 Impala 表相同的語(yǔ)法插入 Impala 中的 Kudu 表。
UPDATE / DELETE
Impala 支持 UPDATE 和 DELETE SQL 命令逐行或批處理修改 Kudu 表中的已有的數(shù)據(jù)。選擇 SQL 命令的語(yǔ)法與現(xiàn)有標(biāo)準(zhǔn)盡可能兼容。除了簡(jiǎn)單 DELETE 或 UPDATE 命令之外,還可以 FROM 在子查詢中指定帶有子句的復(fù)雜連接。
Flexible Partitioning(靈活分區(qū))
與 Hive 中的表分區(qū)類似,Kudu 允許您通過(guò) hash 或范圍動(dòng)態(tài)預(yù)分割成預(yù)定義數(shù)量的 tablets,以便在集群中均勻分布寫入和查詢。您可以通過(guò)任意數(shù)量的 primary key(主鍵)列,任意數(shù)量的 hashes 和可選的 list of split rows 來(lái)進(jìn)行分區(qū)。參見(jiàn)模式設(shè)計(jì)。
Parallel Scan(并行掃描)
為了在現(xiàn)代硬件上實(shí)現(xiàn)***的性能,Impala 使用的 Kudu 客戶端可以跨多個(gè) tablets 掃描。
High-efficiency queries(高效查詢)
在可能的情況下,Impala 將謂詞評(píng)估下推到 Kudu,以便使謂詞評(píng)估為盡可能接近數(shù)據(jù)。在許多任務(wù)中,查詢性能與 Parquet 相當(dāng)。
有關(guān)使用 Impala 查詢存儲(chǔ)在 Kudu 中的數(shù)據(jù)的更多詳細(xì)信息,請(qǐng)參閱 Impala 文檔。
概念和術(shù)語(yǔ)
Columnar Data Store(列式數(shù)據(jù)存儲(chǔ))
Kudu 是一個(gè) columnar data store(列式數(shù)據(jù)存儲(chǔ))。列式數(shù)據(jù)存儲(chǔ)在強(qiáng)類型列中。由于幾個(gè)原因,通過(guò)適當(dāng)?shù)脑O(shè)計(jì),Kudu 對(duì) analytical(分析)或 warehousing(數(shù)據(jù)倉(cāng)庫(kù))工作會(huì)非常出色。
Read Efficiency(高效讀取)
對(duì)于分析查詢,允許讀取單個(gè)列或該列的一部分同時(shí)忽略其他列,這意味著您可以在磁盤上讀取更少塊來(lái)完成查詢。與基于行的存儲(chǔ)相比,即使只返回幾列的值,仍需要讀取整行數(shù)據(jù)。
Data Compression(數(shù)據(jù)壓縮)
由于給定的列只包含一種類型的數(shù)據(jù),基于模式的壓縮比壓縮混合數(shù)據(jù)類型(在基于行的解決方案中使用)時(shí)更有效幾個(gè)數(shù)量級(jí)。結(jié)合從列讀取數(shù)據(jù)的效率,壓縮允許您在從磁盤讀取更少的塊時(shí)完成查詢。請(qǐng)參閱 數(shù)據(jù)壓縮
Table(表)
一張 table 是數(shù)據(jù)存儲(chǔ)在 Kudu 的位置。表具有 schema 和全局有序的 primary key(主鍵)。table 被分成稱為 tablets 的 segments。
Tablet
一個(gè) tablet 是一張 table 連續(xù)的 segment,與其它數(shù)據(jù)存儲(chǔ)引擎或關(guān)系型數(shù)據(jù)庫(kù)中的 partition(分區(qū))相似。給定的 tablet 冗余到多個(gè) tablet 服務(wù)器上,并且在任何給定的時(shí)間點(diǎn),其中一個(gè)副本被認(rèn)為是 leader tablet。任何副本都可以對(duì)讀取進(jìn)行服務(wù),并且寫入時(shí)需要在為 tablet 服務(wù)的一組 tablet server之間達(dá)成一致性。
Tablet Server
一個(gè) tablet server 存儲(chǔ) tablet 和為 tablet 向 client 提供服務(wù)。對(duì)于給定的 tablet,一個(gè) tablet server 充當(dāng) leader,其他 tablet server 充當(dāng)該 tablet 的 follower 副本。只有 leader 服務(wù)寫請(qǐng)求,然而 leader 或 followers 為每個(gè)服務(wù)提供讀請(qǐng)求。leader 使用 Raft Consensus Algorithm 來(lái)進(jìn)行選舉 。一個(gè) tablet server 可以服務(wù)多個(gè) tablets ,并且一個(gè) tablet 可以被多個(gè) tablet servers 服務(wù)著。
Master
該 master 保持跟蹤所有的 tablets,tablet servers,Catalog Table 和其它與集群相關(guān)的 metadata。在給定的時(shí)間點(diǎn),只能有一個(gè)起作用的 master(也就是 leader)。如果當(dāng)前的 leader 消失,則選舉出一個(gè)新的 master,使用 Raft Consensus Algorithm 來(lái)進(jìn)行選舉。master 還協(xié)調(diào)客戶端的 metadata operations(元數(shù)據(jù)操作)。例如,當(dāng)創(chuàng)建新表時(shí),客戶端內(nèi)部將請(qǐng)求發(fā)送給 master。 master 將新表的元數(shù)據(jù)寫入 catalog table,并協(xié)調(diào)在 tablet server 上創(chuàng)建 tablet 的過(guò)程。所有 master 的數(shù)據(jù)都存儲(chǔ)在一個(gè) tablet 中,可以復(fù)制到所有其他候選的 master。tablet server 以設(shè)定的間隔向 master 發(fā)出心跳(默認(rèn)值為每秒一次)。
Raft Consensus Algorithm
Kudu 使用 Raft consensus algorithm 作為確保常規(guī) tablet 和 master 數(shù)據(jù)的容錯(cuò)性和一致性的手段。通過(guò) Raft,tablet 的多個(gè)副本選舉出 leader,它負(fù)責(zé)接受以及復(fù)制到 follower 副本的寫入。一旦寫入的數(shù)據(jù)在大多數(shù)副本中持久化后,就會(huì)向客戶確認(rèn)。給定的一組 N 副本(通常為 3 或 5 個(gè))能夠接受最多(N - 1)/2 錯(cuò)誤的副本的寫入。
Catalog Table(目錄表)
catalog table 是 Kudu 的 metadata(元數(shù)據(jù)中)的中心位置。它存儲(chǔ)有關(guān) tables 和 tablets 的信息。該 catalog table(目錄表)可能不會(huì)被直接讀取或?qū)懭?。相反,它只能通過(guò)客戶端 API 中公開(kāi)的元數(shù)據(jù)操作訪問(wèn)。catalog table 存儲(chǔ)兩類元數(shù)據(jù):
- Tables
table schemas, locations, and states(表結(jié)構(gòu),位置 和狀態(tài))
- Tablets
現(xiàn)有 tablet 的列表,每個(gè) tablet 的副本所在哪些 tablet server,tablet 的當(dāng)前狀態(tài)以及開(kāi)始和結(jié)束的 keys(鍵)。
Logical Replication(邏輯復(fù)制)
Kudu 復(fù)制操作,不是磁盤上的數(shù)據(jù)。這被稱為 logical replication(邏輯復(fù)制),而不是 physical replication(物理復(fù)制)。這有幾個(gè)優(yōu)點(diǎn) :
- 雖然 insert(插入)和 update(更新)確實(shí)通過(guò)網(wǎng)絡(luò)傳輸數(shù)據(jù),deletes(刪除)不需要移動(dòng)任何數(shù)據(jù)。delete(刪除)操作被發(fā)送到每個(gè) tablet server,它在本地執(zhí)行刪除。
- 物理操作,如 compaction,不需要通過(guò) Kudu 的網(wǎng)絡(luò)傳輸數(shù)據(jù)。這與使用 HDFS 的存儲(chǔ)系統(tǒng)不同,其中 blocks (塊)需要通過(guò)網(wǎng)絡(luò)傳輸以滿足所需數(shù)量的副本。
- tablet 不需要在同一時(shí)間或相同的時(shí)間表上執(zhí)行壓縮,或者在物理存儲(chǔ)層上保持同步。這會(huì)減少由于壓縮或大量寫入負(fù)載而導(dǎo)致所有 tablet server 同時(shí)遇到高延遲的機(jī)會(huì)。
架構(gòu)概述
下圖顯示了一個(gè)具有三個(gè) master 和多個(gè) tablet server 的 Kudu 集群,每個(gè)服務(wù)器都支持多個(gè) tablet。它說(shuō)明了如何使用 Raft 共識(shí)來(lái)允許 master 和 tablet server 的 leader 和 follow。此外,tablet server 可以成為某些 tablet 的 leader,也可以是其他 tablet 的 follower。leader 以金色顯示,而 follower 則顯示為藍(lán)色。
使用場(chǎng)景
Streaming Input with Near Real Time Availability(具有近實(shí)時(shí)可用性的流輸入)
數(shù)據(jù)分析中的一個(gè)共同挑戰(zhàn)就是新數(shù)據(jù)快速而不斷地到達(dá),同樣的數(shù)據(jù)需要靠近實(shí)時(shí)的讀取,掃描和更新。Kudu 通過(guò)高效的列式掃描提供了快速插入和更新的強(qiáng)大組合,從而在單個(gè)存儲(chǔ)層上實(shí)現(xiàn)了實(shí)時(shí)分析用例。
Time-series application with widely varying access patterns(具有廣泛變化的訪問(wèn)模式的時(shí)間序列應(yīng)用)
time-series(時(shí)間序列)模式是根據(jù)其發(fā)生時(shí)間組織和鍵入數(shù)據(jù)點(diǎn)的模式。這可以用于隨著時(shí)間的推移調(diào)查指標(biāo)的性能,或者根據(jù)過(guò)去的數(shù)據(jù)嘗試預(yù)測(cè)未來(lái)的行為。例如,時(shí)間序列的客戶數(shù)據(jù)可以用于存儲(chǔ)購(gòu)買點(diǎn)擊流歷史并預(yù)測(cè)未來(lái)的購(gòu)買,或由客戶支持代表使用。雖然這些不同類型的分析正在發(fā)生,插入和更換也可能單獨(dú)和批量地發(fā)生,并且立即可用于讀取工作負(fù)載。Kudu 可以用 scalable (可擴(kuò)展)和 efficient (高效的)方式同時(shí)處理所有這些訪問(wèn)模式。由于一些原因,Kudu 非常適合時(shí)間序列的工作負(fù)載。隨著 Kudu 對(duì)基于 hash 的分區(qū)的支持,結(jié)合其對(duì)復(fù)合 row keys(行鍵)的本地支持,將許多服務(wù)器上的表設(shè)置成很簡(jiǎn)單,而不會(huì)在使用范圍分區(qū)時(shí)通常觀察到“hotspotting(熱點(diǎn))”的風(fēng)險(xiǎn)。Kudu 的列式存儲(chǔ)引擎在這種情況下也是有益的,因?yàn)樵S多時(shí)間序列工作負(fù)載只讀取了幾列,而不是整行。 過(guò)去,您可能需要使用多個(gè)數(shù)據(jù)存儲(chǔ)來(lái)處理不同的數(shù)據(jù)訪問(wèn)模式。這種做法增加了應(yīng)用程序和操作的復(fù)雜性,并重復(fù)了數(shù)據(jù),使所需存儲(chǔ)量增加了一倍(或更糟)。Kudu 可以本地和高效地處理所有這些訪問(wèn)模式,而無(wú)需將工作卸載到其他數(shù)據(jù)存儲(chǔ)。
Predictive Modeling(預(yù)測(cè)建模)
數(shù)據(jù)科學(xué)家經(jīng)常從大量數(shù)據(jù)中開(kāi)發(fā)預(yù)測(cè)學(xué)習(xí)模型。模型和數(shù)據(jù)可能需要在學(xué)習(xí)發(fā)生時(shí)或隨著建模情況的變化而經(jīng)常更新或修改。此外,科學(xué)家可能想改變模型中的一個(gè)或多個(gè)因素,看看隨著時(shí)間的推移會(huì)發(fā)生什么。在 HDFS 中更新存儲(chǔ)在文件中的大量數(shù)據(jù)是資源密集型的,因?yàn)槊總€(gè)文件需要被完全重寫。在 Kudu,更新發(fā)生在近乎實(shí)時(shí)。科學(xué)家可以調(diào)整值,重新運(yùn)行查詢,并以秒或分鐘而不是幾小時(shí)或幾天刷新圖形。此外,批處理或增量算法可以隨時(shí)在數(shù)據(jù)上運(yùn)行,具有接近實(shí)時(shí)的結(jié)果。
Combining Data In Kudu With Legacy Systems(結(jié)合 Kudu 與遺留系統(tǒng)的數(shù)據(jù))
公司從多個(gè)來(lái)源生成數(shù)據(jù)并將其存儲(chǔ)在各種系統(tǒng)和格式中。例如,您的一些數(shù)據(jù)可能存儲(chǔ)在 Kudu,一些在傳統(tǒng)的 RDBMS 中,一些在 HDFS 中的文件中。您可以使用 Impala 訪問(wèn)和查詢所有這些源和格式,而無(wú)需更改舊版系統(tǒng)。
安裝前提和準(zhǔn)備硬件:
硬件:
- 一臺(tái)或者多臺(tái)機(jī)器跑kudu-master。建議跑一個(gè)master(無(wú)容錯(cuò)機(jī)制)、三個(gè)master(允許一個(gè)節(jié)點(diǎn)運(yùn)行出錯(cuò))或者五個(gè)master(允許兩個(gè)節(jié)點(diǎn)出錯(cuò))。
- 一臺(tái)或者多臺(tái)機(jī)器跑kudu-tserver。當(dāng)需要使用副本,至少需要三個(gè)節(jié)點(diǎn)運(yùn)行kudu-tserver服務(wù)。
操作系統(tǒng)(主要是linux系統(tǒng),windows系統(tǒng)不支持):
- RHEL 6, RHEL 7, CentOS 6, CentOS 7, Ubuntu 14.04 (Trusty), Ubuntu 16.04 (Xenial), Debian 8 (Jessie), or SLES 12.
- 內(nèi)核和文件系統(tǒng)支持 hole punching 選項(xiàng)。
- ntp服務(wù)。
- xfs or ext4 formatted drives
存儲(chǔ):
- 盡量使用固態(tài)存儲(chǔ),將顯著提高kudu性能。
管理
- 如果你使用的是CDH,需要Cloudera Manager 5.4.3及以上的版本。
環(huán)境說(shuō)明
- os:centos 6.7
- kudu版本:kudu-1.2.0+cdh5.10.0(這里使用的是cdh5.10的kudu,對(duì)應(yīng)版本為1.2,下載地址:http://archive.cloudera.com/kudu/redhat/6/x86_64/kudu/5.10.0/RPMS/x86_64/)
- 組件安排如下:
安裝ntp服務(wù)
- # cat /etc/ntp.conf
- restrict default kod nomodify notrap nopeer noquery #拒絕IPV4用戶
- restrict -6 default kod nomodify notrap nopeer noquery #拒絕ipV6用戶
- restrict 127.0.0.1
- restrict -6 ::1
- restrict 172.31.217.0 mask 255.255.255.0 nomodify notrap #本地網(wǎng)段授權(quán)訪問(wèn)
- server 172.31.217.173 #指定上級(jí)更新服務(wù)器
- server 0.centos.pool.ntp.org
- server 1.centos.pool.ntp.org
- server 2.centos.pool.ntp.org
- server 172.31.217.173 # local clock
- fudge 172.31.217.173 stratum 10
- # /etc/init.d/ntpd start 各個(gè)節(jié)點(diǎn)檢查啟動(dòng)成功,否則啟動(dòng)kudu相關(guān)服務(wù)會(huì)報(bào)錯(cuò)
安裝kudu
安裝kudu-master
- 安裝
- # yum install kudu kudu-master kudu-client0 kudu-client-devel -y
- 基本配置
- # cat /etc/kudu/conf/master.gflagfile
- # Do not modify these two lines. If you wish to change these variables,
- # modify them in /etc/default/kudu-master.
- --fromenv=rpc_bind_addresses
- --fromenv=log_dir
- --fs_wal_dir=/opt/kudu/master
- --fs_data_dirs=/opt/kudu/master
- 設(shè)置權(quán)限
- # mkdir /opt/kudu && chown kudu:kudu /opt/kudu
- 啟動(dòng)
- # /etc/init.d/kudu-master start
安裝kudu-tserver
- 安裝
- # yum install kudu kudu-tserver kudu-client0 kudu-client-devel -y
- 基本配置
- # cat /etc/kudu/conf/tserver.gflagfile
- # Do not modify these two lines. If you wish to change these variables,
- # modify them in /etc/default/kudu-tserver.
- --fromenv=rpc_bind_addresses
- --fromenv=log_dir
- --fs_wal_dir=/opt/kudu/tserver
- --fs_data_dirs=/opt/kudu/tserver
- --tserver_master_addrs=bd-dev-ops-173:7051
設(shè)置權(quán)限
- # mkdir /opt/kudu && chown kudu:kudu /opt/kudu
啟動(dòng)
- # /etc/init.d/kudu-tserver start
圖形界面
通過(guò)master端的web界面觀察運(yùn)行情況:http://172.31.217.173:8051
可以看到所有組件都已安裝完畢了。