必须要知道的hive调优知识(下)

news2024/9/24 8:29:09

在这里插入图片描述

Hive如果不用参数调优,在map和reduce端应该做什么

1、map阶段优化

Map阶段的优化,主要是确定合适的map数。那么首先要了解map数的计算公式

num_reduce_tasks = min[${hive.exec.reducers.max},
(${input.size}/${hive.exec.reducers.bytes.per.reducer})]
  • mapred.min.split.size: 指的是数据的最小分割单元大小;min的默认值是1B
  • mapred.max.split.size: 指的是数据的最大分割单元大小;max的默认值是256MB
  • dfs.block.size: 指的是HDFS设置的数据块大小。个已经指定好的值,而且这个参数默认情况下hive是识别不到的。
    通过调整max可以起到调整map数的作用,减小max可以增加map数,增大max可以减少map数。需要提醒的是,直接调整mapred.map.tasks这个参数是没有效果的。

2、reduce阶段优化

reduce阶段,是指前面流程图中的reduce phase(实际的reduce计算)而非图中整个reduce task。Reduce阶段优化的主要工作也是选择合适的reduce task数量, 与map优化不同的是,reduce优化时,可以直接设置mapred.reduce.tasks参数从而直接指定reduce的个数。

num_reduce_tasks = min[${hive.exec.reducers.max},
(${input.size}/${hive.exec.reducers.bytes.per.reducer})]

hive.exec.reducers.max :此参数从Hive 0.2.0开始引入。在Hive 0.14.0版本之前默认值是999;而从Hive 0.14.0开始,默认值变成了1009,这个参数的含义是最多启动的Reduce个数

hive.exec.reducers.bytes.per.reducer :此参数从Hive 0.2.0开始引入。在Hive 0.14.0版本之前默认值是1G(1,000,000,000);而从Hive 0.14.0开始,默认值变成了256M(256,000,000),可以参见HIVE-7158和HIVE-7917。这个参数的含义是每个Reduce处理的字节数。比如输入文件的大小是1GB,那么会启动4个Reduce来处理数据。

也就是说,根据输入的数据量大小来决定Reduce的个数,默认Hive.exec.Reducers.bytes.per.Reducer为1G,而且Reduce个数不能超过一个上限参数值,这个参数的默认取值为999。所以我们可以调整
Hive.exec.Reducers.bytes.per.Reducer来设置Reduce个数。

注意:

  • Reduce的个数对整个作业的运行性能有很大影响。如果Reduce设置的过大,那么将会产生很多小文件,对NameNode会产生一定的影响,而且整个作业的运行时间未必会减少;如果Reduce设置的过小,那么单个Reduce处理的数据将会加大,很可能会引起OOM异常。

  • 如果设置了 mapred.reduce.tasks/mapreduce.job.reduces 参数,那么Hive会直接使用它的值作为Reduce的个数;

  • 如果mapred.reduce.tasks/mapreduce.job.reduces的值没有设置(也就是-1),那么Hive会根据输入文件的大小估算出Reduce的个数。根据输入文件估算Reduce的个数可能未必很准确,因为Reduce的输入是Map的输出,而Map的输出可能会比输入要小,所以最准确的数根据Map的输出估算Reduce的个数。

Hive SQL优化处理

优化的根本思想

  • 尽早尽量过滤数据,减少每个阶段的数据量
  • 减少job数
  • 解决数据倾斜问题

1、Map Join

如果不指定 MapJoin 或者不符合 MapJoin 的条件,那么 Hive 解析器会将 Join 操作转换 成 Common
Join,即:在 Reduce 阶段完成 join。容易发生数据倾斜。可以用MapJoin把小 表全部加载到内存在 map
端进行 join,避免 reducer 处理。

2、行列过滤

列处理:在 SELECT 中,只拿需要的列,如果有,尽量使用分区过滤,少用 SELECT *。
行处理:在分区剪裁中,当使用外关联时,如果将副表的过滤条件写在 Where 后面,那 么就会先全表
关联,之后再过滤。

3、多采用分桶技术

4、结合实际环境合理设置 Map 数

