Hive 解决数据倾斜方法

数据倾斜问题, 通常是指参与计算的数据分布不均, 即某个 key 或者某些 key 的数据量远超其他 key, 导致在 shuffle 阶段, 大量相同 key 的数据被发往同一个 Reduce, 进而导致该 Reduce 所需的时间远超其他 Reduce, 成为整个任务的瓶颈 。
Hive 中的数据倾斜常出现在分组聚合和 join 操作的场景中,下面分别介绍在上述两种 场景下的优化思路。

1) 分组聚合导致的数据倾斜

Hive 中的分组聚合是由一个 MapReduce Job 完成的。Map 端负责读取数据, 并按照分组字段分区, 通过 Shuffle, 将数据发往 Reduce 端, 各组数据在 Reduce 端完成最终 的聚合运算。若 group by 分组字段的值分布不均,就可能导致大量相同的 key 进入同一 Reduce, 从而导致数据倾斜。
由分组聚合导致的数据倾斜问题, 有如下解决思路:

  • (1) 判断倾斜的值是否为 null
    若倾斜的值为null, 可考虑最终结果是否需要这部分数据,若不需要,只要提前将null 过滤掉,就能解决问题 。若需要保留这部分数据,考虑以下思路。
  • (2) Map-Side 聚合
    开启 Map-Side 聚合后,数据会先在 Map 端完成部分聚合工作。这样一来即便原始数据是倾斜的, 经过 Map 端的初步聚合后,发往 Reduce 的数据也就不再倾斜了 。 最佳状态下,Map 端聚合能完全屏蔽数据倾斜问题。
    相关参数如下:
set hive.map.aggr=true;
set hive.map.aggr.hash.min.reduction=0.5;
set hive.groupby.mapaggr.checkinterval=0.5;
set hive.map.aggr.hash.force.flush.memory.threshold=0.9;
  • (3) Skew-GroupBy 优化
    Skew-GroupBy 是 Hive 提供的一个专门用来解决分组聚合导致的数据倾斜问题的方案。 其原理是启动两个 MR 任务, 第一个 MR 按照随机数分区, 将数据分散发送到 Reduce, 并 完成部分聚合, 第二个 MR 按照分组字段分区, 完成最终聚合。
    相关参数如下:
-- 启用分组聚合数据倾斜优化
set hive.groupby.skewindata=true;

2) Join 导致的数据倾斜

若 Join 操作使用的是 Common Join 算法,就会通过一个 MapReduce Job 完成计算 。Map 端负责读取 Join 操作所需表的数据,并按照关联字段进行分区,通过 Shuffle,将其发送到 Reduce 端,相同 key 的数据在 Reduce 端完成最终的 Join 操作。如果关联字段的值分布不均, 就可能导致大量相同的 key 进入同一 Reduce, 从而导致数据倾斜问题。
由 Join 导致的数据倾斜问题, 有如下解决思路:

  • (1) Map Join
    使用 Map Join 算法,Join 操作仅在 Map 端就能完成,没有 Shuffle 操作,没有 Reduce 阶段,自然不会产生 Reduce 端的数据倾斜 。该方案适用于大表 Join 小表时发生数据倾斜的场景。
    相关参数如下:
set hive.auto.convert.join=true;
set hive.auto.convert.join.noconditionaltask=true;
set hive.auto.convert.join.noconditionaltask.size=10000000;
  • (2)Skew Join
    若参与 Join 的两表均为大表,Map Join 就难以应对了 。此时可考虑 Skew Join, 其核心原理是Skew Join为倾斜的大 key 单独启动一个 Map Join 任务进行计算,其余 key进行正常的 Common Join 。 原理图如下:
    在这里插入图片描述
    相关参数如下:
--启用skew join 优化
set hive.optimize.skewjoin=true;
--触发skew join 的阈值,若某个key的行数超过该参数值,则触发
set hive.skewjoin.key=100000;
  • 3) 调整 SQL 语句
    若参与 Join 的两表均为大表,其中一张表的数据是倾斜的,此时也可通过以下方式对 SQL 语句进行相应的调整。
    假设原始 SQL 语句如下:A,B 两表均为大表,且其中一张表的数据是倾斜的。
hive (default)>
select
	*
from A
join B
on A.id=B.id;

其 Join 过程如下:
在这里插入图片描述
图中 1001 为倾斜的大 key,可以看到,其被发往了同一个 Reduce 进行处理。
调整之后的 SQL 语句执行计划如下图所示:
在这里插入图片描述
调整 SQL 语句如下:

hive (default)>
select
	*
from (
	select --打散操作
	concat (id, '_ ',cast(rand()*2 as int)) id,
	value
	from A
)ta
join (
	select --扩容操作
		concat (id, '_ ',1) id,
		value
	from B
	union all
	select
		concat (id, '_ ',2) id,
		value
	from B
)tb
on ta.id=tb.id;

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

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

相关文章

easyui datagrid单元格点击进入编辑时,行会自动向上错位

现象描述,点击第20行可编辑的单元格进入编辑状态时,滚动条自动滚动到第19行了。导致第20行被分页遮挡,看不到无法编辑。 排查了一天百度AI说是滚动定位问题,最后发现是自己设置的列有问题,表格总共五列,全…

mysql面试题八(SQL语句)

目录 1.SQL 基本组成部分 常用操作示例 创建表 插入数据 查询数据 更新数据 删除数据 创建索引 授予用户权限 2.常见的聚合查询 1. 计数(COUNT) 2. 求和(SUM) 3. 平均值(AVG) 4. 最大值&…

4套java智慧型管理系统源码-智慧校园-智慧工地-智慧城管-智慧3D导诊

