Hive-优化(参数优化篇)

map 数和reduce数

控制hive任务中的map数

合适的map数,会让资源分配的更平均,让我们的代码运行更快,通常情况下,作业会通过input的目录产生一个或者多个map任务。我们可以通过调整参数来控制运行过程中的map数。

Hive Map的数量主要取决于以下几个因素:

输入文件的个数:Hive作业会根据输入目录产生的map任务数量来决定,这通常与输入文件的个数有关。

输入文件的总大小:如果单个输入文件非常大,或者整个作业的任务逻辑比较复杂,导致Map阶段执行缓慢时,可以增加Map数以减少每个Map处理的文件数据量。

集群设置的文件块大小:在Hive中可以通过`set dfs.block.size`命令查看并设置集群的默认文件块大小。这个参数通常是固定的,不能被用户自定义修改。

小文件进行合并,减少map

如果小文件多,

在map输入时,一个小文件产生一个map任务,这样会产生多个map任务;启动和初始化多个map会消耗时间和资源,所以hive默认是将小文件合并成大文件。

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

-------小文件合并

set hive.input.format= org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;

-------关闭小文件合并大文件(不推荐调整)

set hive.input.format=org.apache.hadoop.hive.ql.io.HiveInputFormat;

案例实操:该表内2个分区,共5个文件

hive (default)>

select

name

,count(*)  as cnt

from ds_hive.ch4_t_par_emp

group by name

;

默认情况下执行(开启小文件合并),按分区执行,2个map

关闭小文件合并后执行,按文件个数执行,5个map

注:时间虽然贴的是一个20s,一个18s,貌似有点优化,但实际有波动,应该在增大数据量,忽略波动时间的影响才可能看出优化效果

在Map-Reduce的任务结束时合并小文件的设置:如果map输出的小文件过多,hive 默认是开启map 输出合并。

在map-only任务结束时合并小文件,默认true

set hive.merge.mapfiles = true;

在map-reduce任务结束时合并小文件,默认false

set hive.merge.mapredfiles = true;

合并文件的大小,默认256M

set hive.merge.size.per.task = 268435456;

当输出文件的平均大小小于该值时,启动一个独立的map-reduce任务进行文件merge

set hive.merge.smallfiles.avgsize = 16777216;

-- 设置最大(小)切片值

set mapreduce.input.fileinputformat.split.maxsize=256000000;

set mapreduce.input.fileinputformat.split.minsize=1;
 

复杂文件增加Map

当input的文件都很大,任务逻辑复杂,map执行非常慢的时候,可以考虑增加Map数,来使得每个map处理的数据量减少,从而提高任务的执行效率。

增加map的方法为:根据

computeSliteSize(Math.max(minSize,Math.min(maxSize,blocksize)))=blocksize=128M

max(最小切片值,max(最大切片值,默认块大小))

公式,调整maxSize最大值。让maxSize最大值低于blocksize就可以增加map的个数。

设置最大切片值为200个字节

hive (default)>

set mapreduce.input.fileinputformat.split.maxsize=200;

select

name

,count(*)  as cnt

from ds_hive.ch4_t_par_emp

group by name

;

相较于默认情况,map数由2个增大到3个

控制hive任务中的reduce数

 reduce个数的设定极大影响任务执行效率,在设置reduce个数的时候需要考虑这两个原则:使大数据量利用合适的reduce数;使每个reduce任务处理合适的数据量。

​ 在不指定reduce个数的情况下,Hive会猜测确定一个reduce个数,基于以下,两个设定:

参数1:hive.exec.reducers.bytes.per.reducer(每个reduce任务处理的数据量,在Hive 0.14.0及更高版本中默认为256M)

参数2:hive.exec.reducers.max(每个任务最大的reduce数,在Hive 0.14.0及更高版本中默认为1009)

