Hive基本原理

基于Hadoop的一个数据仓库工具,本质上是一个翻译器,在hadoop基础上架设一层接口,使得可以使用类似sql的hql语句来操作数据。

主要特点:

  1. 分析离线数据,不具有实时性
  2. 不支持事务
  3. 不支持修改
  4. 有很多的数据冗余

Hive的存储结构:

  1. Hive的数据库实际上时HDFS文件系统中的 [库名].db 文件夹。
  2. Hive数据库中的表,实际上是库文件夹下的子文件夹。
  3. Hive中表的数据就是对应表文件夹下的子文件。
  4. 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优化

  1. 解决数据倾斜

    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对应的记录的条数,超过这个值将开启优化

  2. join优化:有小表时开启 Map端Join

    当链接的两个表是一个较小的表和一个较大的表的时候,将小表放到内存,之后对大表进行map操作。

    hive.auto.convert.join=true 默认值是25Mb,可以通过参数调整

  3. 语句优化

    利用Hive对嵌套语句的支持,将原来一个MapReduce作业转换为两个作业

  4. 本地模式:当输入的数据小于250M是默认不调用MapReduce,直接在本地机器计算

    hive.exec.mode.local.auto=true

  5. 并行执行:执行一条SQL的时候分成步骤,有时候不关联,这种时候可以并行执行。

    hive.exec.parallel=true

  6. 严格模式:hive默认情况下不是严格模式。开启后可以防止用户执行产生不好效果的查询

    e.g. 对分区表的查询没有限制分区字段;使用了order by没有使用limit;产生了迪卡尔积

  7. 开启JVM重利用:set mapred.job.reuse.jvm.num.tasks=20(默认1个)

    JVM重用可以使得一个JVM进程在同一个Job中使用N次后才销毁

  8. 调整任务中的Map数

    1. 减少任务中的Map数 ,在map执行前合并小文件
    2. 增加任务中的Map任务数 处理一个文件时,只用1个Map效率不高。
  9. 关闭推测执行

  10. 开启压缩

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值