通常情况下,作业会通过 input的目录产生一个或者多个map任务。 主要的决定因素有:input的文件总个数,input的文件大小,集群设置的文件块大小;
map数不是越多越好;
如果一个任务有很多小文件(远远小于块大小 128m),则每个小文件 也会被当做一个块,用一个 map 任务来完成,而一个 map 任务启动和初始化的时间远远大 于逻辑处理的时间,就会造成很大的资源浪费。而且,同时可执行的 map 数是受限的。
解决这个问题需要减少map数。
并不是每个map处理接近128m的文件块就是完美的;比如有一个 127m 的文件,正常会用一个 map 去完成,但这个文件只 有一个或者两个小字段,却有几千万的记录,如果 map 处理的逻辑比较复杂,用一个 map 任务去做,肯定也比较耗时。解决这个问题需要增加map数。

5、 合并大量小文件

在Map执行前合并小文件,可以减少Map数:CombineHiveInputFormat 具有对小文件进行合并的功能(系统默认的格式)。HiveInputFormat 没有对小文件合并功能。

6、设置合理的Reduce数

Reduce 个数也并不是越多越好

  • 过多的启动和初始化 Reduce 也会消耗时间和资源;
  • 有多少个 Reduce,就会有多少个输出文件,如果生成了很多个小文件,那么如果这些小文件作为下一个任务的输入,则也会出现小文件过多的问题;
  • 在设置Reduce个数的时候也需要考虑这两个原则:处理大数据量利用合适的 Reduce 数;使单个Reduce 任务处理数据量大小要合适。

7、输出合并小文件常用参数

SET hive.merge.mapfiles = true; -- 默认 true,在 map-only 任务结束时合并小文件
SET hive.merge.mapredfiles = true; -- 默认 false,在 map-reduce 任务结束时合并小文件
SET hive.merge.size.per.task = 268435456; -- 默认 256M
SET hive.merge.smallfiles.avgsize = 16777216; -- 当输出文件的平均大小小于 16m 该值时,
启动一个独立的 map-reduce 任务进行文件 merge

8、开启 map 端 combiner(不影响最终业务逻辑)

# 开启命令
set hive.map.aggr=true;

9、中间结果压缩

设置 map 端输出、中间结果压缩。(不完全是解决数据倾斜的问题,但是减少了 IO 读写和网络传输,能提高很多效率)

Hive分区和分桶的区别

1、定义上

分区

Hive的分区使用HDFS的子目录功能实现。每一个子目录包含了分区对应的列名和每一列的值。
Hive的分区方式:由于Hive实际是存储在HDFS上的抽象,Hive的一个分区名对应一个目录名,子分区名就是子目录名,并不是一个实际字段。所以可以这样理解,当我们在插入数据的时候指定分区,其实就是新建一个目录或者子目录,或者在原有的目录上添加数据文件。

注意:

partitned by子句中定义的列是表中正式的列(分区列),但是数据文件内并不包含这些列。