计算reducer数的公式: N = min( 参数2,总输入数据量 / 参数1 )

      在生产中,一般不调整这两个参数,这两个参数是 如果我们不指定hive的reduce个数,hive程序通过上面两个参数进行动态计算 决定reduce的个数。

mapred.reduce.tasks (默认是-1,代表hive自动根据输入数据设置reduce个数)

一般在生产中对reduce的个数也不做太多调整,但是有时候reduce的个数太多,hdfs上的小文件太多。 此时就可以通过 调小mapreduce.job.reduces的个数,来减少hdfs上输出文件的个数。

​ reduce个数并不是越多越好,启动和初始化reduce会消耗时间和资源;另外,有多少个reduce,就会有多少个输出文件,如果生成了很多个小文件,那么如果这些小文件作为下一个任务的输入,则也会出现小文件过多的问题。

job并行运行设置

带有子查询的hql,如果子查询间没有依赖关系,可以开启任务并行,设置任务并行最大线程数。

hive.exec.parallel (默认是false, true:开启并行运行)

hive.exec.parallel.thread.number (最多可以并行执行多少个作业, 默认是 8)

测试并行运算:

关闭并行运行,发现没有依赖的子查询不会同步执行

-- 关闭并行运行, 默认是false

关闭并行执行日志如下:

开启并行执行日志如下:

Fetch抓取

Fetch抓取是指,Hive中对某些情况的查询可以不必使用MapReduce计算。例如:select * from emp;在这种情况下,Hive可以简单地读取emp对应的存储目录下的文件,然后输出查询结果到控制台。

相关参数如下:

--是否在特定场景转换为fetch 任务

--设置为none表示不转换

set hive.fetch.task.conversion=none;

--设置为minimal表示支持select *,分区字段过滤,Limit等

set hive.fetch.task.conversion=minimal;

--设置为more表示支持select 任意字段,包括函数,过滤,和limit等

set hive.fetch.task.conversion=more;

本地模式

大多数的Hadoop Job是需要Hadoop提供的完整的可扩展性来处理大数据集的。不过,有时Hive的输入数据量是非常小的。在这种情况下,为查询触发执行任务消耗的时间可能会比实际job的执行时间要多的多。对于大多数这种情况,Hive可以通过本地模式在单台机器上处理所有的任务。对于小数据集,执行时间可以明显被缩短。

相关参数如下:

--开启自动转换为本地模式

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

--设置local MapReduce的最大输入数据量,当输入数据量小于这个值时采用local  MapReduce的方式,默认为134217728,即128M

set hive.exec.mode.local.auto.inputbytes.max=50000000;

--设置local MapReduce的最大输入文件个数,当输入文件个数小于这个值时采用local MapReduce的方式,默认为4

set hive.exec.mode.local.auto.input.files.max=10;

严格模式

Hive可以通过设置某些参数防止危险操作:

1)分区表不使用分区过滤

将hive.strict.checks.no.partition.filter设置为true时,对于分区表,除非where语句中含有分区字段过滤条件来限制范围,否则不允许执行。换句话说,就是用户不允许扫描所有分区。进行这个限制的原因是,通常分区表都拥有非常大的数据集,而且数据增加迅速。没有进行分区限制的查询可能会消耗令人不可接受的巨大资源来处理这个表。

2)使用order by没有limit过滤

将hive.strict.checks.orderby.no.limit设置为true时,对于使用了order by语句的查询,要求必须使用limit语句。因为order by为了执行排序过程会将所有的结果数据分发到同一个Reduce中进行处理,强制要求用户增加这个limit语句可以防止Reduce额外执行很长一段时间(开启了limit可以在数据进入到Reduce之前就减少一部分数据)。

3)笛卡尔积

将hive.strict.checks.cartesian.product设置为true时,会限制笛卡尔积的查询。对关系型数据库非常了解的用户可能期望在执行JOIN查询的时候不使用ON语句而是使用where语句,这样关系数据库的执行优化器就可以高效地将WHERE语句转化成那个ON语句。不幸的是,Hive并不会执行这种优化,因此,如果表足够大,那么这个查询就会出现不可控的情况。

