不生產博客,只是官網的搬運工
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');--內部表修改爲外部