# 创建分区表
create table student(
id int,
name string,
age int,
address string
)
partitioned by (dt string,type string) # 制定分区
row format delimited fields terminated by '\t' # 指定字段分隔符为tab
collection items terminated by ',' # 指定数组中字段分隔符为逗号
map keys terminated by ':' # 指定字典中KV分隔符为冒号
lines terminated by '\n' # 指定行分隔符为回车换行
stored as textfile # 指定存储类型为文件
;
# 将数据加载到表中(此时时静态分区)
load data local inpath '/root/student.txt' into test.student partition(class='一
班');

分桶:

分桶表是在表或者分区表的基础上,进一步对表进行组织,Hive使用 对分桶所用的值;
进行hash,并用hash结果除以桶的个数做取余运算的方式来分桶,保证了每个桶中都有数据,但每个桶中的数据条数不一定相等。

注意:

创建分区表时:
可以使用distribute by(sno) sort by(sno asc) 或是使用clustered by(字段)当排序和分桶的字段相同的时候使用cluster by, 就等同于分桶+排序(sort)

# 创建分桶表
create table student(
id int,
name string,
age int,
address string
)
clustered by(id) sorted by(age) into 4 buckets
row format delimited fields terminated by '\t'
stored as textfile;
# 开启分桶
set hive.enforce.bucketing = true;
# 插入数据
insert overwrite table studentselect id ,name ,age ,address from employees;
# 也可以用另一种插入方式
load data local inpath '/root/student.txt' into test.student;

2、数据类型上

分桶随机分割数据库,分区是非随机分割数据库。因为分桶是按照列的哈希函数进行分割的,相对比较平均;而分区是按照列的值来进行分割的,容易造成数据倾斜。
分桶是对应不同的文件(细粒度),分区是对应不同的文件夹(粗粒度)。桶是更为细粒度的数据范围划分,分桶的比分区获得更高的查询处理效率,使取样更高效。

注意:普通表(外部表、内部表)、分区表这三个都是对应HDFS上的目录,桶表对应是目录里的文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/464503.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件测试:测试一个网站

一、软件测试的原则 1、软件测试应尽早执行,并贯穿于整个软件生命周期 2、软件测试应追溯需求 3、测试应由第三方来构造 4、穷举测试是不可能的,要遵循 Good-enough 原则 5、必须确定预期输出(或结果) 6、必须彻底检查每个测试结果 7、…

常见电路20问,看看你能回答多少

1、什么是电路? 电路是由电子元件、导线和其他元件组成的路径,可以控制电子流的流动。电路可以用于将电能转化为其他形式的能量,例如光能、声能、机械能等等。电路还可以用于控制电子设备的操作,例如计算机、通信设备、车辆控制等…

来字节跳动实习,有机会发Nature子刊

来字节跳动实习,还能有机会发 Nature 子刊? 没错,ByteDance Research 与北京大学物理学院陈基课题组合作的一项研究近期登上了国际顶级刊物 Nature Communications。作者之中,共同一作伟中就是字节跳动的实习生同学,来…

python数据分析:人口普查可视化,看看哪个地区人口最多

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 今天案例难度指数: ☆☆☆ 准备 环境使用: 在开始写我们的代码之前,我们要准备好运行代码的程序 Anaconda (python3.9) –> 识别我们写的代码 开发工具: jupyter notebook –> 代…

ChatGPT在智能客服产品落地探讨

AI语言模型中的ChatGPT近期在互联网平台上引起了广泛的讨论。那么,如果想将这个大型语言模型应用在智能客服产品中,或者将其在ToB SaaS应用软件领域落地,应该采用哪种构建策略? 现在ChatGPT这个大型语言模型已经在各种平台获得了广…

初学Python来用它制作一个简单的界面

前言 很多刚开始学习python的宝子,就想着自己开始琢磨一些界面,但是吧很多都是有点难度的,自己又琢磨不透,只能把代码复制粘贴运行 现在就带你们来了解一个制作简单界面的代码 ttkbootstrap 是一个基于 tkinter 的界面美化库&am…

CMake自动按目录结构编译Protobuf代码

在使用CMake构建C项目时,如果有使用Protobuf,CMake提供了一个FindProtobuf.cmake模块来处理PB,其使用方法如下: find_package(Protobuf REQUIRED) protobuf_generate_cpp(GENERATED_SRC GENERATED_HEADER "pb/t.proto"…

rancher Prometheus添加exporter监控

mysql 用docker启动exporter docker run -d \-p 9104:9104 \--network my-mysql-network \-e DATA_SOURCE_NAME"mysqlexporter:mysqlexporter(192.168.147.46:3306)/" \prom/mysqld-exporter给集群中的prometheus添加该exporter的数据 First, you will need to c…

力劲塑机:用CRM“塑造”数字化能力

你知道吗?从手机到电脑,从暖气到扶梯,从家用电器到汽车、摩托车,从眼镜、手表到拉链、纽扣,这些物品的生产过程都离不开压铸和注塑工艺。如果说压铸和注塑这个几百亿的产业带动了几万亿的市场,一点也不夸张…

Vue3+axios+Mock.js实现登录功能

文章目录 前言一、Vue3 Element Plus Mock.js axios实现登录功能1.登录页面配置路由、编写表单内容2.编写表单校验规则3.登录触发表单预验证4.Mock.js模拟登录请求 二、面试题1.前端登录流程2.token是什么? 前言 最近学习了Vue3,这篇文章主要分享一下…

2023年6月DAMA-CDGA/CDGP数据治理认证考试可报名地区公布

2023年4月23日,据DAMA中国官方信息,目前6月DAMA-CDGA/CDGP数据治理认证考试开放报名地区有:北京、上海、广州、深圳、长沙、呼和浩特。目前南京、济南、西安、杭州等地区还在接近开考人数中,打算6月考试的朋友们可以抓紧时间报名啦…

内网远程控制软件哪个好用

市面上远程控制软件很多,但是支持纯内网环境(无外网)的很少。大部分远程控制软件可以在局域网用,但是它的数据流量还是要走软件公司服务器,也就是要走外网,所以在纯内网环境没法使用。那么什么软件支持纯内…

什么是光伏发电AGC/AVC系统及RCL-0923光伏群调群控AGC/AVC装置简介。以及分布式电源光伏可观可测,可调可控方案介绍

什么是光伏发电AGC/AVC系统及RCL-0923光伏群调群控AGC/AVC装置简介。以及分布式电源光伏可观可测,可调可控方案介绍。虚拟电厂光伏电站电压快速控制装置 一:什么是ACG系统 AGC系统是指自动发电控制系统,它通过控制光伏逆变器的出力&#xff0…

c++类 笔记

派生类 #include <iostream> using namespace std; class Box{private://类私有&#xff0c;只有成员可以调用 也就是说你不可以通过box1.a来调用 ,这些变量其实你默认不用写private 这个变量&#xff0c;只要放在最上面他默认就是 私有int a1;protected://protected&am…

博途1200/1500PLC工艺PID编程应用(SCL语言)

博途工艺PID的详细解读可以查看下面的博客文章,这里不再赘述 博途PLC 1200/1500PLC 工艺对象PID PID_Compact详细解读_RXXW_Dor的博客-CSDN博客这篇博文我们详细解读博途PLC自带的PID功能块PID_Compact,大部分工业闭环调节过程,我们采用系统自带的PID功能块基本都能胜任,一…

Linux的进程控制

进程创建后&#xff0c;需要对其进行合理管理&#xff0c;光靠OS 是无法满足我们的需求的&#xff0c;此时可以运用进程控制相关知识&#xff0c;对进程进行手动管理&#xff0c;如创建进程、终止进程、等待 进程等&#xff0c;其中等待进程可以有效解决僵尸进程问题。 1、进程…

日撸 Java 三百行day38

文章目录 说明day381.Dijkstra 算法思路分析2.Prim 算法思路分析3.对比4.代码 说明 闵老师的文章链接&#xff1a; 日撸 Java 三百行&#xff08;总述&#xff09;_minfanphd的博客-CSDN博客 自己也把手敲的代码放在了github上维护&#xff1a;https://github.com/fulisha-ok/…

java--Lock锁

1.概述 锁是一种工具&#xff0c;用于控制对共享资源的访问 Lock和synchronized&#xff0c;这两个是最常见的锁&#xff0c;它们都可以达到线程安全的目的&#xff0c;但是在使用上和功能上又有较大的不同。 Lock并不是用来代替synchronized的&#xff0c;而是当使用synchroni…

verilog手撕代码3——序列检测和序列发生器

文章目录 前言一、序列检测器1.1 重复序列检测1.1.1 序列缓存对比/移位寄存器法1.1.2 状态机法 1.2 非重复序列检测 二、序列发生器2.1 移位寄存器法2.2 反馈法2.3 计数器法 前言 2023.4.25 2023.4.26 学习打卡&#xff0c;天气转晴 一、序列检测器 1.1 重复序列检测 1.1.1 …

SpringBoot整合EasyExcel上传下载前后端

SpringBoot整合EasyExcel上传下载前后端 需求&#xff0c;在项目启动时加载表格里的数据初始化&#xff0c;前端可以上传全部部门的表格数据&#xff0c;后台根据部门名字解析归类数据和根据表格的部门下载部门数据1.后端1.1创建一个SpringBoot项目&#xff0c;引入依赖1.2 在r…