Hive优化(下面的红色标记是十分重要的,大部分情况是需要开启的)

优化1:hive的抓取策略
理论上来说,Hive中的所有sql都需要进行mapreduce,但是hive的抓取策略帮我们
省略掉了这个过程,把切片split的过程提前帮我们做了。
Set hive.fetch.task.conversion=none;
(一旦进行这么设置,select字段名也是需要进行mapreduce的过程,默认是more)

查看怎么将一个sql转化成一个MR任务的
explain sql语句
例如:
explain select count(*) from stu_dy1_1;
更加详细的查看,例如:
explain extended select count(*) from stu_dy1_1;
当你输入一个sql语句的时候,hive会将对其关键字进行截串,截完串之后,变成
都是一些TOK开头的一些东西,然后经过这样的抽象语法树,再转成具体的查询块,
最后变成逻辑查询计划

优化2:本地模式进行运行
本地模式运行比集群模式块很多,33秒的任务降到2秒
更改为本地模式:
hive> set hive.exec.mode.local.auto=true
注意:
hive> set hive.exec.mode.local.auto.inputbytes.max=128
(默认值就是128)
表示加载文件的最大值,若大于该配置仍然会以集群的方式去运行。
97万行数据,50MB
当我们开发或者测试阶段,可以去使用本地模式进行运行,默认是集群模式
但是,这里有个问题,当我们去更改为本地模式的时候,在8088的页面上就看不到
任务的执行情况了。

优化3:并行计算
通过设置以下参数开启并行模式(默认是false)
set hive.exec.parallel=true;

注意:hive.exec.parallel.thread.number
(一次SQl计算中允许并行执行的job个数最大值,默认是8个)

举例:
select t1.n1,t2.n2 from (select count(id) as n1 from spn31) t1,(select count(name) as n2 from stu_dy1_1) t2;
注意,有时候开启并行计算运行时间并没有不开启的快,那是因为,资源的问题。
需要两套资源,资源申请会浪费点时间,最多可以并行8个,默认是8个。
所以,并行的越多,不一定是越快,因为它涉及到一个资源申请的策略。

优化4:严格模式
(注意,这里的严格模式和动态分区的那个严格模式半毛钱关系没有)
通过设置以下参数开启严格模式:
set hive.mapred.mode=strict;
(默认为:nonstrict非严格模式)

查询限制:
1、对于分区表,必须添加where对于分区字段的条件过滤
2、order by 语句必须包含limit输出限制
3、限制执行笛卡尔积的查询
这些限制是帮助我们提高查询效率的。

优化5:Hive排序(掌握distribute by和sort by)
order by 对于查询结果做全排序,只允许有一个reduce处理
(注意:它会把我们所有的字段或者查询结果全部放在一个reduce里进行处理
当数据量较大时候,有可能reduce执行不完,所以,我们以后把这个给弃用掉)

**   sort by 对于单个reduce进行排序 但是我们将每个reduce里面进行排序,没有考虑到
每个reduce之间的排序。所以我们引出下一个
**   distribute by 分区排序,通常结合sort by一起使用
distribute by column sort by column asc|desc

cluster by 相当于sort by + distribute by (注意,虽然是两个结合,但是我们也不去用它
原因很简单,cluster by不能通过asc desc的方式指定排序方式规则)

优化6:**** Hive join ****数据倾斜
join计算的时候,将小表(驱动表)放在join的左边
Map join:在Map端完成join
两种实现方式:
1、sql方式,在sql语句中添加Mapjoin标记(mapjoin hint)
>>语法:
select /*+MAPJOIN(smallTable)*/ smallTable.key bigTable.value from smallTable join bigTable on smallTable.key=bigTable.key;
2、自动开启mapjoin
通过修改以下配置启用自动的mapjoin:
set hive.auto.convert.join=true;
(注意:该参数为true的时候,Hive自动对左边的表统计量,如果
是小表,就加入到内存,即对小表使用Mapjoin)

相关配置参数
  hive.mapjoin.smalltable.filesize;(默认25M,大表小表判断的阈值,如果表的大小小于该值则会被加载到内存中运行。)
  hive.ignore,mapjoin.hint;(默认值:true;是否忽略mapjoin hint的标记)
  hive.auto.convert.join.noconditionaltask;(默认值:true;将普通的join转换为mapjoin时,是否将多个mapjoin转化为一个mapjoin)
  hive.auto.convert.join.noconditionaltask.size;(将多个mapjoin转化为一个mapjoin时,这个表的最大值)