CBO优化

CBO是指Cost based Optimizer,即基于计算成本的优化。

在Hive中,计算成本模型考虑到了:数据的行数、CPU、本地IO、HDFS IO、网络IO等方面。Hive会计算同一SQL语句的不同执行计划的计算成本,并选出成本最低的执行计划。目前CBO在hive的MR引擎下主要用于join的优化,例如多表join的join顺序。

相关参数为:

--是否启用cbo优化

set hive.cbo.enable=true;

4)总结

CBO优化对于执行计划中join顺序是有影响的,其之join顺序提前,如果某张表的数据量较小,将其提前,会有更大的概率使得中间结果的数据量变小,从而使整个计算任务的数据量减小,也就是使计算成本变小。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

双链路提升网络传输的可靠性扩展可用带宽

为了提升网络传输的可靠性或增加网络可用带宽, 通常使用双链路冗余备份或者双链路聚合的方式。 本文介绍几种双链路网络通信的案例。 5GWiFi冗余传输 双Socket绑定不同网络接口:通过Android的ConnectivityManager绑定5G蜂窝网络和WiFi的Socket连接&…

Spring(三)容器-注入

一 自动注入Autowire 代码实现: package org.example.spring01.service;import org.springframework.stereotype.Service;Service public class UserService {}package org.example.spring01.controller;import lombok.Data; import lombok.ToString; import org.…

MySQL零基础教程16—表连接进阶

复习表别名 之前已经学习过,查询的时候可以使用as来对检索的列进行重命名,这样可以让sql更加简介,增强易读性(as可以省略) 此外,使用表别名还可以支持在一条select语句中,一个表是被多次使用 …

【MySQL】MySQL 复制

MySQL复制介绍 MySQL复制允许将主实例(master)上的数据同步到一个或多个从实例(slave)上,默认情况下复制是异步进行的,从库也不需要一直连接到主库来同步数据。 MySQL复制的数据粒度可以是主实例上所有的数据库,也可以是指定的一个或多个数据…

Linux的缓存I/O和无缓存IO

一、I/O缓存的背景 I/O缓存是指在内存里开辟一块区域,存放用来接收用户输入和用于计算机输出的数据,以减小系统开销和提高外设效率。linux对IO文件的操作分为不带缓存的IO操作和带缓存的IO操作(标准IO操作)。为什么存在C标准I/O库…

YOLOv5 + SE注意力机制:提升目标检测性能的实践

一、引言 目标检测是计算机视觉领域的一个重要任务,广泛应用于自动驾驶、安防监控、工业检测等领域。YOLOv5作为YOLO系列的最新版本,以其高效性和准确性在实际应用中表现出色。然而,随着应用场景的复杂化,传统的卷积神经网络在处…

Webpack分包与合包深度解析

