Hive 优化

1.核心思想:

把Hive SQL 当做Mapreduce程序去优化
以下SQL不会转为Mapreduce来执行
select仅查询本表字段
where仅对本表字段做条件过滤
 
Explain 显示执行计划
EXPLAIN [EXTENDED] query

2.Hive运行方式:

本地模式
集群模式
 

2.1开启本地模式:

set hive.exec.mode.local.auto=true;

2.2注意:

hive.exec.mode.local.auto.inputbytes.max  #默认值为128M
表示加载文件的最大值,若大于该配置仍会以集群方式来运行!

3.并行计算

通过设置以下参数开启并行模式:
set hive.exec.parallel=true;
注意:hive.exec.parallel.thread.number=xxxxx
(一次SQL计算中允许并行执行的job个数的最大值)

4.严格模式

4.1通过设置以下参数开启严格模式:

set hive.mapred.mode=strict;
(默认为:nonstrict非严格模式)

4.2查询限制:

1、对于分区表,必须添加where对于分区字段的条件过滤;
2、order by语句必须包含limit输出限制;
3、限制执行笛卡尔积的查询。

5.Hive排序

Order By - 对于查询结果做全排序,只允许有一个reduce处理(当数据量较大时,应慎用。严格模式下,必须结合limit来使用)
Sort By - 对于单个reduce的数据进行排序
Distribute By - 分区排序,经常和Sort By结合使用
Cluster By - 相当于 Sort By + Distribute By(Cluster By不能通过asc、desc的方式指定排序规则;
可通过 distribute by column sort by column asc|desc 的方式)

6.Hive Join

Join计算时,将小表(驱动表)放在join的左边
Map Join:在Map端完成Join
两种实现方式:

SQL方式,在SQL语句中添加MapJoin标记(mapjoin hint)

语法:
SELECT  /*+ MAPJOIN(smallTable) */  smallTable.key,  bigTable.value
FROM smallTable JOIN bigTable ON smallTable.key = bigTable.key;

开启自动的MapJoin

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

大表小表判断的阈值,如果表的大小小于该值则会被加载到内存中运行

hive.mapjoin.smalltable.filesize;   

默认值:true;是否忽略mapjoin hint 即mapjoin标记

hive.ignore.mapjoin.hint;

默认值:true;将普通的join转化为普通的mapjoin时,是否将多个mapjoin转化为一个mapjoin

hive.auto.convert.join.noconditionaltask;  

6.6将多个mapjoin转化为一个mapjoin时,其表的最大值

hive.auto.convert.join.noconditionaltask.size;    
 

7.Map-Side聚合

7.0通过设置以下参数开启在Map端的聚合:

set hive.map.aggr=true;
相关配置参数:

map端group by执行聚合时处理的多少行数据(默认:100000)

hive.groupby.mapaggr.checkinterval;

进行聚合的最小比例(预先对100000条数据做聚合,若聚合之后的数据量/100000的值大于该配置0.5,则不会聚合)

hive.map.aggr.hash.min.reduction:

map端聚合使用的内存的最大值

hive.map.aggr.hash.percentmemory:

map端做聚合操作是hash表的最大可用内容,大于该值则会触发flush

hive.map.aggr.hash.force.flush.memory.threshold:

是否对GroupBy产生的数据倾斜做优化,默认为false

hive.groupby.skewindata

8.控制Hive中Map以及Reduce的数量

8.1Map数量相关的参数

一个split的最大值,即每个map处理文件的最大值

mapred.max.split.size
 
一个节点上split的最小值
mapred.min.split.size.per.node
一个机架上split的最小值
mapred.min.split.size.per.rack

8.2Reduce数量相关的参数

强制指定reduce任务的数量
mapred.reduce.tasks
每个reduce任务处理的数据量
hive.exec.reducers.bytes.per.reducer
每个任务最大的reduce数
hive.exec.reducers.max

9.Hive - JVM重用

9.1适用场景:

1、小文件个数过多
2、task个数过多
通过下面参数来设置
set mapred.job.reuse.jvm.num.tasks=n; 
(n为task插槽个数)

9.2缺点:

设置开启之后,task插槽会一直占用资源,不论是否有task运行,直到所有的task即整个job全部执行完成时,才会释放所有的task插槽资源!

