数据倾斜优化:Hive性能提升的核心

文章目录

    • 1. 定义
    • 2. 数据倾斜
      • 2.1 Map
      • 2.2 Join
      • 2.3 Reduce
    • 3. 写在最后

1. 定义

数据倾斜,也称为Data Skew,是在分布式计算环境中,由于数据分布不均匀导致某些任务处理的数据量远大于其他任务,从而形成性能瓶颈的现象。这种情况在Hive中尤为常见,可能发生在MapReduce作业的MapReduce阶段。

就好比像是在一个拥挤的超市里,所有的顾客都挤在一个收银台前排队结账,而其他的收银台却几乎没有人。这种情况在数据处理中也会发生,我们称之为“数据倾斜”。

想象一下,你有一个巨大的数据集,需要分成很多小块来同时处理(这就像超市开了很多个收银台)。理想情况下,每个收银台(或者说数据处理任务)应该处理差不多数量的数据块。但有时候,由于数据的某些特征或者我们的处理方式,大部分数据块都被送到了同一个任务那里,导致这个任务要处理的数据远远多于其他任务。

数据倾斜的常见表现包括:

  • 任务进度长时间维持在99%,少数Reduce任务未完成。
  • 单一Reduce的记录数与平均记录数差异极大。

2. 数据倾斜

MapReduce执行过程可以简化为以下几个主要步骤:
MapReduce

  1. 输入阶段(Input)

    • 数据从HDFS等存储系统中读取到MapReduce作业。
  2. 映射阶段(Map)

    • 输入数据被分割成多个chunks,每个chunk由一个Map任务处理。
    • Map任务对数据进行处理,输出中间key-value对。
  3. 洗牌阶段(Shuffle)

    • 中间key-value对根据key进行排序和分组。
    • 相同key的数据被发送到同一个Reducer。
  4. 排序阶段(Sort)

    • 数据在Shuffle过程中被排序,确保相同key的数据聚集在一起。
  5. 归约阶段(Reduce)

    • Reducer接收分组后的数据,对每个key对应的value进行归约处理,如求和、合并等。
  6. 输出阶段(Output)

    • 最终结果被写回到存储系统中,通常是HDFS。

Hadoop基础-07-MapReduce概述

2.1 Map

  1. 映射阶段(Map)
  • 输入数据被分割成多个chunks,每个chunk由一个Map任务处理。
  • Map任务对数据进行处理,输出中间key-value对。

Map阶段倾斜,或者说Map端数据倾斜,会遇到一些Map实例承担了不成比例的重担,而另一些Map实例却相对轻松。这种现象,我们称之为Map端的长尾效应,通常发生在以下情况:

  1. 小文件过多:当Hive处理的输入数据包含大量小文件时,每个小文件都可能被当作一个独立的任务处理。如果这些小文件数量极多,会导致生成大量的Map任务,每个任务处理的数据量很少,但任务的启动和初始化开销却相对较大,这会造成资源的浪费和处理效率的降低。

  2. 数据块大小不均:如果输入数据的块大小差异很大,比如一个大文件和许多小文件,这可能导致Map任务处理的数据量不均衡。大文件可能被分割成多个任务,而小文件则可能保持独立,导致某些Map任务处理的数据远多于其他任务。

  3. Map任务逻辑复杂:即使数据块大小相对均匀,如果Map端的计算逻辑非常复杂,比如Count Distinct时,如果某些Map实例读取到的特定值频繁出现,这将导致这些实例处理的数据量激增,形成长尾。这一种涉及到大量的条件判断或聚合操作,也可能导致某些Map任务执行时间过长。

  4. 数据源倾斜:输入数据在物理或逻辑上分布不均,造成某些Map任务分配到的数据远多于其他任务。

Map端倾斜的具体表现可能包括:

  • 部分Map任务进度缓慢,而其他任务已经完成。
  • 资源使用不均衡,某些节点或任务长时间占用大量资源。
  • 作业整体执行时间长,因为等待最慢的Map任务完成。

总而言之一句话:输入文件的大小不均匀。

