ETL数据倾斜与资源优化

news2025/1/13 7:55:51

1.数据倾斜实例

数据倾斜在MapReduce编程模型中比较常见,由于key值分布不均,大量的相同key被存储分配到一个分区里,出现只有少量的机器在计算,其他机器等待的情况。主要分为JOIN数据倾斜和GROUP BY数据倾斜。

1.1GROUP BY数据倾斜优化

1.1.1set hive.map.aggr=true

开启map之后使用combiner,在map操作之后做局部聚合。

例如:在user表中有100亿条数据,按性别统计条数,select user.gender,count(1) from user group by user.gende

如果没有map端的部分聚合优化,map直接把groupby_key 当作reduce_key发送给reduce做聚合,就会导致计算不均衡的现象。虽然map有100万个,但是reduce只有两个在做聚合,每个reduce处理100亿条记录。
在这里插入图片描述
由于map端已经做了局部聚合,虽然还是只有两个reduce做最后的聚合,但是每个reduce只用处理100万行记录,相对优化前的100亿小了1万倍。

在这里插入图片描述
map端聚合打开map聚合开关缺省是打开的,但是不是所有的聚合都需要这个优化。因为group_by_key没有重复的map聚合没有太大意义,并且浪费资源。下面这两个参数控制关掉map聚合的策略。

set hive.groupby.mapaggr.checkinterval = 100000 (默认)尝试执行聚合的条数
set hive.map.aggr.hash.min.reduction=0.5(默认)如果hash表的容量与输入行数之比超过这个数,那么map端的hash聚合将被关闭,默认是0.5,设置为1可以保证hash聚合永不被关闭;
1.1.2set hive.groupby.skewindata=true

当选项设定为 true,生成的查询计划会有两个 MR Job。第一个 MR Job 中,Map 的输出结果集合会随机分布到Reduce 中,每个 Reduce 做部分聚合操作,并输出结果,这样处理的结果是相同的 Group By Key有可能被分发到不同的 Reduce 中,从而达到负载均衡的目的;第二个 MR Job 再根据预处理的数据结果按照 Group ByKey 分布到 Reduce 中(这个过程可以保证相同的 Group By Key 被分布到同一个 Reduce中),最后完成最终的聚合操作。

在这里插入图片描述
在这里插入图片描述

1.2JOIN数据倾斜优化

1.2.1

如果是由于key值为空或为异常记录,且这些记录不能被过滤掉的情况下,可以考虑给key赋一个随机值,将这些值分散到不同的reduce进行处理。

1.2.2

如果是一个大表和一个小表join的话,可以考虑使用mapjoin来避免数据倾斜,mapjoin的具体过程如下。

在这里插入图片描述

1.2.3 使用/+ MAPJOIN(smalltable)/显示声明MapJoin需要加载到内存中的小表
SELECT /*+mapjoin(b)*/ field1,field2 from a left join b 
​
##MapJoin操作
set hive.auto.convert.join.noconditionaltask = true;#默认值:true;将普通的join转化为普通的mapjoin时,是否将多个mapjoin转化为一个mapjoin
set hive.mapjoin.smalltable.filesize=100000;#大表小表判断的阈值,如果表的大小小于该值则会被加载到内存中运行
set hive.ignore.mapjoin.hint = false;#默认值:true;是否忽略mapjoin hint 即mapjoin标记
set hive.auto.convert.join.noconditionaltask.size=100000;#将多个mapjoin转化为一个mapjoin时,其表的最大值

1.3大表关联大表数据倾斜

1.增加Reducer数量
2.把大表转换成小表做MapJoin

2.资源分配

2.1生产资源案例

例如生产上的某应用计算资源有3100CU,一共三个队列,两个机房,业务高峰期数据量大的业务线同时刷数会出现严重的资源不足的情况。

2.2调度策略

调度通常是一个难题,并没有一个所谓“最好”的策略,因此Yarn提供了多种调度策略;

