Hive环境调优总结,hive3大执行引擎区别在哪?

https://wjrsbu.smartapps.cn/zhihu/article?id=252288440&isShared=1&hostname=baiduboxapp&_swebfr=1

问题:hive 中count(*) 结果不准确?

场景:hive 中建表,

stored as parquet tblproperties ("parquet.compression"="lzo");

从ods层导入数据,先进行全表检索。 select * from dwd_fact_order_info where dt = "2020-10-01"

结果: Time taken: 0.359 seconds, Fetched: 149 row(s)

接下来这个count(*)就比较神奇了,结果变为150了,count(*) 不统计空行这是知道的,但是通过可视化工具连接hive发现该表数据没有空行。 select count(*) from dwd_fact_order_info where dt = "2020-10-01"

结果: _c0 150 Time taken: 2.376 seconds, Fetched: 1 row(s)

同时对该份数据进行简单查询,结果没有问题 select order_id from dwd_fact_order_info where dt = "2020-10-01"

结果: Time taken: 0.23 seconds, Fetched: 149 row(s)

但是继续对当前结果group by,却出现了& 符号。 select order_id from dwd_fact_order_info where dt = "2020-10-01" group by order_id

 

结果: Time taken: 2.404 seconds, Fetched: 150 row(s)

这个问题实在是有点迷,还在解决中。

「要对hive 进行调优,首先要对症下药,那么这一章先讲环境调优,下一次讲HQL调优。」

1、关于Hive的计算引擎

hadoop 的基本架构中的计算框架是map-reduce,简称MR,而Hive是基于hadoop的,所以Hive的默认引擎也是MR。 MR的速度确实非常感人的慢,随着计算引擎的更新,目前主要是Tez和Spark。那么这3个计算引擎的区别是什么

因为都运行在yarn 之上,所以这3个引擎可以随意切换。

1、MR

Map:

Reduce:

MR将一个算法抽象成Map和Reduce两个阶段进行处理,如果一个HQL经过转化可能有多个job,那么在这中间文件就有多次落盘,速度较慢。

2、Tez

关于tez的部署我也写过一篇文章

该引擎核心思想是将Map和Reduce两个操作进一步拆分,即Map被拆分成Input、Processor、Sort、Merge和Output,Reduce被拆分成Input、Shuffle、Sort、Merge、Processor和Output等,这样,这些分解后的元操作可以任意灵活组合,产生新的操作,这些操作经过一些控制程序组装后,可形成一个大的DAG作业。

Tez可以将多个有依赖的作业转换为一个作业(这样只需写一次HDFS,且中间节点较少),从而大大提升DAG作业的性能

3、Spark

  1. Spark是一个分布式的内存计算框架,其特点是能处理大规模数据,计算速度快。
  2. Spark的计算过程保持在内存中,减少了硬盘读写,能够将多个操作进行合并后计算,因此提升了计算速度。同时Spark也提供了更丰富的计算API,例如filter,flatMap,count,distinct等。
  3. 过程间耦合度低,单个过程的失败后可以重新计算,而不会导致整体失败;

2、hive的哪些查询不会走MR

这个问题就涉及到一个hive的配置,fetch的抓取。 Fetch抓取是指,Hive中对某些情况的查询可以不必使用MapReduce计算,配置在hive-default.xml.template中,默认就是more

<property> <name>hive.fetch.task.conversion</name> <value>more</value> <description> Expects one of [none, minimal, 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 incurs RS), lateral views and joins. 0. none : disable hive.fetch.task.conversion 1. minimal : SELECT STAR, FILTER on partition columns, LIMIT only 2. more : SELECT, FILTER, LIMIT only (support TABLESAMPLE and virtual columns) </description> </property>

在这种情况下,一些简单查询都不会走MR,所以如果是老版本的hive,可以把该配置改为more

1、全表扫描(不走)

select * from 表名;

2、抽样查询(不走)

select * from 表名 limit 2;

注意:在MYSQL中limit是取前几条记录,但是在Hive中,limit是抽样,「会随机返回对应的记录数」

