Hive优划

1.fetch task任务不走MapReduce,可以在hive配置文件中设置最大化和最小化fetch task任务;通常在使用hiveserver2时调整为more;

设置参数的优先级:在命令行或者代码设置参数 > hive-site.xml>hive-default.xml

set hive.fetch.task.conversion=more; //单次交互模式下有效,

bin/hive --hiveconf hive.fetch.task.conversion=more

 

上面的两种方法都可以开启了Fetch任务,但是都是临时起作用的;如果你想一直启用这个功能,可以在${HIVE_HOME}/conf/hive-site.xml里面加入以下配置:

hive.fetch.task.conversion

more

Some select queries can be converted to single FETCH task

minimizing latency.Currently the query should be single

sourced not having any subquery and should not have

any aggregations or distincts (which incurrs RS),

lateral views and joins.

1. minimal : SELECT STAR, FILTER on partition columns, LIMIT only

2. more : SELECT, FILTER, LIMIT only (+TABLESAMPLE, virtual columns)

 

2.strict mode:严格模式设置,严格模式下将会限制一些查询操作

文件格式,ORC PARQUET 等

分区表

select 查询不加where过滤条件,不会执行

开启严格模式

hive提供的严格模式,禁止3种情况下的查询模式。

a:当表为分区表时,where字句后没有分区字段和限制时,不允许执行。

b:当使用order by语句时,必须使用limit字段,因为order by 只会产生一个reduce任务。

c:限制笛卡尔积的查询。sql语句不加where不会执行

 

hive.mapred.mode

nonstrict

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.

 

3.优化sql语句,如先过滤再join,先分组再做distinct;

Select count(*) cnt

From store_sales ss

join household_demographics hd on (ss.ss_hdemo_sk = hd.hd_demo_sk)

join time_dim t on (ss.ss_sold_time_sk = t.t_time_sk)

join store s on (s.s_store_sk = ss.ss_store_sk)

Where

t.t_hour = 8

t.t_minute >= 30

hd.hd_dep_count = 2

order by cnt;

 

4.MapReduce过程的map、shuffle、reduce端的snappy压缩

 

需要先替换hadoop的native本地包开启压缩

在mapred-site.xml文件设置启用压缩及压缩编码

在执行SQL执行时设置启用压缩和指定压缩编码

 

set mapreduce.output.fileoutputformat.compress=true;

set mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.SnappyCodec

5.大表拆分成子表,提取中间结果集,减少每次加载数据

多维度分析,多个分析模块

每个分析模块涉及字段不一样,而且并不是表的全部字段

 

6.分区表及外部表

设计二级分区表(一级字段为天,二级字段设置小时)

创建的的是外部表,创建表时直接指定数据所在目录即可,不用再用load加载数据

 

7.设置map和reduce个数:默认情况下一个块对应一个map任务,map数据我们一般不去调整,reduce个数根据reduce处理的数据量大小进行适当调整体现“分而治之”的思想

 

set mapred.reduce.tasks=3;

 

8.JVM重用:一个job可能有多个map reduce任务,每个任务会开启一个JVM虚拟机,默认情况下一个任务对应一个JVM,任务运行完JVM即销毁,我们可以设置JVM重用参数,一般不超过5个,这样一个JVM内可以连续运行多个任务

JVM重用是Hadoop调优参数的内容,对Hive的性能具有非常大的影响,特别是对于很难避免小文件的场景或者task特别多的场景,这类场景大多数执行时间都很短。hadoop默认配置是使用派生JVM来执行map和reduce任务的,这是jvm的启动过程可能会造成相当大的开销,尤其是执行的job包含有成千上万个task任务的情况。

JVM重用可以使得JVM实例在同一个JOB中重新使用N次,N的值可以在Hadoop的mapre-site.xml文件中进行设置(建议参考5~10)

mapred.job.reuse.jvm.num.tasks(旧版)

mapreduce.job.jvm.numtasks(新版)

hadoop.apache.org/docs/r2.5.2/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml

http://hadoop.apache.org/docs/r2.5.2/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml

 

也可在hive的执行设置:

 

***set mapred.job.reuse.jvm.num.tasks=10;

hive (default)> set mapred.job.reuse.jvm.num.tasks;

mapred.job.reuse.jvm.num.tasks=1

 

9.推测执行:

例如一个Job应用有10个MapReduce任务(map 及reduce),其中9个任务已经完成,那么application Master会在另外启动一个相同的任务来运行未完成的那个,最后哪个先运行完成就把另一个kill掉

 

启用speculative最大的好处是,一个map执行的时候,系统会在其他空闲的服务器上启动相同的map来同时运行,哪个运行的快就使用哪个的结果,另一个运行慢的在有了结果之后就会被kill。

 

hive-site.xml

hive.mapred.reduce.tasks.speculative.execution=true;

hive.mapred.reduce.tasks.speculative.execution

true

Whether speculative execution for reducers should be turned on.

---------------------

原文:https://blog.csdn.net/u011331430/article/details/79038103

 

你可能感兴趣的:(Hive)