目录
一、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,不允许使用笛卡尔积。