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');