Hive调优与总结

目录

一、Hive调优

1.1 Fetch抓取

1.2 本地模式

1.3 严格模式

二、Hive要点总结


一、Hive调优

1.1 Fetch抓取

        Fetch抓取是指,Hive中对某些情况的查询可以不必使用MapReduce计算。例如:SELECT * FROM employees;在这种情况下,Hive可以简单地读取employee对应的存储目录下的文件,然后输出查询结果到控制台。

        在hive-default.xml.template文件中hive.fetch.task.conversion默认是more,老版本hive默认是minimal,该属性修改为more以后,在全局查找、字段查找、limit查找等都不走mapreduce。

<property>
    <name>hive.mapred.mode</name>
    <value>strict</value>
    <description>
      The mode in which the Hive operations are being performed. 
      In strict mode, some risky queries are not allowed to run. They include:
        Cartesian Product.
        No partition being picked up for a query.
        Comparing bigints and strings.
        Comparing bigints and doubles.
        Orderby without limit.
</description>
</property>

案例实操:

1)把hive.fetch.task.conversion设置成none,然后执行查询语句,都会执行mapreduce程序。

hive (default)> set hive.fetch.task.conversion=none;

hive (default)> select * from emp;

hive (default)> select ename from emp;

hive (default)> select ename from emp limit 3;

2)把hive.fetch.task.conversion设置成more,然后执行查询语句,如下查询方式都不会执行mapreduce程序。

hive (default)> set hive.fetch.task.conversion=more;

hive (default)> select * from emp;

hive (default)> select ename from emp;

hive (default)> select ename from emp limit 3;

1.2 本地模式

        大多数的Hadoop Job是需要Hadoop提供的完整的可扩展性来处理大数据集的。不过,有时Hive的输入数据量是非常小的。在这种情况下,为查询触发执行任务消耗的时间可能会比实际job的执行时间要多的多。对于大多数这种情况,Hive可以通过本地模式在单台机器上处理所有的任务。对于小数据集,执行时间可以明显被缩短。

用户可以通过设置hive.exec.mode.local.auto的值为true,来让Hive在适当的时候自动启动这个优化。

set hive.exec.mode.local.auto=true;  //开启本地mr

//设置local mr的最大输入数据量,当输入数据量小于这个值时采用local  mr的方式,默认为134217728,即128M

set hive.exec.mode.local.auto.inputbytes.max=50000000;

//设置local mr的最大输入文件个数,当输入文件个数小于这个值时采用local mr的方式,默认为4

set hive.exec.mode.local.auto.input.files.max=10;

案例实操:

1. 开启本地模式,并执行查询语句

hive (default)> set hive.exec.mode.local.auto=true; 

hive (default)> select * from emp cluster by deptno;

Time taken: 1.328 seconds, Fetched: 14 row(s)

2. 关闭本地模式,并执行查询语句

hive (default)> set hive.exec.mode.local.auto=false;

hive (default)> select * from emp distribute by deptno;

Time taken: 20.09 seconds, Fetched: 14 row(s)

1.3 严格模式

        Hive提供了一个严格模式,可以防止用户执行那些可能意向不到的不好的影响的查询。

        通过设置属性hive.mapred.mode值为默认是非严格模式nonstrict 。开启严格模式需要修改hive.mapred.mode值为strict,开启严格模式可以禁止特定的查询。

<property>
    <name>hive.mapred.mode</name>
    <value>strict</value>
    <description>
      The mode in which the Hive operations are being performed. 
      In strict mode, some risky queries are not allowed to run. They include:
        Cartesian Product.
        No partition being picked up for a query.
        Comparing bigints and strings.
        Comparing bigints and doubles.
        Orderby without limit.
</description>
</property>

(1)对于使用了order by语句的查询,要求必须使用limit语句。因为order by为了执行排序过程会将所有的结果数据分发到同一个Reducer中进行处理,强制要求用户增加这个LIMIT语句可以防止Reducer额外执行很长一段时间。

(2)限制笛卡尔积的查询。


二、Hive要点总结

1. Hive是什么?

        Hive是一个基于Hadoop的数仓工具,可以将结构化的数据映射为一张表,并且提供了类SQL的操作语句HQL。

2. 内部表和外部表的区别

        区别在于删除的时候,删除内部表时会将元数据和hdfs中的数据一起删除,而删除外部表的时候不会删除hdfs中的数据。

3.  分区与分桶分别是如何实现的,有什么区别

        分区:将原本一个目录下的多个文件放到多个目录下进行存放

        分桶:将原本一个文件中的数据放到多个文件中进行存放

        区别:一个是面向目录的,一个是面向文件的

4. order by,sort by,distribute by,cluster by 之间的区别于联系

        区别:order by 用于全局排序,只有一个MapReduce程序。
                   sort by 每个MapReduce内部进行排序。
                   distribute by 进行分区,类似于MapReduce中的Partition,需要结合sort by使用

        联系:(1)distribute by 与 sort by 一起使用进行分区排序,遵循先分区后排序,distribute by 子句要写在sort by前面。
                   (2)当 distribute by 和 sort by 的字段相同的时候,可以使用 cluster by 进行分区排序,cluster by 既可以分区又可以排序,但是只能升序排序,不能指定排序规则为ASC或者DESC。

5. 自定义函数的步骤

(1)继承org.apache.hive.ql.UDF

(2)实现evaluate函数

(3)在hive的命令窗口创建函数:1)添加jar    2)创建函数

(4)使用函数

6. Hive调优

        Fetch抓取:hive.fetch.task.conversion (默认为none)设置为more,那么某些特定的查询就不会再走MapReduce,提高查询效率。

        本地模式:设置输入文件的大小和文件数量,设置hive.exec.mode.local.auto 的值为true。当数据量不超过设置的值的时候,可以在单台机器上处理所有任务,提高效率

        严格模式:hive.mapred.mode(默认是nonstrict)设置为strict即可开启严格模式。严格模式会对hql语句有有一些限制,比如:要求order by 语句后面必须加 limit,不允许使用笛卡尔积。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值