2.2.1FIFO调度器

先到先分配资源,前一个应用执行完毕之后下一个应用开始执行。缺点是小作业很容易被阻塞,等大作业执行完毕才能执行。

2.2.2容量调度器

容量调度器以队列为单位划分资源,每个队列都有资源使用的下限和上限。每个用户可以设定资源使用上限。管理员可以约束单个队列、用户或者作业的资源使用、支持作业优先级,但不支持抢占。如果队列中有多个作业,并且队列资源不够用了,这是如果集群仍然有空闲资源,那么容量调度器可能会将空余的资源分配给队列中的作业,哪怕是超出队列的容量,这部分队列成为“弹性队列”。
在这里插入图片描述

2.2.3公平调度器

想象两个队列A和B。A启动一个作业,在B没有需求时A会分配到全部可用资源;当A的作业仍在运行时B启动一个作业,一段时间后,按照我们先前看到的方式,每个作业都用到了一半的集群资源。这时,如果B启动第二个做作业且其他作业仍在运行,那么第二个作业将和B的其他作业(这里是第一个)共享资源,因此B的每个作业将占四分之一的集群资源,而A仍继续占用一半的集群资源。最终的结果就是资源在用户之间实现了公平共享。
在这里插入图片描述

2.3机器申请

机器申请调度器会优先匹配本地资源的申请请求,其次是同机架的,最后是任意机器的。
在这里插入图片描述

2.4通过参数调节资源的使用

Hadoop最底层数据存储是HDFS,HDFS按文件存储,最小的存储单元是块。MapReduce输入的单位是分片,每个分片对应一个Mapper,每个Mapper或Reducer申请一个计算资源。资源申请的多少,可以通过修改输入数据的分片大小来控制。由于总体资源有限,需要控制各个阶段的申请资源数。离线表四-ETL参数优化

代码块
Python

##Map输入合并小文件
set mapred.max.split.size=256000000; ##每个Map最大输入大小 ,超过次大小进行文件拆分
set mapred.min.split.size.per.node=256000000; ##一个节点上split的至少的大小  ,每个节点上的文件小于此大小进行文件合并
set mapred.min.split.size.per.rack=256000000; ##一个交换机下split的至少的大小 ,每个交换机上小于此大小进行文件合并
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; ##一个data node节点上多个小文件会进行合并,合并文件数由mapred.max.split.size限制的大小决定
​
##输出合并
set hive.merge.mapfiles = true; ##在Map-only的任务结束时合并小文件 ,如果hadoop版本支持CombineFileInputFormat,则启动Map-only job for merge,否则启动 MapReduce merge job,map端combine file是比较高效的做法
set hive.merge.mapredfiles = true;  ##在Map-Reduce的任务结束时合并小文件
set hive.merge.size.per.task = 128000000; ##控制每个任务合并小文件后的文件大小(默认256000000)
set hive.merge.smallfiles.avgsize=64000000;  ##告诉hadoop什么样的文件属于小文件(默认16000000),这个值只有当hive.merge.mapfiles或hive.merge.mapredfiles设定为true时,才有效 
​
##控制Reduce个数
set mapred.reduce.tasks = 1000;
set hive.exec.reducers.bytes.per.reducer=64000000;#用于设置在执行SQL的过程中每个reducer处理的最大字节数量。可以在配置文件中设置,也可以由我们在命令行中直接设置。如果处理的数据量大于,就会多生成一个reudcer。例如,number = 1024K,处理的数据是1M,就会生成10个reducer。

3.其他常见问题

3.1OOM

