ETL数据倾斜与资源优化

news/2024/5/9 10:22:10/文章来源:https://blog.csdn.net/shuo642432980/article/details/136981227

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.luyixian.cn/news_show_1026275.aspx

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

相关文章

蓝桥杯嵌入式学习笔记(6):IIC程序设计

目录 前言 1. IIC基本原理 2. 电路原理 3. 代码编程 3.1 预备工作 3.2 AT24C02写读功能编写 3.2.1 AT24C02写操作实现 3.2.2 AT24C02读操作实现 3.3 MCP4017写读功能编写 3.3.1 MCP4017写操作实现 3.3.2 MCP4017读操作实现 3.4 main.c编写 3.4.1 头文件引用 3.4.…

FASTAPI系列 16-其他响应类型

FASTAPI系列 16-其他响应类型 文章目录 FASTAPI系列 16-其他响应类型前言一、HTMLResponse 响应 HTML二、纯文本响应三、另外的JSON 响应四、FileResponse文件五、StreamingResponse六、RedirectResponse 重定向请求总结更多内容,请关注公众号, 发送666 更可以得到免…

面试算法-92-不同的二叉搜索树 II

题目 给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。 示例 1: 输入:n 3 输出:[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],…

移动硬盘盒结合PD技术为电脑供电:一种便携高效的供电新方案

在数字化时代,电脑已经成为我们生活和工作中不可或缺的工具。而在电脑的使用过程中,供电问题一直是我们需要关注的重要方面。近年来,随着技术的不断进步,移动硬盘盒子与PD(Power Delivery)技术的结合&#…

pnpm :无法加载文件 D:\nodejs\node_global\pnpm.ps1,因为在此系统上禁止运行脚本

一、问题描述 pnpm : 无法加载文件 D:\zyt\work\soft\node\node_global\pnpm.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_Execution_Policies。 所在位置 行:1 字符: 1pnpm --ver…

UOS、Linux下的redis的详细部署流程(适用于内网)

提示:适用于Linux以及UOS等内外网系统服务器部署。 文章目录 一.上传离线包二.部署基本环境三.解压并安装redis四.后台运行redis五.uos系统可能遇到的问题六.总结 一.上传离线包 1.自己去Redis官网下载适配自己部署系统的redis安装包。 2.通过文件传输工具&#xf…

『Apisix进阶篇』动态负载均衡:APISIX的实战演练与策略应用

🚀『Apisix系列文章』探索新一代微服务体系下的API管理新范式与最佳实践 【点击此跳转】 📣读完这篇文章里你能收获到 🎯 掌握APISIX中多种负载均衡策略的原理及其适用场景。📈 学习如何通过APISIX的Admin API和Dashboard进行负…

Redis - list 列表

前言 列表类似于 Java 中的数组或者顺序表,在 Redis 中,可以对列表两端插⼊(push)和弹出(pop),还可以获取指定范围的元素列表、 获取指定索引下标的元素等。列表是⼀种⽐较灵活的数据结构&#…

16、OpenFeign和Sentinel集成实现fallback服务降级

注:本篇文章主要参考周阳老师讲解的cloud进行整理的! 1、需求说明 cloudalibaba-consumer-nacos-order83 通过OpenFeign调用 cloudalibaba-provider-payment9001 1、 83 通过OpenFeign调用 9001微服务,正常访问OK 2、 83 通过OpenFeign调用 …

【Redis教程0x01】入门:Windows下安装和启动Redis

什么是Redis? Redis 是互联网技术领域中使用最广泛的存储中间件,它是 Remote Dictionary Service 三个单词中加粗字母的组合。 Redis 以超高的性能、完美的文档、简洁的源码著称,国内外很多大型互联网公司都在用。它的版本更新非常的快&…

腾讯云2核2G服务器CVM S5和轻量应用服务器优惠价格

腾讯云2核2G服务器多少钱一年?轻量服务器61元一年,CVM 2核2G S5服务器313.2元15个月,腾讯云2核2G服务器优惠活动 txyfwq.com/go/txy 链接打开如下图: 腾讯云2核2G服务器价格 轻量61元一年:轻量2核2G3M、3M带宽、200GB月…

力扣-20 有效的括号详解 Java

目录 1.题目分析 2.基础知识储备 2.1 哈希表 2.2 栈的存取 3. 逻辑概要 4.源码 示例 1.题目分析 为了对比都是从内而外,一个个匹配,全部匹配成功即为有效字符 2.基础知识储备 2.1 哈希表 简单来说,keyvalue存储 ,通过key…

Go打造REST Server【二】:用路由的三方库来实现

前言 在之前的文章中,我们用Go的标准库来实现了服务器,JSON渲染重构为辅助函数,使特定的路由处理程序相当简洁。 我们剩下的问题是路径路由逻辑,这是所有编写无依赖HTTP服务器的人都会遇到的问题,除非服务器只处理一到…

基于Google云原生工程师的kubernetes最佳实践(三)

目录 三、集群管理 利用node affinity、taint等机制管理node 通过pod affinity/anti-affinity机制将pod分配到合适的node Node分级管理 从Qos角度将Pod分级 用namespace隔离不同的环境和用户 配置RBAC权限控制 1. 遵循最小权限原则 2. 使用 Role 和 ClusterRole 分离权…

Nuxt3(项目创建)

1.官方文档 Installation Get Started with Nuxt 2.版本要求 node版本>18.0,建议使用偶数版本 3.安装 可采用npx或pnpm,本人使用的pnpm进行安装,如果提示npx没有安装的话使用npm install -g npx安装即可。 // 安装npx npm install…

Python爬虫学习完整版

一、什么是爬虫 网络爬虫,是一种按照一定规则,自动抓取互联网信息的程序或者脚本。由于互联网数据的多样性和资源的有限性,根据用户需求定向抓取相关网页并分析也成为如今主流的爬取策略。 1 爬虫可以做什么 你可以爬取网络上的的图片&#…

全国超市数据可视化仪表板制作

全国超市消费数据展示 指定 Top几 客户销费数据展示 指定 Top几 省份销费数据展示 省份销售额数据分析 完整结果

FFmpeg拉取RTSP流并定时生成10秒短视频

生成效果: 视频时长为10秒 生成格式为FLV 输出日志: 完整实现代码如下: 需要在Mac和终端先安装FFmpeg brew install ffmpeg CMake文件配置: cmake_minimum_required(VERSION 3.27) project(ffmpeg_open_stream) set(CMAKE_CXX_STANDARD 17)#头文件包目录 include_director…

IDEA 2023右下角无git分支显示解决

当你排除项目问题之后,可能就是idea配置问题了,需要在View -> Appearance -> Status Bar Widgets 中 把 git Branch 勾上。

6.windows ubuntu 子系统 测序数据质量控制。

上一个分享,我们对测序数据进行了质量评估,接下来我们需要对数据进行数据质量控制。 数据预处理(Data Preprocessing):包括去除接头序列(adapter trimming)、去除低质量序列(qualit…