hive学习(八)hive优化的更多相关文章

  1. hive学习(二) hive操作

    hive   ddl 操作官方手册https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL hive  dml 操作官方手 ...

  2. hive学习(四) hive的函数

    1.内置运算符 1.1关系运算符 运算符 类型 说明 A = B 所有原始类型 如果A与B相等,返回TRUE,否则返回FALSE A == B 无 失败,因为无效的语法. SQL使用”=”,不使用”= ...

  3. hive学习(三) hive的分区

    1.Hive 分区partition 必须在表定义时指定对应的partition字段 a.单分区建表语句: create table day_table (id int, content string ...

  4. Hive学习笔记——Hive中的分桶

    对于每一个表(table)或者分区, Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分.Hive也是针对某一列进行桶的组织.Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记 ...

  5. Hive学习:Hive连接JOIN用例详解

    1 准备数据: 1.1 t_1 01 张三 02 李四 03 王五 04 马六 05 小七 06 二狗 1.2 t_2 01 11 03 33 04 44 06 66 07 77 08 88 1.3 ...

  6. Hive学习 系列博客

    原 Hive作业优化 原 Hive学习六:HIVE日志分析(用户画像) 原 Hive学习五--日志案例分析 原 Hive学习三 原 Hive学习二 原 Hive学习一 博客来源,https://blo ...

  7. hive学习

    大数据的仓库Hive学习  10期-崔晓光 2016-06-20  大数据   hadoop   10原文链接 我们接着之前学习的大数据来学习.之前说到了NoSql的HBase数据库以及Hadoop中 ...

  8. Hive学习路线图(转)

    Hadoophivehqlroadmap学习路线图   1 Comment Hive学习路线图 Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, Pig ...

  9. 【转】Hive学习路线图

    原文博客出自于:http://blog.fens.me/hadoop-hive-roadmap/ 感谢! Hive学习路线图 Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Ha ...

  10. Hive学习路线图--张丹老师

    前言 Hive是Hadoop家族中一款数据仓库产品,Hive最大的特点就是提供了类SQL的语法,封装了底层的MapReduce过程,让有SQL基础的业务人员,也可以直接利用Hadoop进行大数据的操作 ...

随机推荐

  1. 《Linux内核设计与实现》第5章读书笔记

    第五章 系统调用 一.系统调用概述 系统调用在Linux中称为syscall,返回的值是long型变量:如果出错,C库会将错误代码写入errno全局变量(通过调用perror()函数可以把该变量翻译成 ...

  2. Linux内核设计与实现第五周读书笔记

    第十八章 调试 18.1准备开始 需要的只是: 一个确定的bug.大部分bug通常都不是行为可靠而且定义明确的. 一个藏匿bug的内核版本. 相关的内核代码的知识和运气. 18.2内核中的bug 内核 ...

  3. sz与rz命令

    一般来说,linux服务器大多是通过ssh客户端来进行远程的登陆和管理的,使用ssh登陆linux主机以后,如何能够快速的和本地机器进行文件的交互呢,也就是上传和下载文件到服务器和本地:   与ssh ...

  4. 序列计数(count)

    Portal -->broken qwq Description ​​  给你一个长度为\(n\)的序列,序列中的每个数都是不超过\(m\)的正整数,求满足以下两个条件的序列数量: 1.序列中至 ...

  5. 【loj6198】谢特

    Portal -->loj6198 Solution ​ (为什么感觉loj上面这几道后缀数组的题..套路都是一样的啊qwq) ​ 同样也是..考虑某个区间\(height[i]\)的最小值的贡 ...

  6. 那些你不常用却非常有用的MySql语句和命令

    操作数据库 关于数据库的操作比较少,主要是:看.建.用.删. 查看数据库 获取服务器上的数据库列表通常很有用.执行show databases;命令就可以搞定. 1 mysql> show da ...

  7. Codeforces Round #338 (Div. 2) B dp

    B. Longtail Hedgehog time limit per test 3 seconds memory limit per test 256 megabytes input standar ...

  8. C ------ static 关键字的作用

    首先要理解生存周期与作用域的区别: 生存周期: 变量从定义到销毁的时间范围.存放在全局数据区的变量的生存周期存在于整个程序运行期间,而存放在栈中的数据则随着函数等的作用域结束导致出栈而销毁,除了静态变 ...

  9. 练习calico的网络policy

    1.安装docker,kubelet kubeadm kubectl 1 ssh-keygen 2 cat .ssh/authorized_keys 3 cat .ssh/id_rsa.pub 4 s ...

  10. php数组定义

    $arr = array( ,), //是’0' ,不是[‘0’] ,), ,), ,), ); $arr = [ '0' => array(2,3), //是’0' ,不是[‘0’] '1' ...