3、等值比较(不走)

select * from 表名 where id=1;

 

4、模糊比较: LIKE(不走)

select * from 表名 where name like '%试' ;

 

5、不等值(不走)

6、大小比较(不走)

7、 空值判断(不走)

8、count(*) (根据where 条件判断)

表数据格式生成数据的时候,会将一些聚合计算结果(如 count avg)和少量索引等存到数据里面,所以你直接count(*) 这个表会从数据的元信息里面直接获取 但是如果你加上where条件count(*)肯定会产生mapreduce,因为元信息并不会存所有的聚合运算结果。

9、总结:

对于集合统计函数都会走MR,排除已经在元数据中存储的聚合运算结果

MR 实质上是对数据进行map 和reduce 两阶段的处理,那么我们在上述 不走MR的SQL中都是对元数据的查询和直接对hdfs 上单个文件的抓取和判断,并没有涉及到聚合。

3、日志处理

对于我们程序员来说,终于写好一个HQL准备测试一下,结果各种报错,此时最需要的莫过于记录详细执行情况的日志。

Hive使用log4j进行日志记录。默认情况下,客户端不会将日志发送到控制台。从Hive 0.13.0开始,默认日志记录级别为INFO。

hive.log.dir在$ HIVE_HOME / conf / hive-log4j.properties中进行设置。

目前版本的hive 连接,需要开启hiveServer2和metastore

hive的日志分为好几种

  1. 运行日志,也可以说是系统日志,记录了hive的运行情况,错误状况。
  2. 执行日志,记录了Hive 中job的执行的历史过程。
  3. beeline 日志

一般前2种看的比较多,那么如何设置呢? Hive运行日志

//修改获得hive-log4j.properties文件 mv hive-log4j.properties.template hive-log4j.properties //修改hive.log.dir的值,默认是在/tmp/${user}/hive.log hive.log.dir=$HIVE_HOME/log(自行设置)

hive任务执行日志

//修改获得hive-exec-log4j.properties文件 mv hive-exec-log4j.properties.template hive-exec-log4j.properties //修改hive.log.dir的值,默认是在/tmp/${user}/hadoop.log hive.log.dir=$HIVE_HOME/log(自行设置)

当然以上设置是全局生效,也可以在进入hive的时候,使用

hive --hiveconf hive.root.logger=DEBUG,console (hive启动时用该命令替代)

或者在${HIVE_HOME}/conf/hive-log4j.properties文件中找到hive.root.logger属性,并将其修改为下面的设置 hive.root.logger=DEBUG,console

设定Log的参数读取会在会话建立以前完成。这也就是说,我们不能通过下面的方法来修改log4j的日志输出级别:

hive> set hiveconf:hive.root.logger=DEBUG,console;(错误使用X)

4、本地模式

一般情况下,Hive编译器会为大多数查询生成多个MR job,然后把这些job提交到集群中执行。但是每次执行都要在集群中创建container,造成时间比较慢。 所以对于小型数据集,可以直接在本地模式运行,本地模式执行通常比将作业提交到集群要快得多。 注意:本地模式仅使用一个job运行,所以处理大型数据集的速度可能非常慢。

这其中时间只是节省在了每次提交到集群以及创建容器时间上了。

SET mapreduce.framework.name = local;(这是默认的)

所以一般在配置hadoop集群时,会在 mapred-site.xml的配置文件中配置。

<property> <name>mapreduce.framework.name</name> <value>yarn</value> <description>指定mr框架为yarn方式</description> </property>

除此之外,我们还可以利用本地模式帮助我们快速处理少量数据:

SET hive.exec.mode.local.auto = true;(默认是false)

如果启用了这个配置,Hive会分析查询中每个map-reduce作业的大小,如果满足以下阈值,才可以在本地运行它

  1. job的输入数据大小必须小于参数:hive.exec.mode.local.auto.inputbytes.max(默认128MB)
  2. job的map数必须小于参数:hive.exec.mode.local.auto.tasks.max(默认4)
  3. job的reduce数必须为0或者1 「(因为本地模式本身就仅使用一个map-reduce 运行)」

