CDC+ETL實現數據集成方案java
impala是cloudera提供的一款高效率的sql查詢工具,提供實時的查詢效果,官方測試性能比hive快10到100倍,其sql查詢比sparkSQL還要更加快速,號稱是當前大數據領域最快的查詢sql工具,shell
impala是參照谷歌的新三篇論文(Caffeine--網絡搜索引擎、Pregel--分佈式圖計算、Dremel--交互式分析工具)當中的Dremel實現而來,其中舊三篇論文分別是(BigTable,GFS,MapReduce)分別對應咱們即將學的HBase和已經學過的HDFS以及MapReduce。數據庫
impala是基於hive並使用內存進行計算,兼顧數據倉庫,具備實時,批處理,多併發等優勢緩存
Kudu與Apache Impala (孵化)緊密集成,impala自然就支持兼容kudu,容許開發人員使用Impala的SQL語法從Kudu的tablets 插入,查詢,更新和刪除數據;網絡
一、須要先啓動hdfs、hive、kudu、impala架構
二、使用impala的shell控制檯併發
(1):使用該impala-shell命令啓動Impala Shell 。默認狀況下,impala-shell 嘗試鏈接到localhost端口21000 上的Impala守護程序。要鏈接到其餘主機,請使用該-i <host:port>選項。要自動鏈接到特定的Impala數據庫,請使用該-d <database>選項。例如,若是您的全部Kudu表都位於數據庫中的Impala中impala_kudu,則-d impala_kudu可使用此數據庫。
(2):要退出Impala Shell,請使用如下命令: quit;
內部表由Impala管理,當您從Impala中刪除時,數據和表確實被刪除。當您使用Impala建立新表時,它一般是內部表。
CREATE TABLE my_first_table ( id BIGINT, name STRING, PRIMARY KEY(id) ) PARTITION BY HASH PARTITIONS 16 STORED AS KUDU TBLPROPERTIES ( 'kudu.master_addresses' = 'node1:7051,node2:7051,node3:7051', 'kudu.table_name' = 'my_first_table' );
在 CREATETABLE 語句中,必須首先列出構成主鍵的列。
drop table if exists my_first_table;
外部表(建立者CREATE EXTERNAL TABLE)不受Impala管理,而且刪除此表不會將表從其源位置(此處爲Kudu)丟棄。相反,它只會去除Impala和Kudu之間的映射。這是Kudu提供的用於將現有表映射到Impala的語法。
使用java建立一個kudu表:
public class CreateTable { private static ColumnSchema newColumn(String name, Type type, boolean iskey) { ColumnSchema.ColumnSchemaBuilder column = new ColumnSchema.ColumnSchemaBuilder(name, type); column.key(iskey); return column.build(); } public static void main(String[] args) throws KuduException { // master地址 final String masteraddr = "node1,node2,node3"; // 建立kudu的數據庫連接 KuduClient client = new KuduClient.KuduClientBuilder(masteraddr).defaultSocketReadTimeoutMs(6000).build(); // 設置表的schema List<ColumnSchema> columns = new LinkedList<ColumnSchema>(); columns.add(newColumn("CompanyId", Type.INT32, true)); columns.add(newColumn("WorkId", Type.INT32, false)); columns.add(newColumn("Name", Type.STRING, false)); columns.add(newColumn("Gender", Type.STRING, false)); columns.add(newColumn("Photo", Type.STRING, false)); Schema schema = new Schema(columns); //建立表時提供的全部選項 CreateTableOptions options = new CreateTableOptions(); // 設置表的replica備份和分區規則 List<String> parcols = new LinkedList<String>(); parcols.add("CompanyId"); //設置表的備份數 options.setNumReplicas(1); //設置range分區 options.setRangePartitionColumns(parcols); //設置hash分區和數量 options.addHashPartitions(parcols, 3); try { client.createTable("person", schema, options); } catch (KuduException e) { e.printStackTrace(); } client.close(); } }
在kudu的頁面上能夠觀察到以下信息:
在impala的命令行查看錶:
當前在impala中並無person這個表
使用impala建立外部表 , 將kudu的表映射到impala上:
在impala-shell執行
CREATE EXTERNAL TABLE `person` STORED AS KUDU TBLPROPERTIES( 'kudu.table_name' = 'person', 'kudu.master_addresses' = 'node1:7051,node2:7051,node3:7051')
impala 容許使用標準 SQL 語句將數據插入 Kudu
建立表
CREATE TABLE my_first_table ( id BIGINT, name STRING, PRIMARY KEY(id) ) PARTITION BY HASH PARTITIONS 16 STORED AS KUDU;
此示例插入單個行
INSERT INTO my_first_table VALUES (50, "zhangsan");
查看數據
select * from my_first_table
使用單個語句插入三行
INSERT INTO my_first_table VALUES (1, "john"), (2, "jane"), (3, "jim");
批量插入Batch Insert
INSERT INTO my_first_table
SELECT * FROM temp1;
UPDATE my_first_table SET name="xiaowang" where id =1 ;
delete from my_first_table where id =2;
開發人員能夠經過更改表的屬性來更改 Impala 與給定 Kudu 表相關的元數據。這些屬性包括表名, Kudu 主地址列表,以及表是否由 Impala (內部)或外部管理。
ALTER TABLE PERSON RENAME TO person_temp;
建立內部表:
CREATE TABLE kudu_student ( CompanyId INT, WorkId INT, Name STRING, Gender STRING, Photo STRING, PRIMARY KEY(CompanyId) ) PARTITION BY HASH PARTITIONS 16 STORED AS KUDU TBLPROPERTIES ( 'kudu.master_addresses' = 'node1:7051,node2:7051,node3:7051', 'kudu.table_name' = 'student' );
若是表是內部表,則能夠經過更改 kudu.table_name 屬性重命名底層的 Kudu 表
ALTER TABLE kudu_student SET TBLPROPERTIES('kudu.table_name' = 'new_student');
若是用戶在使用過程當中發現其餘應用程序從新命名了kudu表,那麼此時的外部表須要從新映射到kudu上
建立一個外部表:
CREATE EXTERNAL TABLE external_table STORED AS KUDU TBLPROPERTIES ( 'kudu.master_addresses' = 'node1:7051,node2:7051,node3:7051', 'kudu.table_name' = 'person' );
從新映射外部表,指向不一樣的kudu表:
ALTER TABLE external_table SET TBLPROPERTIES('kudu.table_name' = 'hashTable')
上面的操做是:將external_table映射的PERSON表從新指向hashTable表
ALTER TABLE my_table SET TBLPROPERTIES('kudu.master_addresses' = 'kudu-new-master.example.com:7051');
ALTER TABLE my_table SET TBLPROPERTIES('EXTERNAL' = 'TRUE');