第一套:Java智慧校园系统源码 智慧学校源码 微信小程序电子班牌 智慧校园系统简介: 智慧校园的建设逐渐被师生、家长认可接受,智慧校园通过对在校师生、教务等所有人员的信息以及各种信息搜集与储存,进行数据优化与管理&#xf…

Formik:让用户体验更加出色的表单解决方案

hi, 大家好,我是徐小夕, 今天又到了我们的博学时间。今天和大家分享一款非常有价值的开源项目——Formik。 这款开源项目也是我研究零代码搭建平台——H5-Dooring 时参考的项目之一,它可以提高表单渲染引擎的性能和效率,构建出性能…

弱口令之暴力破解

目录 前言 弱口令与暴力破解介绍 漏洞挖掘实战专栏 个人介绍 第一关:基于表单的暴力破解 绕过步骤 1.第一步抓包观察 2.使用burp的攻击模块 3.选择攻击模式以及爆破字典 ​编辑 4.进行爆破 第二关 验证码绕过(on server) 绕过步骤 1.观察输入错误观察返回结果 2…

MATLAB中左边的大括号最后一行为什么会留很大的空白——解决

看了一些帖子说改字体,但是并没有什么用,在此给出亲测有效的方法:改变矩阵的行间距 先说一下问题 上图中留有大块空白 **解决办法:**光标放在矩阵上 格式——矩阵——更改矩阵,在矩阵设置中选中“行高相等”&#xff…

网络IO模型 select poll epoll的区别

epoll与select、poll的对比 1. 用户态将文件描述符传入内核的方式 select:创建3个文件描述符集并拷贝到内核中,分别监听读、写、异常动作。这里受到单个进程可以打开的fd数量限制,默认是1024。 poll:将传入的struct pollfd结构…

基于Springboot的社区防疫物资申报系统(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的社区防疫物资申报系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系…

插入排序的可视化实现(Python)

插入排序的Python代码 import tkinter as tk import random import timeclass InsertionSortVisualizer:def __init__(self, root, canvas_width800, canvas_height400, num_bars10):self.root rootself.canvas_width canvas_widthself.canvas_height canvas_heightself.nu…

MySQL学习笔记1(MySQL基础)

1.MySQL基础 1.数据库相关概念 ​ *数据库:存储数据的仓库,数据是有组织的进行存储 DtaBase(DB) ​ *数据管理系统:操纵和管理数据库的大型软件 DataBase Management System (DBMS) ​ *SQL:操作关系型数据库的编程语言&#…

抖音ip地址怎么换位置

抖音,作为一款短视频分享平台,已经成为了许多人展示生活、分享才艺的重要舞台。然而,在抖音的使用过程中,你是否想过更换自己的IP地址位置呢?更换IP地址不仅可以帮助你访问一些地域限制的内容,还可以为你的…

3D开发工具HOOPS助力CAM软件优化制造流程

在现代制造业中,计算机辅助制造(CAM)软件的发展已成为提高生产效率和产品质量的关键。为了满足不断增长的需求和日益复杂的制造流程,CAM软件需要具备高效的CAD数据导入、云端协作、移动应用支持以及丰富的文档生成能力。 Tech So…

node.js-模块化

定义:CommonJS模块是为Node.js打包Javascript代码的原始方式。Node.js还支持浏览器和其他Javascript运行时使用的ECMAScript模块标准。 在Node.js中,每个文件都被视为一个单独的模块。 概念:项目是由很多个模块文件组成的 好处&#xff1a…

09 JavaScript学习:对象

对象的概念 在计算机科学中,对象是一种数据结构,用于存储数据和方法(也称为函数)。对象可以包含属性(也称为成员变量)和方法(也称为成员函数),通过这些属性和方法可以描述…

开发必会:JWT技术揭秘,一次性拿捏

1. 引言 现在前后端分离项目已经成为 主流的开发模式,而在项目开发过程中多多少少都会接触到登录相关的业务,几乎是绕不开的一部分。而只要涉及到登录模块,大部分的开发中都会用提到一种叫做token的东西,顾名思义,tok…

c语言不难说C语言难的,已经说明你根本不适合计算机编程工作

对普通人来说C语言是学习编程的最佳入门语言,有效培养你的编程思维,你有了这个基础后去学其它语言,你会惊讶地发现原来其它语言原来这么好学,现在出现一个Python说小白最适合,在开始前我有一些资料,是我根据…

Proxyman Premium for Mac:网络调试利器,开发者首选!

Proxyman Premium for Mac是一款功能强大的网络调试和分析工具,专为开发者和测试人员打造。这款软件以其出色的性能和丰富的功能,帮助用户在网络开发和调试过程中更有效地分析和拦截网络请求,进行必要的修改和重发,从而进行更深度…

渐进时间复杂度O(n)

基本操作数 算法的运行速度受计算机性能的影响,所以通常考虑算法效率的不是算法运行的实际用时,而是算法运行所需要进行的基本操作的数量。 像加减乘除、访问变量、给变量赋值等都可以看作基本操作。对基本操作的计数或是估测可以作为评判算法用时的指标…

Java中的封装

package day32; ​ public class Person {private String name;private int age; ​public String getName() {return name;} ​public void setName(String name) {this.name name;} ​public int getAge() {return age;} ​public void setAge(int age) {if (age>120 || …

webstorm 设置大括号、问号、冒号、if 或for条件 、+-*/ 运算符等两侧的空格(2024-04-18)

在setting设置里面 我这里演示javascript 【Editor-Code Style-JavaScript-Spaces】 import {Component} from react 改为 的 import { Component } from react { }内部两侧都加空格 根据自己的需求设置 [ ]大括号内部两端的空格