基于Hadoop的一个数据仓库工具,本质上是一个翻译器,在hadoop基础上架设一层接口,使得可以使用类似sql的hql语句来操作数据。
主要特点:
- 分析离线数据,不具有实时性
- 不支持事务
- 不支持修改
- 有很多的数据冗余
Hive的存储结构:
- Hive的数据库实际上时HDFS文件系统中的 [库名].db 文件夹。
- Hive数据库中的表,实际上是库文件夹下的子文件夹。
- Hive中表的数据就是对应表文件夹下的子文件。
- Hive中默认的文件库就是HDFS中 user/hive/warehouse 目录
Hive的执行流程:
① 客户端提交一个HQL语句到Driver
② 通过complier对HQL词法分析,语法分析获取查询的表字段
③ complier去metastore查询相关的信息返回字段表信息
④ 编译器获取元数据信息,对任务进行编译,将HQL转换为抽象语法树 -> 查询块 ->重写逻辑查询计划 -> 生成物理计划 -> 选择最佳策略,交给ExecutionEngine
⑤ ExecutionEngine获取元数据,提交给JobTracker执行任务
⑥ 获取执行的结果,返回执行结果
Antlr是一种语言识别工具,可以用来构造领域语言(针对某一种计算机领域的语言),使用Antlr构造特定语言,只需要编写一个语法文件,定义词法和语法替换规则即可,Antlr完成了词法分析、语义分析、中间代码生成的过程。
AST Tree包含select、from、where、group by、having等子句
QueryBlock,一条SQL最基本的组成单元,包含三部分:输入源,计算过程,输出。简单来讲一个QueryBlock就是一个子查询。
Hive优化
-
解决数据倾斜
a. group by倾斜 hive.groupby.skewindata=true
生成的MRJob有两个,第一个MRJob将Map产生的数据随机分布到reduce中,每个reduce做部分聚合
第二个MRJob负责将预处理的结果,将数据 GroupBy Key分不到reduce中,完成最终聚合
b. join倾斜 hive.optimize.skewjoin=true hive.skewjoin.key=100000
join过程出现倾斜将其设置为true,第二条语句指定join对应的记录的条数,超过这个值将开启优化
-
join优化:有小表时开启 Map端Join
当链接的两个表是一个较小的表和一个较大的表的时候,将小表放到内存,之后对大表进行map操作。
hive.auto.convert.join=true 默认值是25Mb,可以通过参数调整
-
语句优化
利用Hive对嵌套语句的支持,将原来一个MapReduce作业转换为两个作业
-
本地模式:当输入的数据小于250M是默认不调用MapReduce,直接在本地机器计算
hive.exec.mode.local.auto=true
-
并行执行:执行一条SQL的时候分成步骤,有时候不关联,这种时候可以并行执行。
hive.exec.parallel=true
-
严格模式:hive默认情况下不是严格模式。开启后可以防止用户执行产生不好效果的查询
e.g. 对分区表的查询没有限制分区字段;使用了order by没有使用limit;产生了迪卡尔积
-
开启JVM重利用:set mapred.job.reuse.jvm.num.tasks=20(默认1个)
JVM重用可以使得一个JVM进程在同一个Job中使用N次后才销毁
-
调整任务中的Map数
- 减少任务中的Map数 ,在map执行前合并小文件
- 增加任务中的Map任务数 处理一个文件时,只用1个Map效率不高。
-
关闭推测执行
-
开启压缩