解决Map端倾斜的方法可能包括:

  • 合并小文件:在作业执行前,通过set hive.merge.mapfiles=true合并小文件,减少Map任务的数量。
  • 调整Map任务数量:通过设置mapred.map.tasks参数来增加或减少Map任务的数量,以适应数据量和计算复杂性。
  • 优化输入格式:选择合适的输入格式,比如使用Hive的InputFormat来优化数据的读取。
  • 简化Map逻辑:优化Map端的代码逻辑,减少不必要的计算和数据移动。

2.2 Join

  1. 排序阶段(Sort)
  • 数据在Shuffle过程中被排序,确保相同key的数据聚集在一起。


Reduce阶段倾斜可能是由于Map阶段输出的键值对分布不均匀,或者Reduce任务逻辑处理复杂度高导致的。

Join阶段常见的数据倾斜场景及其解决方法:

  1. MapJoin优化小输入场景

    • 当我们进行Join操作时,如果其中一个表的数据量很小,可以把它整个加载到内存中。
  2. 处理空值导致的长尾

    • 如果Join操作中,由于某些空值字段导致大量数据集中在少数几个处理节点上,我们可以把这些空值替换为随机分配的值。
  3. 热点值导致的长尾处理

    • 当Join操作涉及两个大表,而且某个或某些特定的值(热点值)非常常见,导致数据处理时出现瓶颈,我们可以把这些热点值和非热点值分开处理。

以下是将Join倾斜的解决方案与出现场景整理成表格的形式:

倾斜场景问题描述解决方案具体方法
MapJoin适用Join操作中某路输入较小使用MapJoin避免倾斜将小表读入内存,在Map端完成Join操作,避免数据在Reduce端的不均匀分发。
空值导致长尾关联key出现大量空值将空值处理成随机值空值无法参与Join,转换为空值的随机分配,既不影响结果,也避免数据聚集。
热点值导致长尾Join输入较大且存在热点值热点值和非热点值分别处理识别热点key,将数据分为热点和非热点两部分,分别进行Join操作后合并结果。
  1. MapJoin优化小输入场景
   SET hive.auto.convert.join = true;
   SELECT /*+ MAPJOIN(small_table) */
       a.id,
       a.value,
       b.description
   FROM
       large_table a
   JOIN
       small_table b
   ON
       a.key = b.key;
  1. 处理空值导致的长尾
SELECT
   COALESCE(a.key, CONCAT('random_', CAST(RAND() * 1000 AS INT))) AS key,
   a.value,
   b.description
FROM
   large_table a
LEFT JOIN
   another_table b
ON
   COALESCE(a.key, CONCAT('random_', CAST(RAND() * 1000 AS INT))) = b.key;
  1. 热点值导致的长尾处理
   -- 处理非热点值
   SELECT
       a.id,
       a.value,
       b.description
   FROM
       large_table a
   JOIN
       another_large_table b
   ON
       a.key = b.key
   WHERE
       a.key NOT IN ('hot_value1', 'hot_value2');

   -- 处理热点值
   SELECT
       a.id,
       a.value,
       b.description
   FROM
       large_table a
   JOIN
       another_large_table b
   ON
       a.key = b.key
   WHERE
       a.key IN ('hot_value1', 'hot_value2');

2.3 Reduce

  1. 归约阶段(Reduce)
  • Reducer接收分组后的数据,对每个key对应的value进行归约处理,如求和、合并等。

Reducer导致的倾斜情况有很多,一句话归纳就是:键值分布不均匀导致分区不均衡,从而引起数据倾斜。

  1. Map端数据膨胀

    • 场景:对同一表按不同维度进行Count Distinct操作,导致Map端数据膨胀,进而导致下游Join的Reduce阶段出现长尾。
    • 解决方法:提前在Map端进行部分聚合,减少传输的数据量。
  2. 键值分布不均

    • 场景:Map端直接做聚合时,键值分布不均,导致单个Reducer负载过重。
    • 解决方法:对键值添加随机前缀(盐值),均衡数据分布。
  3. 动态分区过多

    • 场景:动态分区数过多,造成小文件过多,引起Reduce端长尾。
    • 解决方法:控制动态分区数量,合并小文件。
  4. 多个Distinct操作

    • 场景:SQL中多个Distinct操作导致数据多次分发,数据膨胀,放大长尾现象。
    • 解决方法:合并多个Distinct操作,或优化查询逻辑以减少数据分发次数。

