《kudu官網筆記》3.在kudu上使用impala

不生產博客,只是官網的搬運工

https://docs.cloudera.com/documentation/enterprise/5-16-x/topics/kudu_impala.html

impala與kudu集成,允許你使用impala sql來插入、查詢和更新、刪除kudu的數據,作爲kudu api的替代方案,另外,也可以使用jdbc or odbc

 

impala數據庫包含模型(不知道該咋翻譯)

Impala Database Containment Model

每個impala表包含叫做庫的namespace,默認的database是default,當需要的時候可以創建或刪除額外的數據庫,使用create database語句來創建庫,use database,進入該庫

create database db;
use db;
create table tab()

前綴impala::和數據庫名被追加到kudu表前面,impala::db.tab

 

內部表和外部表

類似hive的內、外表,內部表由impala管理,刪除表連kudu數據一起刪除,外部表只會刪除impala、kudu的映射,默認內部表,前綴是impala::db.tab

 

用impala查kudu表

查詢已經存在表,通過api或者spark創的表,impala這看不到,需要創映射

CREATE EXTERNAL TABLE my_mapping_table
STORED AS KUDU
TBLPROPERTIES (
  'kudu.table_name' = 'exist_kudu_table'
);

 

創建新的kudu表

用impala創Kudu需要指定schema和分區信息,impala首先創建Kudu表,然後創建映射

創建分區表

create table

 

CREATE TABLE my_first_table
(
  id BIGINT,
  name STRING,
  PRIMARY KEY(id)
)
PARTITION BY HASH PARTITIONS 16
STORED AS KUDU;

 

 

默認副本數3,副本數必須奇數,需要指定的話添加:

TBLPROPERTIES ('kudu.num_tablet_replicas' = 'n')

 create table ... as select ...

CREATE TABLE new_table
PRIMARY KEY (ts, name)
PARTITION BY HASH(name) PARTITIONS 8
STORED AS KUDU
AS SELECT ts, name, value FROM old_table;

可以select xxx as new_filed_name,作爲新字段名

 

分區表

支持hash、range

 

range分區

CREATE TABLE customers (
  state STRING,
  name STRING,
  ....
  PRIMARY KEY (state, name)
)
PARTITION BY RANGE (state)
(
  PARTITION VALUE = 'al',
  PARTITION VALUE = 'ak',
  PARTITION VALUE = 'ar',
  ...
  ...
  PARTITION VALUE = 'wv',
  PARTITION VALUE = 'wy'
)
STORED AS KUDU;

hash分區

hash(a),hash(b) hash(a,b)都可以

但hash(a),hash(a,b)將報錯

CREATE TABLE cust_behavior (
  id BIGINT,
  sku STRING,
.....
  PRIMARY KEY (id, sku)
)
PARTITION BY HASH PARTITIONS 16 --默認以主鍵分區
STORED AS KUDU;

 

高級分區

創建16個分區

hash+range

CREATE TABLE cust_behavior (
  id BIGINT,
  sku STRING,
  .....
  PRIMARY KEY (id, sku)
)
PARTITION BY HASH (id) PARTITIONS 4,
RANGE (sku)
(
  PARTITION VALUES < 'g',
  PARTITION 'g' <= VALUES < 'o',
  PARTITION 'o' <= VALUES < 'u',
  PARTITION 'u' <= VALUES
)
STORED AS KUDU;

多hash創16個分區

也可以hash(id,sku),但這樣查sku的話,會scan 所有分區,不會限制在4個裏面

CREATE TABLE cust_behavior (
  id BIGINT,
  sku STRING,
....
  PRIMARY KEY (id, sku)
)
PARTITION BY HASH (id) PARTITIONS 4,
             HASH (sku) PARTITIONS 4
STORED AS KUDU;

 STORED AS KUDU;

 

非覆蓋-range分區

下面例子可以存儲12年到16年5年的數據

 

CREATE TABLE sales_by_year (
  year INT, sale_id INT, amount INT,
  PRIMARY KEY (sale_id, year)
)
PARTITION BY RANGE (year) (
  PARTITION VALUE = 2012,
  PARTITION VALUE = 2013,
  PARTITION VALUE = 2014,
  PARTITION VALUE = 2015,
  PARTITION VALUE = 2016
)
STORED AS KUDU;

 

 

當有17年數據的時候,可以加range分區

 

ALTER TABLE sales_by_year ADD RANGE PARTITION VALUE = 2017;

當不需要12年數據的時候,drop即可

ALTER TABLE sales_by_year DROP RANGE PARTITION VALUE = 2012;

 

分區規則:

對於大表,分區數與集羣cores數一致

對於小表,每個分區至少1G(有什麼依據嗎?之前測試,6個節點,6個分區(忽略副本),每個分區大概2G多數據,然後分12個,效率提升很明顯,分成18個後,幾乎沒啥提升)

 

sql謂詞評估對於性能優化

如果where條件包含=、<=、<、>、>=、between或者in,kudu將按照條件直接將結果給impala,提升性能,對於!=、like等等,kudu會將所有數據給Impala,impala自己做過濾

 

insert數據

 

INSERT INTO my_first_table VALUES (99, "sarah");
INSERT INTO my_first_table VALUES (1, "john"), (2, "jane"), (3, "jim");

批量插入,3種方式,各有利弊

1.多個insert語句,效率比較差,與kudu插入相比,impala有較高的啓動成本

2.多個values子句,impala會默認按1020分組,然後將數據交給kudu,可以設置批次大小來調節效率

set batch_size=10000;

 

修改表的properties

 

ALTER TABLE my_table RENAME TO my_new_table;--只是修改了impala映射

ALTER TABLE my_internal_table
SET TBLPROPERTIES('kudu.table_name' = 'new_name');--僅限內部表,修改kudu底層表名

ALTER TABLE my_external_table_
SET TBLPROPERTIES('kudu.table_name' = 'some_other_kudu_table');--修改外部表到別的kudu表

ALTER TABLE my_table 
SET TBLPROPERTIES('kudu.master_addresses' = 'ip:7051,...');--修改master地址

ALTER TABLE my_table SET TBLPROPERTIES('EXTERNAL' = 'TRUE');--內部表修改爲外部

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章