##Maper: 
set mapred.map.child.java.opts=-Xmx2048m;#(默认参数,表示jvm堆内存)
set mapreduce.map.memory.mb=2304;#(默认参数,表示整个jvm进程占用的内存:堆内存+堆外内存=2048+256)
##Reducer:
set mapred.reduce.child.java.opts=-Xmx2048m;#(默认参数,表示jvm堆内存)
set mapreduce.reduce.memory.mb=2304;#(默认参数,表示整个jvm进程占用的内存:堆内存+堆外内存=2048+256)
##MRAppMaster:
set yarn.app.mapreduce.am.command-opts=-Xmx1024m;#(默认参数,表示jvm堆内存)
set yarn.app.mapreduce.am.resource.mb=1536;#(默认参数,表示整个jvm进程占用的内存:堆内存+堆外内存=1024+512

3.2写文件超过10万个

平台限制写文件数不能超过10万个,distribute by顾名思义,是起分散数据作用的。distribute by col,则是按照col列为key分散到不同的reduce里去,默认采取的是hash算法。

distribute by deliver_date, source_system,source_system_table,cast(rand()*100 as int)

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

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

相关文章

Web前端—浏览器渲染原理

浏览器渲染原理 浏览器渲染原理渲染时间点渲染流水线1. 解析HTML—Parse HTML2. 样式计算—Recalculate Style3. 布局—Layout4. 分层—Layer5. 绘制—Paint6. 分块—Tiling7. 光栅化—Raster8. 画—Draw完整过程 面试题1. 浏览器是如何渲染页面的?2. 什么是 reflow…

6.3 BP神经网络

在多层感知器被引入的同时,也引入了一个新的问题:由于隐藏层的预期输出并没有在训练样例中给出,隐藏层结点的误差无法像单层感知器那样直接计算得到。 为了解决这个问题,反向传播(BP)算法被引入&#xff0…

Spark DAG

Spark DAG 什么是DAG DAG 是一组顶点和边的组合。顶点代表了 RDD, 边代表了对 RDD 的一系列操作。 DAG Scheduler 会根据 RDD 的 transformation 动作,将 DAG 分为不同的 stage,每个 stage 中分为多个 task,这些 task 可以并行运…

jenkins介绍,帮助你从安装到使用jenkins

Jenkins 概述 官网地址:https://www.jenkins.io/zh/ 什么是 Jenkins Jenkins是一款开源 CI&CD 软件,用于自动化各种任务,包括构建、测试和部署软件。它提供了一个易于使用的图形化界面,可以通过配置简单的任务来实现自动化构…

ubuntu20.04安装 ffmpeg 开发环境

参考:参考1 一些相关软件包,已打包整理好,如下 源码包 1、安装步骤 创建安装目录 sudo mkdir -p /usr/local/ffmpeg/lib 解压源码 tar -jxf ffmpeg-4.3.2.tar.bz2 到指定ffmpeg目录进行配置 cd ffmpeg-4.3.2/ 配置:会报错很多…

简单使用Swagger

