C语言Hadoop之数据仓库Hive运行机制,常用操作,数据倾斜原因与优化详解

Hadoop之数据仓库Hive运行机制,常用操作,数据倾斜原因以及优化详解2017-12-17

一、Hive是什么

  Hive是白手起家以 Hadoop
上之数据仓库基础构架。它提供了千篇一律多样的工具,可以就此来拓展数据提取转化加载(ETL),这是一致种好储存、查询与剖析存储在
Hadoop 中的泛数据的机制。Hive 定义了概括的类 SQL 查询语言,称为
HQL,它同意熟悉 SQL 的用户查询数据。同时,这个语言为同意熟悉 MapReduce
开发者的开自定义的 mapper 和 reducer 来拍卖内建的 mapper 和 reducer
无法到位的扑朔迷离的剖析工作。

C语言 1

 

老二、Hive的适用场景

  Hive 构建以冲静态批处理的Hadoop
之上,Hadoop
通常还有比高之推移而在作业提交和调度的时刻要大量底开。因此,Hive
并无能够在广大数据集上实现小顺延快速的询问,例如,Hive 在几百MB
的数目集上执行查询一般发生分钟级的时推。因此,Hive
并无合乎那些要低顺延的运,例如,联机事务处理(OLTP)。Hive
查询操作过程严格遵照Hadoop MapReduce 的作业执行模型,Hive 将用户的HiveQL
语句通过解释器转换为MapReduce 作业提交至Hadoop 集群达,Hadoop
监控作业执行过程,然后回到作业执行结果被用户。Hive
并非为共同事务处理而规划,Hive
并无提供实时的查询及因行级的多寡更新操作。Hive
的极品使用场所是天意据集的批判处理作业,例如,网络日志分析。

 

其三、Hive的数据类型

Hive支持原子和错综复杂数据列,原子数据列包括:数据值、布尔路、字符串类型等,复杂的档次包括:Array、Map和Struct。其中Array和Map和java中之Array和Map是形似的,Struct和C语言中之Struct相似。

C语言 2

注意:

1.
原子数据列是可以拓展隐式的转移的,例如tinyInt类型会自行转为Int类型但是不能够由int自动转为tinyInt类型。

2. 兼有的平头类型、Float和String类型都可以变换为Double类型。

3. TinyInt、SmallInt、Int都得以转为Float类型。

4. Boolean 类型不可以变为外的别样类型。

5. 足以经过使用Cast操作显示的进展多少易,例如Cast(‘1’ as
int);将字符串转为整型,如果强制转换失败使:Cast(‘X’ as
int);表达式返回的是NULL;

 

季、Hive的系统布局

要分为以下几只有:

4.1、用户接口

  用户接口主要发生三独:CLI,Client 和
WUI。其中最为常用之是 CLI,Cli 启动的时候,会以开动一个 Hive
副本。Client 是 Hive 的客户端,用户连接到 Hive Server。在启动 Client
模式之早晚,需要指出 Hive Server 所在节点,并且在拖欠节点启动 Hive
Server。 WUI 是通过浏览器访问 Hive。

 

4.2、元数据存储

  Hive 将首批数据存储在数据库被,如
mysql、derby。Hive
中之首批数据包括表的讳,表的排列和分区及其特性,表底属性(是否为表表等),表底数据所在目录等。

 

4.3、解释器、编译器、优化器、执行器

  解释器、编译器、优化器完成 HQL
查询语句从词法分析、语法分析、编译、优化和询问计划的更动。生成的查询计划存储于
HDFS 中,并于继由于 MapReduce 调用执行。

  Hive 的数据存储于 HDFS
中,大部分底查询由 MapReduce 完成(包含 * 的查询,比如 select * from
tbl 不见面生成 MapReduce 任务)。

 

五、数据存储

  首先,Hive
没有专门的多寡存储格式,也从不呢数据建立目录,用户可以生自由的集团
Hive 中之阐明,只待以创建表的当儿告诉 Hive
数据被的列分隔符和行分隔符,Hive 就可以分析数据。

  其次,Hive 中存有的多寡还存储于 HDFS
中,Hive 中涵盖以下数据模型:表(Table),外部表(External
Table),分区(Partition),桶(Bucket)。

Table
和数据库中之 Table 在概念上是看似的,每一个 Table 在 Hive
中都起一个遥相呼应的目录存储数据。例如,一个表 pvs,它于 HDFS
中之路线为:/wh/pvs,其中,wh 是当 hive-site.xml 中出于
${hive.metastore.warehouse.dir} 指定的数据仓库的目录,所有的 Table
数据(不包 External Table)都封存于是目录中。