3、尽可能使用相同的连接键,如果不同,多一个join就会多开启一个mapreduce,执行速度变得慢。
4、大表join大表(当两个都是大表的时候,只能发生reduce了,但是这里有两个优化策略)(面试的时候说,加分)
  a: 空key过滤:
    有时join超时是因为某些key对应的数据太多,而相同key对应的数据都会发送到相同的 reducer上,从而导致内存不够。
    此时我们应该仔细分析这些异常的key,很多情况下,这些key对应的数据是异常数据,我们需要在SQL语句中进行过滤。
    但是这个的前提条件是异常数据,但是我们一般拿到的数据都是经过ETL数据清洗过后的,一般影响不大,面试的时候可以说。
  b: 空key转换:
    有时虽然某个key为空对应的数据很多,但是相应的数据不是异常数据,必须要包含在join的结果中,
    此时我们可以表a中key为空的字段赋随机的值,使得数据随机均匀地分不到不同的 reducer上。
    但是我们一般拿到的数据都是经过ETL数据清洗过后的,规则数据,一般影响不大,面试的时候可以说。
5、Map-Side聚合
通过设置以下参数开启在Map端的聚合
set hive.map.aggr=true;(一定要进行开启,虽然进行了两个mapreduce,但是当数据倾斜发生的时候,很多时候会根本跑不出结果,卡死在99%或者100%,慢总比出不来结果要好)!!!!!!!
相关配置参数
  hive. groupby mapaggr. checkinterval;
  map端 igroup by执行聚合时处理的多少行数据(默认:10000
  hive.map.aggr.hash.min.reduction;比例(若聚合之后的数据100大该0.5,map端聚合使用的内存的最大值
  hive.mapaggr.hashforce.flush.memory.threshold;map端做聚合操作是has表的最大可用内容,大于该值则会触发fush
  hive.groupby.skewindata-是否对 GroupBy产生的数据倾斜做优化,默认为false(十分重要!!!)
6、数据倾斜,尽可能地让我们的数据散列到不同的reduce里面去

优化6:**** 合并小文件 ****
Hive优化
合并小文件
文件数目小,容易在文件存储端造成压力,给hdfs造成压力,影响效率
设置合并属性
  是否合并map输出文件: hive.merge.mapfiles=true
  是否合并reduce输出文件: hive.merge.mapredfiles=true
  合并文件的大小: hive.merge.size.per.task=256*1000*1000
去重统计
数据量小的时候无所谓,数据量大的情况下,由于 COUNT DISTINCT操作需要用一个 Reduce Task来完成,
这一个 Reduce需要处理的数据量太大,就会导致整个Jb很难完成,一般 COUNT DISTINCT使用先 GROUP BY再COUNT的方式替换

优化7、控制map和reduce的数量(一般情况下我们不去动它)
控制Hive中Map以及 Reduce的数量
Map数量相关的参数
mapred.max.split.size;一个split的最大值,即每个map处理文件的最大值
mapred.min.split.size.per.node个节点上split的最小值
mapred.min.split.size.per.rack一个机架上spit的最小值
Reduce数量相关的参数
mapred.reduce.tasks;强制指定reduce任务的数量
hive.exec.reducers.bytes.per.reducer每个reduce任务处理的数据量
hive.exec.reducers.max每个任务最大的reduce数

优化8、JVM重用
当我们的小文件个数过多,task个数过多,需要申请的资源过多的时候,我们可以先申请一部分资源,全部执行完毕后再释放,
比我们申请一个释放一个要快。
通过 set mapred.job.reuse.jvm.num.tasks=n;来设置
(n为task插槽个数)
缺点:
设置开启后,task插槽会一直占用资源,无论是否有task进行,直到所有的task,
即整个job全部执行完毕后,才会释放所有的task插槽,所以我们要合理地设置这个n
(比如,我们设置申请了10个,但是现在来了6个,剩下4个插槽会在job全部执行完毕之前一直占用资源)

大数据之路Week08_day03 (Hive优化)的更多相关文章

  1. 大数据开发实战:Hive优化实战3-大表join大表优化

    5.大表join大表优化 如果Hive优化实战2中mapjoin中小表dim_seller很大呢?比如超过了1GB大小?这种就是大表join大表的问题.首先引入一个具体的问题场景,然后基于此介绍各自优 ...

  2. 大数据开发实战:Hive优化实战2-大表join小表优化

    4.大表join小表优化 和join相关的优化主要分为mapjoin可以解决的优化(即大表join小表)和mapjoin无法解决的优化(即大表join大表),前者相对容易解决,后者较难,比较麻烦. 首 ...

  3. 大数据开发实战:Hive优化实战1-数据倾斜及join无关的优化

    Hive SQL的各种优化方法基本 都和数据倾斜密切相关. Hive的优化分为join相关的优化和join无关的优化,从项目的实际来说,join相关的优化占了Hive优化的大部分内容,而join相关的 ...

  4. 大数据系列之数据仓库Hive安装

    Hive系列博文,持续更新~~~ 大数据系列之数据仓库Hive原理 大数据系列之数据仓库Hive安装 大数据系列之数据仓库Hive中分区Partition如何使用 大数据系列之数据仓库Hive命令使用 ...

  5. 大数据系列之数据仓库Hive命令使用及JDBC连接

    Hive系列博文,持续更新~~~ 大数据系列之数据仓库Hive原理 大数据系列之数据仓库Hive安装 大数据系列之数据仓库Hive中分区Partition如何使用 大数据系列之数据仓库Hive命令使用 ...

  6. 大数据系列之数据仓库Hive原理

    Hive系列博文,持续更新~~~ 大数据系列之数据仓库Hive原理 大数据系列之数据仓库Hive安装 大数据系列之数据仓库Hive中分区Partition如何使用 大数据系列之数据仓库Hive命令使用 ...

  7. 大数据工具篇之Hive与MySQL整合完整教程

    大数据工具篇之Hive与MySQL整合完整教程 一.引言 Hive元数据存储可以放到RDBMS数据库中,本文以Hive与MySQL数据库的整合为目标,详细说明Hive与MySQL的整合方法. 二.安装 ...

  8. 大数据工具篇之Hive与HBase整合完整教程

    大数据工具篇之Hive与HBase整合完整教程 一.引言 最近的一次培训,用户特意提到Hadoop环境下HDFS中存储的文件如何才能导入到HBase,关于这部分基于HBase Java API的写入方 ...

  9. 大数据系列之数据仓库Hive中分区Partition如何使用

    Hive系列博文,持续更新~~~ 大数据系列之数据仓库Hive原理 大数据系列之数据仓库Hive安装 大数据系列之数据仓库Hive中分区Partition如何使用 大数据系列之数据仓库Hive命令使用 ...

  10. 【大数据之数据仓库】GreenPlum优化器对比测试

    在< [大数据之数据仓库]选型流水记>一文中有提及,当时没有测试GreenPlum的quicklz压缩算法和ORCA查询优化器,考虑到quicklz压缩算法因为版权问题不会开源(详情请参阅 ...

随机推荐

  1. django静态文件、form表单和request对象

    目录 一.静态文件 1.静态文件概念 2.资源访问 3.静态文件资源访问 二.静态文件相关配置 1.接口前缀 2.接口前缀动态匹配 三.form表单 action属性 method属性 四.reque ...

  2. 【Python】【Pandas】使用concat添加行

    添加行 t = pd.DataFrame(columns=["姓名","平均分"]) t = t.append({"姓名":"小红 ...

  3. Spring boot 2.0 之优雅停机

    spring boot 框架在生产环境使用的有一段时间了,它"约定大于配置"的特性,体现了优雅流畅的开发过程,它的部署启动方式(java -jar xxx.jar)也很优雅.但是我 ...

  4. Qt/C++音视频开发72-倍速推流/音视频同步倍速推流/不改变帧率和采样率/低倍速和高倍速

    一.前言 最近多了个新需求,需要倍速推流,推流界的扛把子obs也有倍速推流功能,最高支持到两倍速.这里所说的倍速,当然只限定在文件,只有文件才可能有倍速功能,因为也只有文件才能倍速解码播放.实时视频流 ...

  5. Qt编写安防视频监控系统29-掉线重连

    一.前言 掉线重连在很早很早以前就做了,基本上的方法都是搞个变量存储最后收到图片的时间,然后开个定时器判断,如果不在暂停模式下,当前时间和最后收到图片的时间差值超过了设定的超时时间,比如5s则认为掉线 ...

  6. C# .Net FrameWork3.5中异步HTTP请求时,由于安全协议的问题System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)方法抛出“基础连接已经关闭: 发送时发生错误”的解决办法

    现象描述: C# .Net FrameWork3.5中异步HTTP请求时,由于安全协议的问题System.Net.HttpWebRequest.EndGetResponse(IAsyncResult ...

  7. 基于实践:一套百万消息量小规模IM系统技术要点总结

    本文由公众号"后台技术汇"分享,原题"基于实践,设计一个百万级别的高可用 & 高可靠的 IM 消息系统",原文链接在文末.由于原文存在较多错误和不准确内 ...

  8. Linux防火墙端口设置策略

    # 当我们在服务器上部署好我们的环境后,一定要检查一下防火墙的端口策略:否则客户端无法连接.# 查看防火墙状态 systemctl status firewalld # 查看防火墙设已开放的端口 # ...

  9. 《计算机体系结构与SoC设计》(二)

    1. 多指令流单数据流 多指令流单数据流(Multiple Instruction Stream, Single Data Stream,简称 MISD)是一种处理器设计概念,它允许处理器在单个时钟周 ...

  10. 隐藏zsh前面用户名或者主机名

    1. zshrc 修改 vim ~/.zshrc文件,在文件底部增加: prompt_context() {} 只保留用户名,隐藏主机名 prompt_context() { if [[ " ...