文章目录 1、介绍2、 使用步骤3、 常用注解 1、介绍 Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务(https://swagger.io/)。 它的主要作用是: 使得前后端分离开发更加方便,有利于团队协作 接口的文…

银行监管报送系统介绍(五):金融统计数据大集中自动化报送系统——PBOC Report

人民银行金融统计数据大集中自动化报送系统(简称PBOC Report),是基于现代计算机网络技术应用基础上,由人行总行设置金融统计数据服务器,建立的一个全国统一的金融统计数据库。 人行针对各银行存贷款、中间业务、网点人…

关闭 Microsoft Word 2010 配置窗口

关闭 Microsoft Word 2010 配置窗口 References 出现这种问题,主要是安装时所用账户和目前登陆的账户不为同一个账户造成的。或者你进行过覆盖安装或是重新安装过系统,但是 office 的安装目录没有更改。先激活 Microsoft Office,然后执行下列…

如何使用OpenCV扫描图像、查找表和时间测量

返回:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV4.9.0开源计算机视觉库核心功能(核心模块) ​ 编辑 目标 我们将寻求以下问题的答案: 如何浏览图像的每个像素?OpenCV 矩…

【前端Vue】HR-saas中台项目开发md文档第1篇:vuex基础-介绍,vuex基础-初始化功能【附代码文档】

HR-saas中台管理项目开发完整教程(附代码资料)主要内容讲述:vuex基础-介绍,vuex基础-初始化功能,vuex基础-state,vuex基础-mutations,vuex基础-actions,vuex基础-getters。项目课设计,人力资源的环境搭建vue-element-admin的了解和…

微服务篇-C 深入理解第一代微服务(SpringCloud)_V 深入理解Config分布式配置中心

原创作者:田超凡(程序员田宝宝) 版权所有,引用请注明原作者,严禁复制转载 Part 1 理论部分 1 什么是SpringCloud Config? 当一个系统中的配置文件发生改变的时候,我们需要重新启动该服务&am…

信号处理--基于FBCSP滤波方法的运动想象分类

目录 理论 工具 方法 代码获取 理论 通用空间模式 (CSP) 算法可以用来有效构建最佳空间滤波器区分,然后实现运动想象的数据中的脑电信号的区分。然而,空间滤波器性能的好坏主要取决于其工作频带。如果脑电信号没有经过滤波或者滤波的频带范围不合适…

贝尔曼最优方程【BOE】

强化学习笔记 主要基于b站西湖大学赵世钰老师的【强化学习的数学原理】课程,个人觉得赵老师的课件深入浅出,很适合入门. 第一章 强化学习基本概念 第二章 贝尔曼方程 第三章 贝尔曼最优方程 文章目录 强化学习笔记一、最优策略二、贝尔曼最优方程(BOE)三…

边缘计算【智能+安全检测】系列教程-- Jeton Agx Orin 基础环境搭建

1 .前期准备 Jetson Agx Orin 比Jetson Agx Orin Xavier的算力要高,性能要好通常用来做自动驾驶的AI推理,具体外观如下图 1.刷机软件sdkmanager:下载链接 NVIDIA账号需要注册,正常一步一步往下走就行。在ubuntu18以上的系统安…

每日一题 --- 两两交换链表中的节点[力扣][Go]

两两交换链表中的节点 题目:24. 两两交换链表中的节点 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例 1&a…

图解Kafka架构学习笔记(三)

准备Kafka环境 这里推荐使用Docker Compose快速搭建一套本地开发环境。 以下docker-compose.yml文件用来搭建一套单节点zookeeper和单节点kafka环境,并且在8080端口提供kafka-ui管理界面。 version: 2.1services:zoo1:image: confluentinc/cp-zookeeper:7.3.2hos…

ARMday7作业

实现三个按键的中断,现象和代码 do_ipr.c #include "stm32mp1xx_gic.h" #include "stm32mp1xx_exti.h" extern void printf(const char *fmt, ...); unsigned int i 0; void do_irq(void) {//获取要处理的中断的中断号unsigned int irqnoGI…

抽取CLOB字段中XML的特定元素的VALUE值

在ORACLE数据库中,有时XML文件会被保存在CLOB字段中。 这时候,若是我们要获取此字段XML中特定元素的VALUE值,就需要用到xmltype 这个函数。 如下面的 XML文件,保存在 TABLE_A 的CLOB_K 字段,若是我们要获取其中的 Y…

Windows11 安装VitrulBox Ubuntu20 虚拟机启动后卡在“Freeing initrd memory: 131304K”

步骤:点击启动Ubuntu后,一直起不来?没办法正常关机,选择重启又一直卡在这里,原来是同样的错误 Freeing initrd memory: 131304K 原因:本机联想小新14Pro,AMD 7840HS,锐龙版。而Ryze…

OpenCV4.9.0开源计算机视觉库核心功能(核心模块)

转到:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV 介绍使用 下一篇:如何使用OpenCV扫描图像、查找表和时间测量 ​ OpenCV核心功能主要有以下各个:本文将开始介绍下列内容: Mat - 基…