本地模式运行在Hive Client上一个独立的子JVM上,可以通过hive.mapred.local.mem参数来设置该子JVM最大内存,该参数默认值为0,在这种情况下,Hive会让Hadoop决定子JVM的默认内存限制。

5、JVM重用

JVM 重用只对MR引擎是有效的,因为MR任务中的mapTask 和ReduceTask都各自运行在一个独立的JVM进程中,同时「每个MapTask/ReduceTask都要经历申请资源 -> 运行task -> 释放资源的过程」。强调一点:每个MapTask/ReduceTask运行完毕所占用的资源必须释放,并且这些释放的资源不能够为该任务中其他task所使用。

所以开启JVM重用在一定程度上能缓解MapReduce让每个task动态申请资源且运行完后马上释放资源带来的性能开销

但是JVM重用并不是多个task可以并行运行在一个JVM进程中,而是「对于同一个job,一个JVM上最多可以顺序执行的task数目」,这个需要配置参数mapred.job.reuse.jvm.num.tasks,默认1。 通常在10-20之间,具体多少需要根据具体业务场景测试得出。

<property> <name>mapreduce.job.jvm.numtasks</name> <value>10</value> <description>How many tasks to run per jvm. If set to -1, there is no limit. </description> </property>

这个功能的缺点是,开启JVM重用将一直占用使用到的task插槽,以便进行重用,直到任务完成后才能释放。如果某个“不平衡的”job中有某几个reduce task执行的时间要比其他Reduce task消耗的时间多的多的话,那么保留的插槽就会一直空闲着却无法被其他的job使用,直到所有的task都结束了才会释放。

对于Spark 引擎来说,每次 MapReduce 操作是基于线程的,只在启动 Executor 时启动一次 JVM,内存的 Task 操作是在线程复用的。每次启动 JVM 的时间可能就需要几秒甚至十几秒。

6、严格模式

严格模式:防止用户执行一些影响比较大的sql set hive.mapred.mode = strict(默认为strict) 1、分区表的查询必须where 分区,也就是说不允许扫描所有的分区。 2、使用了order by 语句的查询,必须使用limit 语句。因为order by为了执行排序过程会将所有的结果数据分发到同一个Reducer中进行处理,强制要求用户增加这个LIMIT语句可以防止Reducer额外执行很长一段时间。 3、限制笛卡尔积的查询。对关系型数据库非常了解的用户可能期望在执行JOIN查询的时候不使用ON语句而是使用where语句,这样关系数据库的执行优化器就可以高效地将WHERE语句转化成那个ON语句。不幸的是,Hive并不会执行这种优化,因此,如果表足够大,那么这个查询就会出现不可控的情况。

7、并行模式

针对于不同业务场景SQL语句的执行情况,有些场景下SQL的执行是需要分割成几段去执行的,而且期间并不全是存在依赖关系。默认情况下,hive只会一段一段的执行mapreduce任务。使用并行的好处在于可以让服务器可以同时去执行那些不相关的业务场景

// 开启任务并行执行 set hive.exec.parallel=true; // 同一个sql允许并行任务的最大线程数 set hive.exec.parallel.thread.number=8;

以下sql 中union all前后的2个查询操作并无直接关联,因此没有必要顺序执行,因此优化的思路是让这2个查询操作并行执行。

select a.id,b.name form ( a union b )

扫码关注公众号“后来X大数据”,回复【电子书】,领取超多本pdf 【java及大数据 电子书】

