Apache Kudu是一個爲了Hadoop系統環境而打造的列存儲管理器,與通常的Hadoop生態環境中的其餘應用同樣,具備能在通用硬件上運行、水平擴展性佳和支持高可用性操做等功能。算法
在Kudu出現以前,Hadoop生態環境中的儲存主要依賴HDFS和HBase,追求高吞吐批處理的用例中使用HDFS,追求低延時隨機讀取用例下用HBase,而Kudu正好能兼顧這二者。shell
Kudu的主要優勢:設計模式
常見的應用場景:api
列數據存儲 Columnar Data Store服務器
Kudu是一種列數據儲存結構,以強類型的列(strong-type column)儲存數據。網絡
高效讀取架構
可選擇單個列或者某個列的一部分來訪問,能夠在知足自己查詢須要的狀態下,選擇最少的磁盤或者存儲塊來訪問,相對於基於行的存儲,更節省訪問資源,更高效。框架
數據比較oop
因爲給定的某一個列當中都是一樣類型的數據,因此對於同一個量級的數據比較時,這種存儲方式比混合類型存儲的更具優點。設計
表Table
同理,一種數據設計模式schema,根據primary key來排序組織。一個表能夠被分到若干個分片中,稱爲tablet。
分片Tablet
一個tablet是指表上一段連續的segment。一個特定的tablet會被複制到多個tablet服務器上,其中一個會被認爲是leader tablet。每個備份tablet均可以支持讀取、寫入請求。
分片服務器 Tablet Server
負責爲客戶端儲存和提供tablets。只有Leader Tablet能夠寫入請求,其餘的tablets只能執行請求。
Master
Master負責追蹤tablets、tablet severs、catalog table和其餘與集羣相關的metadata。另外也爲客戶端協調metadata的操做。
Raft Consensus算法
前文介紹過了
Catalog Table
Kudu的metadata的中心位置,存儲表和tablet的信息,客戶端能夠經過master用客戶端api來訪問。
邏輯複製 Logical Replication
Kudu並是否是在硬盤數據上作複製的,而是採起了邏輯複製的辦法,這有如下一些好處:
隨機寫入效率
在內存中每一個tablet分區維護一個MemRowSet來管理最新更新的數據,當尺寸大於必定大小以後會flush到磁盤上行成DiskRowSet,多個DiskRowSet會在適當的時候作歸併操做。 這些被flush到磁盤的DiskRowSet數據分爲兩種,一種是Base數據,按列式存儲格式存在,一旦生成再也不修改,另外一種是Delta文件,儲存Base中有更新的數據,一個Base文件能夠對應多個Delta文件。
Delta文件的存在使得檢索過程須要額外的開銷,這些Delta文件是根據被更新的行在Base文件中的位移來檢索的,並且作合併時也是有選擇的進行。
此外DRS(Distributed Resource Scheduler)自身也會合並,爲了保障檢索延遲的可預測性。Kudu的DRS默認以32MB爲單位進行拆分,Compaction過程是爲了對內容進行排序重組,減小不一樣DRS之間key的overlap,進而在檢索的時候減小須要參與檢索的DRS的數量。
安裝部分不寫了,本身都裝出屎了。
經過Impala使用Kudu能夠新建內部表和外部表兩種。
建立一個簡單的Kudu表:
CREATE TABLE kaka_first ( id BIGINT, name STRING ) DISTRIBUTE BY HASH INTO 16 BUCKETS TBLPROPERTIES( 'storage_handler' = 'com.cloudera.kudu.hive.KuduStorageHandler', 'kudu.table_name' = 'kaka_first', 'kudu.master_addresses' = '10.10.245.129:7051', 'kudu.key_columns' = 'id' );
建表語句中,默認第一個就是Primary Key,是個not null列,在後面的kudu.key_columns
中列出,這邊至少寫一個。
com.cloudera.kudu.hive.KuduStorageHandler
插入數據
INSERT INTO kaka_first VALUES (1, "john"), (2, "jane"), (3, "jim");
Impala默認一次同時最多插入1024條記錄,做爲一個batch
更新數據
UPDATE kaka_first SET name="bob" where id = 3;
刪除數據
DELETE FROM kaka_first WHERE id < 3;
修改表屬性
ALTER TABLE kaka_first RENAME TO employee; //重命名 ALTER TABLE employee SET TBLPROPERTIES('kudu.master_addresses' = '10.10.245.135:7051'); //更改kudu master address ALTER TABLE employee SET TBLPROPERTIES('EXTERNAL' = 'TRUE'); //將內部表變爲外部表
從MySql導出數據到本地txt
select * from DAYCACHETBL into outfile '/tmp/DAYCACHETBL.txt' fields terminated by '\t' lines terminated by '\n';
保存到hdfs中/data
目錄下
hdfs dfs -mkdir /data hdfs dfs -put /tmp/DAYCACHETBL.txt /data
在hive shell中建立hive表
create table DAYCACHETBL ( METERID string, SOURCEID int, VB double, DELTA double, DTIME string, UPGUID string, UPBATCH string, level string, YEAR string, MONTH string, QUARTER string, WEEK string, D_DELTA double ) ROW FORMAT DELIMITED fields terminated by '\t' lines terminated by '\n' stored as textfile location '/data';
在impala-shell下建立kudu表
create table DAYCACHETBL2 ( METERID string, SOURCEID int, VB double, DELTA double, DTIME string, UPGUID string, UPBATCH string, level string, YEAR string, MONTH string, QUARTER string, WEEK string, D_DELTA double ) DISTRIBUTE BY HASH INTO 16 BUCKETS TBLPROPERTIES( 'storage_handler' = 'com.cloudera.kudu.hive.KuduStorageHandler', 'kudu.table_name' = 'DAYCACHETBL2', 'kudu.master_addresses' = 'kudu1:7051,kudu2:7051,kudu3:7051', 'kudu.key_columns' = 'METERID' );
將hive表中的內容插入kudu表
insert into DAYCACHETBL2 select * from DAYCACHETBL;