3.7-3.10 Hive 企业使用优化1

一、Fetch Task

在执行hive代码的时候,一条简单的命令大部分都会转换成为mr代码在后台执行,

但是有时候我们仅仅只是想获取一部分数据而已,仅仅是获取数据,还需要转化成为mr去执行吗?

那个也太浪费时间和内存啦,所以有一个hive的配置如下所示:

#在hive-default.xml.template默认配置中可知:SELECT STAR, FILTER on partition columns, LIMIT only
 这些查询是不走MapReduce的
<property>
  <name>hive.fetch.task.conversion</name>
  <value>minimal</value>
  <description>
    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 incurs RS), lateral views and joins.
    1. minimal : SELECT STAR, FILTER on partition columns, LIMIT only
    2. more    : SELECT, FILTER, LIMIT only (TABLESAMPLE, virtual columns)
  </description>
</property>


#我们还可以添加一下更多不走MapReduce的配置
hive-site.xml
    <property>
        <name>hive.fetch.task.conversion</name>
        <value>more</value>
        </property>


二、hive高级优化

1、大表拆分

CREATE  [EXTERNAL]  TABLE  [IF NOT EXISTS] [db_name.] table_name 
[AS select_statement];


2、外部表、分区表

结合使用

多级分区


3、数据

存储格式(textfile、orcfile、parquet)

数据压缩(snappy)

4、SQL

优化SQL语句;

join,where


5、MapReduce

JVM重用

推测执行


三、join

Common/Shuffle/Reduce Join

Map Join

SMB Join
在编写带有 join 操作的代码语句时,应该将条目少的表/子查询放在 Join 操作符的左边。 
因为在 Reduce 阶段,位于 Join 操作符左边的表的内容会被加载进内存,载入条目较少的表 
可以有效减少 OOM(out of memory)即内存溢出。所以对于同一个 key 来说,对应的 value 值小的放前,大的放后,
这便是“小表放前”原则。 若一条语句中有多个 Join,依据 Join 的条件相同与否,有不同的处理方法。


1、Common/Shuffle/Reduce  Join

连接发生的阶段,发生在Reduce Task
大表对大表
表的数据放都从文件中读取


2、map Join

#map Join
    连接发生的阶段,发生在Map Task
    小表对大表I
    大表的数据放从文件中读取cid
    小表的数据内存中id
    DistributedCache类:此类就是将小表缓存到内存中


Map Join:在Map端完成Join

自动的mapjoin:

通过修改以下配置启用自动的mapjoin: set hive.auto.convert.join = true; (该参数为true时,Hive自动对左边的表统计量,如果是小表就加入内存,即对小表使用Map join)(默认左边的加载到内存中去)


相关配置参数: hive.mapjoin.smalltable.filesize;   
(大表小表判断的阈值,如果表的大小小于该值则会被加载到内存中运行) 
hive.ignore.mapjoin.hint;(默认值:true;是否忽略mapjoin hint 即mapjoin标记) 
hive.auto.convert.join.noconditionaltask; (默认值:true;将普通的join转化为普通的mapjoin时,是否将多个mapjoin转化为一个mapjoin) 
hive.auto.convert.join.noconditionaltask.size; (将多个mapjoin转化为一个mapjoin时,其表的最大值)


3、SMB Join

###
set hive.auto.convert.sortmerge.join=true
set hive.optimize.bucketmapjoin=true;
set hive.optimize.bucketmapjoin.sortedmerge=true;
posted @ 2019-04-28 15:03  米兰的小铁將  阅读(156)  评论(0编辑  收藏  举报