HiveQL调优

使用EXPLAIN

使用EXPLAIN可以打印出查询语句的抽象语法树,比如下面的:

EXPLAIN SELECT SUM(number) FROM onecol;

HiveQL调优_第1张图片

还可以使用EXPLAIN EXTENDED产生更多的输出信息。可以通过分析语句的语法树来查找问题所在。

join优化

  • hive做联结操作时,会先对前面的表缓存,然后扫描最后一张表。所以,联结的时候最好保证联结查询中的表的大小从左往右是依次增加的
  • 如果表中有一张是小表,可以在最大的表通过mapper的时候将小表完全放到内存中。Hive可以在map端执行联结过程(map-side Join),这是因为Hive可以和内存中的小表进行逐一匹配,从而省略常规联结操作所需要的reduce过程。

本地模式

对于数据量很小的情况,hive在单台机器上处理会更快。
在执行中临时启用本地模式可以使用下面的方法:

SET oldjobtracker=${hiveconf:mapred.job.tracker};
SET mapred.job.tracker=local;
SET mapred.tmp.dir=/home/edward/tmp;
// 执行的sql
//执行完毕后换回分布式
SET mapred.job.tracker=${oldjobtracker};

还可以通过将hive.exec.mode.local.auto的值设置为true来让hive在适当的时候自动启动这个优化。
HiveQL调优_第2张图片

并行执行

Hive会将一个查询转换成一个或者多个阶段,可以是mapreduce阶段,抽样阶段,合并阶段,limit阶段,或者其他阶段。这些阶段一般是按顺序执行的,但是这些阶段有可能并非相互依赖,因此可以并发执行。
通过设置hive.exec.parallel的值为true可以开启并发执行。

严格模式

通过设置属性hive.mapred.mode的值为strict可以禁止三种类型的查询:

  • 查询分区表时没有添加分区限制
  • 使用order by查询时没有添加limit限制
  • 笛卡尔积查询

调整mapper和reducer的个数

hive一般会根据输入输出的数据量自动分配mapper和reducer的个数,但是有时候会产生一些问题。比如说mapper阶段过后产生远比输入时多的数据,这是默认的reducer数量就不够了,相反,如果map阶段产生的数据远少于输入数据,那么根据输入数据量确定的reducer数量就会太多,浪费资源。因此,有些时候需要设置reducer的数量。
通过设置mapred.reduce.tasks的值为不同的值来确定使用较多还是较少的reducer来缩短执行时间。
在共享集群上处理大任务时,为了控制资源利用情况,需要设置属性hive.exec.reducer.max,这个属性的一个建议计算公式如下:(集群总reduce槽位个数*1.5) / (执行中的查询的平均个数)。1.5是一个经验系数。

JVM重用

当遇到很多小文件或者task特别多的场景时,jvm的启动会造成很大的开销,因此可以将jvm在同一个job中重新使用N次。jvm重用是hadoop调优参数的内容,可以在hadoop的mapred-site.xml文件中进行设置:

<property>
    <name>mapred.job.reuse.jvm.num.tasksname>
    <value>10value>
    <description>How many tasks to run pre jvm. If set to -1, there is no limit.description>
property>

开启这个重用后jvm会一直占用使用到的task插槽,知道任务结束才能释放。

索引

还可以通过添加索引来优化

动态分区调整

如果分区个数过多会产生大量的输出控制流,可以通过配置来限制分区的个数。
首先将动态分区模式设置为严格模式,在严格模式下,必须保证至少有一个分区是静态的:

<property>
    <name>hive.exec.dynamic.partition.modename>
    <value>strictvalue>
    <description>description>
property>

然后设置创建的最大动态分区个数:

<property>
    <name>hive.exec.dynamic.partition.pernodename>
    <value>10000value>
    <description>description>
property>

还有一个配置用来控制DataNode上一次可以打开的文件的个数,这个属性在hdfs-site.xml中配置:

<property>
    <name>dfs.datanode.max.xcieversname>
    <value>8192value>
property>

推测执行

推测执行是hadoop的一个功能,可以触发执行一些重复的任务。主要是通过加快获取单个task的结果以及进行侦测将执行慢的TaskTracker加入黑名单的方式来提高整体任务执行效率。
可以在mapred-site.xml中配置:
HiveQL调优_第3张图片
也可以直接在hive中配置:
在这里插入图片描述

单个MapReduce中多个GROUP BY

<property>
    <name>hive.multigroupby.singlemrname>
    <value>falsevalue>
    <description>description>
property>

虚拟列

可以通过设置虚拟字段来查看将要进行划分的文件名和用于文件中的块内偏移量,可以查看到哪个文件甚至哪行文件出现问题:

SET hive.exec.rowoffset=true;

查询实例如下:

SELECT INPUT__FILE__NAME, BLOCK__OFFSET__INSIDE_FILE, line FROM hive_text WHERE line LIKE '%hive%' LIMIT2;

你可能感兴趣的:(大数据,hive,big,data,大数据)