3. 写在最后

在数据处理倾斜的时候,我们需要采取多种策略来优化性能。从Map端到Reduce端,每个阶段的数据分布不均可能导致处理效率的严重下降,甚至造成作业执行时间的显著延长。
通过本文探讨的Map端数据膨胀、Reduce端键值分布不均、以及动态分区过多等典型场景,我们深入分析了每种情况的解决方案。在实际应用中,我们应该根据具体情况灵活调整,采取合适的优化策略,以提升Hive作业的整体性能和稳定性。

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

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

相关文章

Studying-代码随想录训练营day24| 93.复原IP地址、78.子集、90.子集II

第24天,回溯算法part03,牢记回溯三部曲,掌握树形结构结题方法💪 目录 93.复原IP地址 78.子集 90.子集II 总结 93.复原IP地址 文档讲解:代码随想录复原IP地址 视频讲解:手撕复原IP地址 题目&#xff1…

python open函数中文乱码怎么解决

首先在D盘下新建一个html文档,接着在里面输入含有中文的Html字符,使用中文格式对读取的字符进行解码,再用utf-8的模式对字符进行编码,然后就能正确输出中文字符。 代码如下: # -*- coding: UTF-8 -*- file1 open(&quo…

策略模式在金融业务中的应用及其框架实现

引言 策略模式(Strategy Pattern)是一种行为设计模式,它允许在不修改客户端代码的情况下,动态地改变一个类的行为。它通过定义一系列算法并将它们封装在独立的策略类中,使这些算法可以互相替换,而不会影响…

【原理】机器学习中的最小二乘法公式推导过程

本文来自《老饼讲解-BP神经网络》https://www.bbbdata.com/ 目录 一、什么是最小二乘法1.1. 什么是最小二乘法1.2. 最小二乘法的求解公式 二、最小二乘法求解公式的推导 最小二乘法是基本的线性求解问题之一,本文介绍最小二乘法的原理,和最小二法求解公式…

Python技术笔记汇总(含语法、工具库、数科、爬虫等)

对Python学习方法及入门、语法、数据处理、数据可视化、空间地理信息、爬虫、自动化办公和数据科学的相关内容可以归纳如下: 一、Python学习方法 分解自己的学习目标:可以将学习目标分基础知识,进阶知识,高级应用,实…

开源模型破局OpenAI服务限制,15分钟灵活搭建RAG和Agent应用

简介: 今天,我们做了两个实验,目标在15分钟内,完成下载社区的开源模型,部署成API,替换LlamaIndex中RAG和LangChain中OpenAI接口Agent的最佳实践,并取得符合预期的结果。 实验一 实验目标&…

企业级im即时通讯,WorkPlus专注于政企移动数字化平台底座

企业级IM即时通讯是为满足政府和企业内部通讯需求而设计的高级通讯解决方案。作为一家专注于政企移动数字化平台底座的企业,WorkPlus为政府和企业提供了安全专属的移动数字化解决方案。本文将介绍企业级IM即时通讯的重要性、WorkPlus的特点和优势。 1. 企业级IM即时…

AttGAN实验复现 2024

AttnGAN 代码复现 2024 文章目录 AttnGAN 代码复现 2024简介环境python 依赖数据集TrainingPre-train DAMSMTrain AttnGAN SamplingB_VALIDATION 为 False (默认)B_VALIDATION 为 True 参考博客 简介 论文地址: https://arxiv.org/pdf/1711.10485.pdf 代码 python…

springboot使用测试类报空指针异常

检查了Service注解,还有Autowired注解,还有其他注解,后面放心没能解决问题,最后使用RunWith(SpringRunner.class)解决了问题!! 真的是✓8了,烦死了这个✓8报错!

