推荐阅读: 论主数据的重要性(正确理解元数据、数据元) CDC+ETL实现数据集成方案 Java实现impala操作kudu 实战kudu集成impala impala基本介绍 impala是cloudera提供的一款高效率的
论主数据的重要性(正确理解元数据、数据元)
CDC+ETL实现数据集成方案
Java实现impala操作kudu
实战kudu集成impala
impala是cloudera提供的一款高效率的sql查询工具,提供实时的查询效果,官方测试性能比Hive快10到100倍,其sql查询比sparkSQL还要更加快速,号称是当前大数据领域最快的查询sql工具,
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
(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 columns = new LinkedList();
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 parcols = new LinkedList();
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");
--结束END--
本文标题: 实战kudu集成impala
本文链接: https://lsjlt.com/news/3806.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-10-23
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0