龙空技术网

在线联机分析OLAP:impala+kudu,灵活的、实时SQL分析

大数据技术实战 744

前言:

此刻朋友们对“hive导入kudu”大概比较关注,兄弟们都需要了解一些“hive导入kudu”的相关文章。那么小编也在网摘上汇集了一些有关“hive导入kudu””的相关内容,希望我们能喜欢,同学们一起来了解一下吧!

在线联机分析OLAP:impala+kudu,灵活的、实时SQL分析

KUDU之前

通常数据分析:需要利用Hbase的快速插入、快读random access的特性来导入数据,HBase也允许用户对数据进行修改,HBase对于大量小规模查询也非常迅速。同时,用户使用HDFS/Parquet + Impala/Hive来对超大的数据集进行查询分析,对于这类场景, Parquet这种列式存储文件格式具有极大的优势。

然后他们会部署HDFS/Parquet + HBase混合架构

问题:架构较为复杂,而且在维护上也十分困难

用Flume或Kafka或数据导入工具如Datax,导入HBase。涉及到源数据会修改,可能在HBase上对数据做一些修改。然后每隔一段时间(每天或每周)将数据从Hbase中导入到Parquet文件,作为一个新的partition放在HDFS上,最后使用Impala等计算引擎进行查询,生成最终报表。

在Kudu出现之前,Hadoop生态环境中的储存主要依赖HDFS和HBase,追求高吞吐批处理的用例中使用HDFS,追求低延时随机读取用例下用HBase,而Kudu正好能兼顾这两者。

KUDU

Kudu是对HDFS和HBase功能上的补充,能提供快速的分析和实时计算能力,并且充分利用CPU和I/O资源,支持数据原地修改,支持简单的、可扩展的数据模型。

表Table

同理,一种数据设计模式schema,根据primary key来排序组织。一个表可以被分到若干个分片中,称为tablet。

分片Tablet

一个tablet是指表上一段连续的segment。一个特定的tablet会被复制到多个tablet服务器上,其中一个会被认为是leader tablet。每一个备份tablet都可以支持读取、写入请求。

分片服务器 Tablet Server

负责为客户端储存和提供tablets。只有Leader Tablet可以写入请求,其他的tablets只能执行请求。

Master

Master负责追踪tablets、tablet severs、catalog table和其他与集群相关的metadata。另外也为客户端协调metadata的操作。

Raft Consensus算法

Catalog Table

Kudu的metadata的中心位置,存储表和tablet的信息,客户端可以通过master用客户端api来访问。

逻辑复制 Logical Replication

Kudu并是不是在硬盘数据上做复制的,而是采取了逻辑复制的办法,这有以下一些好处:

尽管insert和update需要通过网络对数据做transmit,但是delete操作不需要移动任何数据。Delete操作的请求会发送到每一个tablet server上,在本地做删除操作。普通的物理操作,比如数据压缩,并不需要通过网络做数据transmit,但不同于HDFS,每个请求都需要通过网络把请求传送到各个备份节点上来满足操作需要。每个备份不需要同时进行操作,降低写入压力,避免高延时。

随机写入效率

在内存中每个tablet分区维护一个MemRowSet来管理最新更新的数据,当尺寸大于一定大小之后会flush到磁盘上行成DiskRowSet,多个DiskRowSet会在适当的时候做归并操作。 这些被flush到磁盘的DiskRowSet数据分为两种,一种是Base数据,按列式存储格式存在,一旦生成不再修改,另一种是Delta文件,储存Base中有更新的数据,一个Base文件可以对应多个Delta文件。

Delta文件的存在使得检索过程需要额外的开销,这些Delta文件是根据被更新的行在Base文件中的位移来检索的,而且做合并时也是有选择的进行。

此外DRS(Distributed Resource Scheduler)自身也会合并,为了保障检索延迟的可预测性。Kudu的DRS默认以32MB为单位进行拆分,Compaction过程是为了对内容进行排序重组,减少不同DRS之间key的overlap,进而在检索的时候减少需要参与检索的DRS的数量。

与Impala的简单实践

安装部分不写了,自己都装出屎了。

通过Impala使用Kudu可以新建内部表和外部表两种。

内部表(Internal Table):事实上是属于Impala管理的表,当删除时会确确实实地删除表结构和数据。在Impala中建表时,默认建的是内部表。外部表(External Table):不由Impala管理,当删除这个表时,并不能从源位置将其删除,只是接触了Kudu到Impala之间对于这个表的关联关系

创建一个简单的Kudu表:

CREATE TABLE kaka_first

(

id BIGINT,

name STRING

)

DISTRIBUTE BY HASH INTO 16 BUCKETS

TBLPROPERTIES(

'storage_handler' = 'com.cloudera.kudu.hive.KuduStorageHandler',

'kudu.table_name' = 'kaka_first',

'kudu.master_addresses' = '10.10.245.129:7051',

'kudu.key_columns' = 'id'

);

建表语句中,默认第一个就是Primary Key,是个not null列,在后面的kudu.key_columns中列出,这边至少写一个。

storage_handler:选择通过Impala访问kudu的机制,必须填成com.cloudera.kudu.hive.KuduStorageHandlerkudu.table_name:Impala为Kudu建(或者关联的)的表名kudu.master_addresses:Impala需要访问的Kudu master列表kudu.key_columns:Primary key列表

标签: #hive导入kudu