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