http://weixin.qq.com/r/pUPx6a7EX-MgreqK9xa3 (二维码自动识别)

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
01_数仓项目介绍.avi4 b4 Q* Q8 Z0 Y) C6 O! w 02_数仓采集_用户行为采集课程介绍.avi8 \7 f3 O. c- {: v# W& V$ Y& b 03_数仓采集_数仓的概念.avi8 Z# X* q/ c; }3 A* [ T 04_数仓采集_项目需求.avi6 B8 n s0 h! M4 X# j! |0 ` 05_数仓采集_项目技术选型.avi8 [% N% W, U# y5 s 06_数仓采集_系统数据流程设计.avi8 N: L Y6 D6 y 07_数仓采集_框架版本选型.avi, k8 c& `! j& B 08_数仓采集_框架版本具体型号.avi1 x& Q/ D. O' l 09_数仓采集_服务器选型.avi3 _: b. H. i! a; O8 V3 A7 [1 s0 t; B 100_业务数仓_DWS层之用户行为宽表.avi* o! `2 N, _5 u& a$ W 101_业务数仓_需求九:GMV成交总额.avi; x4 H& X( _' I8 L7 r* n3 I/ y 102_业务数仓_需求十:ADS层之新增用户占日活跃用户比率.avi 103_业务数仓_需求十一:ADS层之用户行为漏斗分析.avi 104_业务数仓_用户购买商品明细表(宽表).avi 105_业务数仓_需求十二:ADS层品牌复购率.avi 106_业务数仓_需求十三:求每个等级的用户对应的复购率前十的商品排行(学生分享).avi6 e) h" C# G2 X+ z6 B 107_业务数仓_数据可视化.avi! @5 r5 g- n0 f, J3 l 108_业务数仓_Azkaban安装.avi( r9 z2 L3 \% G' k9 [: t9 K 109_业务数仓_GMV指标获取的全调度流程.avi& O, S. M2 Q# o 10_数仓采集_集群资源规划设计.avi 110_业务数仓_拉链表理论.avi 111_业务数仓_拉链表制作.avi+ k: N4 e; P4 X; ?( i' O0 {0 u. M9 Y 112_业务数仓_业务数仓项目总结.avi/ {1 S. ^* Y" b# M) | 113_业务数仓_即席数仓课程介绍.avi 114_即席数仓_Presto简介.avi+ r. E# z! Z4 t% o+ r8 }7 Q 115_即席数仓_Presto安装及使用.avi 116_即席数仓_Presto优化.avi% @4 x# m3 } G# h 117_即席数仓_Druid概念、特点、场景.avi 118_即席数仓_Druid对比其他框架.avi7 C4 m1 z" }# n% h( F 119_即席数仓_Druid框架原理.avi 11_数仓采集_测试集群服务器规划.avi* X" H5 S4 M1 C0 j" w 120_即席数仓_Druid数据结构.avi, V& D, ]# l" a0 R1 ?) n; L f 121_即席数仓_Druid安装.avi 122_面试题_总体架构.avi! c' O1 I8 T6 n Q 123_面试题_技术框架.avi 124_面试题_用户行为、业务数据、即席查询.avi4 N2 j# j6 P% O" a 125_面试题_开发经验.avi3 b$ C' k; H" B2 p# c( \ 126_CDH数仓_课程介绍.avi9 _. V/ m% J5 ^* s/ g+ f; g( s 127_CDH数仓_CM简介及架构.avi8 ]' ]* B! X' j. Z9 [ 128_CDH数仓_CM安装环境准备.avi, Q8 k8 x/ j3 v 129_CDH数仓_CM、Hadoop、Zookeeper安装.avi7 z) @! o) G0 @4 s; J 12_数仓采集_埋点数据基本格式.avi 130_CDH数仓_采集Flume的安装.avi# V L4 F& x1 t* }( Z8 F' o9 g' ` 131_CDH数仓_Kafka安装.avi" N8 o- i b/ W) o3 j8 j/ a/ g 132_CDH数仓_测试Flume和Kafka安装.avi 133_CDH数仓_消费Flume配置完成.avi6 ?$ m3 H4 m; C# ^$ j 134_CDH数仓_Hive、Oozie、Hue安装.avi# ]& Y, M2 |) A( o# Y( b& w 135_CDH数仓_用户行为数仓ODS层导数据.avi 136_CDH数仓_用户行为数仓完结.avi. F4 z* v& a; q" }% V* \ 137_CDH数仓_业务数据生成.avi7 W7 \$ ~$ n% w2 N, {( A; l! }8 K: S 138_CDH数仓_业务数仓完结.avi! N7 f. d0 U2 N( }' w) P- b" S 139_CDH数仓_Oozie执行前准备.avi 13_数仓采集_事件日志数据(上).avi2 S' ` H& ^& S3 a1 X 140_CDH数仓_Oozie任务编写及运行.avi 141_CDH数仓_即席查询数仓搭建Impala.avi 142_CDH数仓_Spark安装及总结.avi 14_数仓采集_事件日志数据(下).avi 15_数仓采集_日志生成代码编写.avi4 |* G) Z3 J4 ]/ b9 z$ @ 16_数仓采集_Logback日志打印控制.avi 17_数仓采集_服务器准备.avi 18_数仓采集_Hadoop安装.avi 19_数仓采集_项目经验之HDFS多目录配置.avi 20_数仓采集_项目经验之支持LZO压缩配置.avi j3 Q& D8 m* G9 R Q$ G 21_数仓采集_项目经验之基准测试.avi 22_数仓采集_项目经验之HDFS参数调优.avi; F" t) F) H7 W' {& L% n3 H ~7 s 23_数仓采集_Zookeeper安装.avi6 c1 v9 x4 \% K5 D. \0 M 24_数仓采集_项目经验之ZK集群启动停止脚本.avi( i1 P# ^( y1 Q- a 25_数仓采集_生成测试日志.avi 26_数仓采集_集群日志生成启动脚本.avi 27_数仓采集_集群时间同步修改脚本.avi, n2 a/ j1 @) t* d w 28_数仓采集_集群所有进程查看脚本.avi 29_数仓采集_每日回顾.avi; R" Y P2 X, E/ [+ B' j# ~& K. e 30_数仓采集_日志采集Flume安装.avi* V0 |0 U7 o- @* R; w) M 31_数仓采集_Flume组件及配置.avi 32_数仓采集_日志采集Flume配置分析.avi U6 j% Q4 F$ T6 U5 ^ 33_数仓采集_ETL拦截器.avi 34_数仓采集_分类型拦截器.avi! b5 ^. a8 ^; }$ x8 z) l2 U3 }" p 35_数仓采集_日志采集Flume启动停止脚本.avi2 ~/ r- J: h$ U, q/ e# e7 k% M 36_数仓采集_Kafka集群安装.avi3 L6 `7 F& o/ U6 F" U5 U 37_数仓采集_Kafka集群启动停止脚本.avi 38_数仓采集_Kafka Manager安装及脚本.avi& h9 z' v' g0 ^. }0 j 39_数仓采集_项目经验之Kafka压力测试.avi7 ~8 m+ w$ q/ G$ ?- _- K 40_数仓采集_项目经验之Kafka机器数量计算.avi 41_数仓采集_消费Kafka数据Flume.avi 42_数仓采集_项目经验之Flume内存优化.avi; q3 Q6 E! I, d7 n& k# {# B6 K 43_数仓采集_项目经验之Flume组件.avi- S+ J+ s/ {5 S0 d 44_数仓采集_采集通道启动停止脚本.avi! Q; X6 }4 C" g. f 45_数仓采集_调试经验.avi! P; q2 w N1 c i5 Z' c; i" i' O- x 46_数仓采集_面试题(Linux、Shell、Hadoop).avi2 R" A6 R7 D' p9 h( i. \ I" F9 w 47_数仓采集_面试题(Flume、Kafka).avi& A1 w0 W) S1 ~# i& n, } ~6 o( b& o 48_用户行为数仓_每日回顾.avi% U( @. v7 D* C* B W J 49_用户行为数仓_用户行为数仓课程介绍.avi 50_用户行为数仓_为什么要分层.avi! J- C* F* K' R* l 51_用户行为数仓_数仓分层.avi4 W _. ]: j5 U; l$ Q9 l. Q [/ u 52_用户行为数仓_数据集市与数据仓库概念.avi5 U5 c# e( Y8 B% c 53_用户行为数仓_数仓命名规范.avi 54_用户行为数仓_Hive&MySQL;安装.avi 55_用户行为数仓_Hive运行引擎Tez.avi! L# \% m0 s- F; A" q 56_用户行为数仓_项目经验之元数据备份.avi 57_用户行为数仓_ODS层启动日志和事件日志表创建.avi 58_用户行为数仓_ODS层加载数据脚本.avi' J8 ^- I/ b5 O3 Y) @9 a- h 59_用户行为数仓_DWD层启动日志建表及导入数据.avi9 h3 [. T0 F1 ~6 s! i/ J 60_ 用户行为数仓_DWD层启动表加载数据脚本.avi$ \1 Z0 Z/ m; d: F+ B5 u$ c 61_用户行为数仓_DWD层事件基础明细表创建.avi; Y& i+ U7 S6 P" X) T3 n! V 62_用户行为数仓_自定义UDF函数(解析公共字段).avi7 Q/ i) X8 O6 S0 M( V' m- ]- M 63_用户行为数仓_自定义UDTF函数(解析事件日志基础明细表).avi 64_用户行为数仓_DWD层数据解析脚本.avi 65_用户行为数仓_DWD层事件表加载数据脚本.avi 66_用户行为数仓_今日回顾.avi* e9 W+ P$ {5 ?! x9 [- e5 ]# a 67_用户行为数仓_业务术语.avi 68_用户行为数仓_日期的系统函数.avi 69_用户行为数仓_每日活跃设备明细.avi 70_用户行为数仓_每周活跃设备明细.avi 71_用户行为数仓_每月活跃设备明细.avi 72_用户行为数仓_DWS层加载数据脚本.avi- i* h$ d' Q7 M1 G0 ?% f 73_用户行为数仓_需求一:ADS层日活、周活、月活用户数.avi- I- Q* u3 n; v. n, T 74_用户行为数仓_每日新增设备明细表.avi/ B# |; {' c4 y6 y9 \2 r( i 75_用户行为数仓_需求二:ADS层每日新增设备表.avi 76_用户行为数仓_用户留存分析.avi 77_用户行为数仓_1、2、3、n日留存用户明细.avi v. ^5 Q1 \ `9 V4 Q 78_用户行为数仓_需求三:ADS层留存用户和留存比率.avi 79_用户行为数仓_新数据准备.avi 80_用户行为数仓_需求四:沉默用户.avi 81_用户行为数仓_需求五:本周回流用户数.avi 82_用户行为数仓_需求六:流失用户.avi2 x0 _( B( `, z4 j$ |5 S2 Z4 T- e% R) ] 83_用户行为数仓_需求七:最近连续3周活跃用户数.avi 84_用户行为数仓_需求八:最近七天内连续三天活跃用户数.avi- C- l" J O8 v3 x- J$ r 85_用户行为数仓_用户行为数仓业务总结.avi- V4 n, x9 B* A( P6 n/ e! E! U 86_用户行为数仓_Hive企业面试题总结.avi3 l9 J8 F2 t0 p& S! O! ^ 87_业务数仓_业务数仓课程介绍.avi 88_业务数仓_电商业务与数据结构简介.avi 89_业务数仓_表的分类.avi# X. Q* ~# f7 F P' @; i+ z 90_业务数仓_同步策略.avi; k0 r$ A: b9 E) @1 W 91_业务数仓_范式理论.avi5 ~2 z+ A' F+ N- J" S% r 92_业务数仓_雪花模型、星型模型和星座模型.avi 93_业务数仓_配置Hadoop支持Snappy压缩.avi 94_业务数仓_业务数据生成.avi 95_业务数仓_Sqoop安装及参数.avi% s/ l0 E. R( Y9 s, h3 k 96_业务数仓_Sqoop导入数据.avi4 {8 ~! a8 o4 `" y: p5 {1 ^ 97_业务数仓_ODS层建表及数据导入.avi 98_业务数仓_DWD层建表及导入数据.avi 99_业务数仓_需求讲解.avi7 X6 q, I3 Y+ F: N8 h 源码笔记资料.rar0 W

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值