Webpack分包与合包深度解析 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家!点我试试!! 引言:现代前端工程的模块化困境 在单页面应用(SPA&#…

永恒之塔鼠标卡顿移动鼠标卡屏的问题

原因是现在鼠标普遍轮询率偏高导致系统性能开销过大 解决办法90块钱到淘宝雷蛇官网店买个最便宜的鼠标 然后安装Razer控制台,在性能栏把轮询率设置到最低(125)

Selenium遇到Exception自动截图

# 随手小记 场景:测试百度: 点击新闻,跳转到新的窗口,找到输入框,输入“hello,world" 等到输入框的内容是hello,world, 这里有个错误,少了一个] 后来就实现了错误截图的功能,可以参考 …

飞机大战lua迷你世界脚本

-- 迷你世界飞机大战 v1.2 -- 星空露珠工作室制作 -- 最后更新:2024年1月 ----------------------------- -- 迷你世界API适配配置 ----------------------------- local UI { BASE_ID 7477478487091949474-22856, -- UI界面ID ELEMENTS { BG 1, -- 背景 BTN_LE…

我的ChatGPT怎么登不上?

近期,不少用户反馈在使用ChatGPT时遇到登录困难、连接超时等问题。本文将从技术角度分析常见原因,并提供合规、安全的解决方案,同时结合开发者实际需求推荐实用工具,助您高效应对登录障碍。 ChatGPT登录失败的常见原因 网络环境限…

【MySQL】用MySQL二进制包构建docker镜像

一、实验背景 【MySQL&docker】基于CentOS7.5 编译制作MySQL5.7.28镜像 https://www.jianshu.com/p/71fd79b69a6b 用MySQL源码编译的docker镜像,体积过大,直奔3G了,你也不清楚,这点编译参数打出的体积怎么就这么大&#xff01…

快速熟悉JavaScript

目录 1.js的基本认知 2.js的基本语法 2.1 变量的声明 三个关键字的区别 2.2数据类型 2.2.1 基本数据类型 2.2.2 复杂数据类型 2.3对象的属性和方法 2.3.1属性 2.3.2访问方式 2.4.3动态操作 2.4.4方法 2.4字符串的常用属性和方法 2.5运算符 2.6逻辑控制语句 2.7函…

在 Windows 上最快速安装 Qt 5

引言 Qt 是一个强大的跨平台 C 开发框架,广泛应用于 GUI 开发、嵌入式系统和工业软件等领域。然而,许多开发者习惯于在 Linux(如 Ubuntu)环境下使用 Qt,而在 Windows 上搭建 Qt 开发环境时可能会遇到许多问题&#xf…

二、QT和驱动模块实现智能家居-----5、通过QT控制LED

在QT界面,我们要实现点击“LED”按钮就可以控制板子上的LED。LED接线图如下: 在Linux 系统里,我们可以使用2种方法去操作上面的LED: ① 使用GPIO SYSFS系统:这需要一定的硬件知识,需要设置引脚的方向、数值…

threejs:用着色器给模型添加光带扫描效果

第一步:给模型添加光带 首先创建一个立方体,不进行任何缩放平移操作,也不要set position。 基础代码如下: 在顶点着色器代码里varying vec3 vPosition;vPosition position;获得threejs自动计算的顶点坐标插值(也就…

高频 SQL 50 题(基础版)_1141. 查询近30天活跃用户数

1141. 查询近30天活跃用户数 select activity_date day,count(distinct user_id) active_users from Activity where (activity_date<2019-07-27 and activity_date>DATE_sub(2019-07-27,INTERVAL 30 DAY)) group by(activity_date)

【Zinx】Day1:初识 Zinx 框架

目录 学习目标初识 Zinx 框架Zinx v0.2 代码实现准备工作创建 Zinx 框架创建 ziface 与 znet 模块 基础的 Server 实现在 ziface 下创建服务模块抽象层 iserver.go在 znet 下实现服务模块 server.go 封装 Connection在 ziface 创建 iconnection.go在 znet 创建 connection.go 回…

音频3A测试--AEC(回声消除)测试

一、测试前期准备 一台录制电脑:用于作为近段音源和收集远端处理后的数据; 一台测试设备B:用于测试AEC的设备; 一个高保真音响:用于播放设备B的讲话; 一台播放电脑:用于模拟设备A讲话,和模拟设备B讲话; 一台音频处理器(调音台):用于录制和播放数据; 测试使用转接线若…

项目准备(flask+pyhon+MachineLearning)- 2

目录 1. 注册页面的渲染 2.邮箱的注册验证 3.登录页面的渲染 1. 注册页面的渲染 使用render_template来渲染&#xff0c;注意这里的前端网页使用jinja2模板 详情大家可以参考jinja2介绍 注意每个网页上方都有导航条&#xff0c;大家可以使用jinja2的继承功能&#xff0c;写一…