Partition 对应为数据库中之 Partition
列的凝聚索引,但是 Hive 中 Partition 的团组织办法与数据库中之深无同等。在
Hive 中,表中的一个 Partition 对应于表下的一个索引,所有的 Partition
的数据还存储在相应的目录中。例如:pvs 表中蕴藏 ds 和 city 两独
Partition,则指向承诺受 ds = 20090801, ctry = US 的 HDFS
子目录也:/wh/pvs/ds=20090801/ctry=US;对诺被 ds = 20090801, ctry = CA 的
HDFS 子目录也;/wh/pvs/ds=20090801/ctry=CA

Buckets 对点名列计算 hash,根据 hash
值切分数据,目的是为彼此,每一个 Bucket 对许一个文件。将 user 列分散到
32 只 bucket,首先对 user 列的值计算 hash,对承诺 hash 值为 0 的 HDFS
目录也:/wh/pvs/ds=20090801/ctry=US/part-00000;hash 值为 20 的 HDFS
目录为:/wh/pvs/ds=20090801/ctry=US/part-00020

External
Table 指向已经以 HDFS 中在的数额,可以创建 Partition。它同
Table 在正数据的团伙达到是一样的,而实质上多少的蕴藏则闹于生的距离。

Table
的开创进程以及数目加载过程(这有限单过程得于同一个谈中得),在加载数据的长河中,实际多少会受活动及数据仓库目录中;之后对数据对访将会见直接当数据仓库目录中落成。删除表时,表中的数码以及冠数据以见面吃以删除。

六、Hive运行机制

C语言 3

流程大致步骤为:

1. 用户提交查询等职责让Driver。

2. 编译器获得该用户的职责Plan。

3.
编译器Compiler根据用户任务去MetaStore中获得需要之Hive的处女数据信息。

4.
编译器Compiler得到首批数据信息,对任务拓展编译,先将HiveQL转换为架空语法树,然后以抽象语法树转换成查询块,将查询块转化为逻辑的查询计划,重写逻辑查询计划,将逻辑计划转化为大体的计划(MapReduce),
最后挑最佳的国策。

5. 将最终之计划交付给Driver。

6.
Driver将计划Plan转交给ExecutionEngine去实施,获取元数据信息,提交给JobTracker或者SourceManager执行该任务,任务会直接读取HDFS中文件进行对应的操作。

7. 取得执行的结果。

8. 得到并回执行结果。

 

缔造表时:

解析用户提交的Hive语句–>对那个进行辨析–>分解为表、字段、分区等Hive对象。根据分析及之信息构建对应之阐发、字段、分区等对象,从SEQUENCE_TABLE中获得构建对象的风靡的ID,与构建对象信息(名称、类型等等)一同通过DAO方法勾勒副正数据库的表中,成功后将SEQUENCE_TABLE中对应之新型ID+5.实际上常见的RDBMS都是经过这种措施进行组织的,其系阐发中与Hive元数据一致显示了这些ID信息。通过这些元数据可挺轻的读取到数量。

 

七、产生多少倾斜的操作及因

7.1、操作

C语言 4

 

7.2、原因

1)、key分布不咸匀

2)、业务数据我的特性

3)、建表时考虑不周

4)、某些SQL语句我便生多少倾斜

7.3、表现

职责进度长日子维系于99%(或100%),查看任务监控页面,发现只有为数不多(1只或几独)reduce子任务不成功。因为该处理的数据量和另reduce差异过十分。

单一reduce的记录数与平均记录数差异过很,通常可能达到3倍增甚至又多。
最丰富时老大于平均时长。

八、数据倾斜的解决方式

8.1、空值关联有的数额倾斜

  a:空值不参与关联

1 select 
2 a.neme,b.sex,a,income,a,wore_years
3 fro amltmp.user a
4 left outer join amltmp.log b
5 on a.user_id=b.log_id
6 where a.user-id is not null
7 or a.user-id <>'';

 

  b:赋予空值新的Key值—随机数

1 select *
2 from amltmp.log a
3 left outer joinamlapp. users b
4 on if( a.user_id is null ,concat('hive',rand() ,a.user_id ) = b.user_id;

结论:把空值的 key
变成一个字符串加上自由数,就会管倾斜的数目分到不同之reduce上
,解决多少倾斜问题。

 

8.2、数据类型不同等导致的多寡倾斜

场景:用户表中user_id字段为int,log表中user_id字段既出string类型也来int类型。当按照user_id进行有限独说明的Join操作时,默认的Hash操作会按int型的id来进展分红,这样会招有string类型id的记录还分配到一个Reducer中。

 

缓解方式:把数字型转换成为字符串类型

1 select * from amltmp.users a
2 
3 left outer join amltmp.logs b
4 on a.usr_id = cast(b.user_id as string)
5 
6 left outrt join amltmp.tran_event c
7 on a.cust_no=cast(c.cust_cd as string);

 九、Hive的特点

C语言 5