Apache kudu的基本思想、架構與impala實踐

Apache Kudu的基本思想、架構和與Impala實踐

Apache Kudu是一個爲了Hadoop系統環境而打造的列存儲管理器,與通常的Hadoop生態環境中的其餘應用同樣,具備能在通用硬件上運行、水平擴展性佳和支持高可用性操做等功能。算法

在Kudu出現以前,Hadoop生態環境中的儲存主要依賴HDFS和HBase,追求高吞吐批處理的用例中使用HDFS,追求低延時隨機讀取用例下用HBase,而Kudu正好能兼顧這二者。shell

  • Kudu的主要優勢:設計模式

    • 快速處理OLAP(Online Analytical Processing)任務
    • 集成MapReduce、Spark和其餘Hadoop環境組件
    • 與Impala高度集成,使得這成爲一種高效訪問交互HDFS的方法
    • 強大而靈活的統一性模型
    • 在執行同時連續隨機訪問時表現優異
    • 經過Cloudera Manager能夠輕鬆管理控制
    • 高可用性,tablet server和master利用Raft Consensus算法保證節點的可用
    • 結構數據模型
  • 常見的應用場景: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並是否是在硬盤數據上作複製的,而是採起了邏輯複製的辦法,這有如下一些好處:

  • 儘管insert和update須要經過網絡對數據作transmit,可是delete操做不須要移動任何數據。Delete操做的請求會發送到每個tablet server上,在本地作刪除操做。
  • 普通的物理操做,好比數據壓縮,並不須要經過網絡作數據transmit,但不一樣於HDFS,每一個請求都須要經過網絡把請求傳送到各個備份節點上來知足操做須要。
  • 每一個備份不須要同時進行操做,下降寫入壓力,避免高延時。

隨機寫入效率

在內存中每一個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的數量。


Kudu總體框架


與Impala的簡單實踐

安裝部分不寫了,本身都裝出屎了。

經過Impala使用Kudu能夠新建內部表和外部表兩種。

  • 內部表(Internal Table):事實上是屬於Impala管理的表,當刪除時會確確實實地刪除表結構和數據。在Impala中建表時,默認建的是內部表。
  • 外部表(External Table):不禁Impala管理,當刪除這個表時,並不能從源位置將其刪除,只是接觸了Kudu到Impala之間對於這個表的關聯關係

建立一個簡單的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中列出,這邊至少寫一個。

  • storage_handler:選擇經過Impala訪問kudu的機制,必須填成com.cloudera.kudu.hive.KuduStorageHandler
  • kudu.table_name:Impala爲Kudu建(或者關聯的)的表名
  • kudu.master_addresses:Impala須要訪問的Kudu master列表
  • kudu.key_columns:Primary key列表

插入數據

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;
相關文章
相關標籤/搜索