DIVE INTO DEEP LEARNING 56-60

文章目录 56 Gated Recurrent Unit(GRU)56.1 Motivation: How to focus on a sequence56.2 The concept of doors56.3 Candidate hidden state56.4 hidden state56.5 summarize56.6 QA 57 Long short-term memory network57.1 Basic concepts57.2 Long short-term memory netwo…

240630_昇思学习打卡-Day12-Transformer中的Multiple-Head Attention

240630_昇思学习打卡-Day12-Transformer中的Multiple-Head Attention 以下为观看大佬课程及查阅资料总结所得,附大佬视频链接:Transformer中Self-Attention以及Multi-Head Attention详解_哔哩哔哩_bilibili,强烈建议先去看大佬视频&#xff…

BGE M3-Embedding 模型介绍

BGE M3-Embedding来自BAAI和中国科学技术大学,是BAAI开源的模型。相关论文在https://arxiv.org/abs/2402.03216,论文提出了一种新的embedding模型,称为M3-Embedding,它在多语言性(Multi-Linguality)、多功能…

【MySQL】库的操作【创建和操纵】

文章目录 1.创建数据库1.1字符集和校验规则1.查看系统默认字符集以及校验规则2.查看数据库支持的字符集以及校验规则 1.2校验规则对数据库的影响1.创建一个数据库,校验规则使用utf8_ general_ ci[不区分大小写]2.创建一个数据库,校验规则使用utf8_ bin[区…

如何借助 LLM 设计和实现任务型对话 Agent

1 引言 在人工智能的快速发展中,任务型对话 Agent 正成为提升用户体验和工作效率的关键技术。这类系统通过自然语言交互,专注于高效执行特定任务,如预订酒店或查询天气。尽管市场上的开源框架如 Rasa 和 Microsoft Bot Framework 在对话理解…

24年诺瓦星云入职认知能力测验Verify + 职业性格问卷OPQ可搜索带解析求职SHL题库

一、走进西安诺瓦星云科技股份有限公司 西安诺瓦星云科技股份有限公司(简称诺瓦星云) 是全球极具竞争力的LED显示解决方案供应商,实施"基于西安,围绕北京与深圳,辐射全球"的全球化布局,总部位于西安,西安、…

嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间

目录 1 进程时间概念 2 times 函数 2.1 times 函数介绍 2.2 示例程序 3 clock 函数 3.1 clock 函数介绍 3.2 示例程序 1 进程时间概念 进程时间指的是进程从创建后(也就是程序运行后)到目前为止这段时间内使用 CPU 资源的时间总数,出…

足球虚拟越位线技术FIFA OT(一)

此系列文章用于记录和回顾开发越位线系统的过程,平时工作较忙,有空时更新。 越位线技术 越位技术已被用于图形化分析足球中潜在的越位情况。 自 2018 年将视频助理裁判 (VAR) 引入比赛规则以来,人们越来越关注准确确…

力扣 单词规律

所用数据结构 哈希表 核心方法 判断字符串pattern 和字符串s 是否存在一对一的映射关系,按照题意,双向连接的对应规律。 思路以及实现步骤 1.字符串s带有空格,因此需要转换成字符数组进行更方便的操作,将字符串s拆分成单词列表…

ESP32实现UDP连接——micropython版本

代码: import network import socket import timedef wifiInit(name, port):ap network.WLAN(network.AP_IF) # 创建一个热点ap.config(essidname, authmodenetwork.AUTH_OPEN) # 无需密码ap.active(True) # 激活热点ip ap.ifconfig()[0] # 获取ip地址print(…

C++(Python)肥皂泡沫普拉托边界膜曲面模型算法

🎯要点 🎯肥皂泡二维流体模拟 | 🎯泡沫普拉托边界膜曲面模型算法演化厚度变化 | 🎯螺旋曲面三周期最小结构生成 📜皂膜用例:Python计算物理粒子及拉格朗日和哈密顿动力学 | Python和MATLAB粘性力接触力动…