当前位置: 首页 > news >正文

Hive优化操作(二)

Hive 数据倾斜优化

在使用 Hive 进行大数据处理时,数据倾斜是一个常见的问题。本文将详细介绍数据倾斜的概念、表现、常见场景及其解决方案。

1. 什么是数据倾斜?

数据倾斜是指由于数据分布不均匀,导致大量数据集中到某个节点或任务中,造成处理延迟和性能瓶颈。

2. 数据倾斜的表现

  • 作业进度长时间维持在接近完成状态(99%或100%)。
  • 查看任务监控页面时,发现少量 reduce 任务未完成,因为其处理的数据量远超其他任务。

3. 容易产生数据倾斜的场景

3.1 Join 操作:

  • 小表与大表 join 时,key 分布不均。
  • 大表与大表 join 时,分桶字段存在大量空值。

3.2 Group By 操作不和聚集函数搭配使用的时候:

  • 原因

    • 当某些 key 的值在数据集中频繁出现时,相关的数据将集中到一个或少数的 Reducer 上进行处理。
    • 这些 Reducer 处理的数据量过大,导致运行时间长。
  • 表现

    • 某个 Reducer 的任务处理时间明显长于其他 Reducer。
    • 资源分配不均匀,影响整体作业效率。
方法
  • 调整数据分布:通过添加随机数等方法,重新分配数据,减少单个 key 负载。
  • 增加 Reducer 数量:合理增加 Reducer 来分散压力。

3.3 Count Distinct 操作:

  • 原因

    • 需要对唯一值进行计算,因为 count(distinct)是按 group by字段分组,按 distinct字段排序。
    • 如果某个字段的值分布不均匀,某些值过于集中,会导致相关 Reducer 负载过重。
  • 表现

    • 处理时间长,可能导致内存溢出。
    • 某些任务比其他任务需要更多的时间来完成。
解决方法
  • 近似计算:使用 approx_distinct 或其他近似方法减少计算复杂度。
  • 预聚合:在进行去重前,先对数据进行预处理,减少数据量。

4. 数据倾斜的原因

  1. Key 分布不均匀

    • 在分组(Group By)或连接(Join)中,某些 key 的数据远多于其他 key。
  2. 业务数据特性

    • 某些特定值(如默认值、异常值)出现频率过高。
  3. 建表时考虑不周

    • 未合理设计表的分区或分桶策略。
  4. SQL 语句特性

    • 特定 SQL 语句在逻辑上引起数据集中。

5. 解决数据倾斜的常用方案

1. JOIN优化

(1)空值产生的数据倾斜

  • 场景说明:日志中的 user_id 丢失,导致与用户表关联时出现倾斜。
  • 解决方案
    • 方案1:不参与关联

      SELECT *
      FROM log a
      JOIN user b ON a.user_id IS NOT NULL AND a.user_id = b.user_id
      UNION ALL
      SELECT *
      FROM log c
      WHERE c.user_id IS NULL;
      
    • 方案2:赋予空值新 key 值

      SELECT *
      FROM log a
      LEFT OUTER JOIN user b ON CASE WHEN a.user_id IS NULL THEN CONCAT('hive', RAND()) ELSE a.user_id END = b.user_id;
      
    • 总结:方案2效率更高,通过随机字符串分散空值数据。

(2)不同数据类型关联产生的数据倾斜

  • 场景说明:user 表中的 user_id 为 int,log 表中为 string。

  • 解决方案:统一数据类型

    SELECT *
    FROM user a
    LEFT OUTER JOIN log b ON b.user_id = CAST(a.user_id AS STRING);
    

(3)大小表关联查询产生的数据倾斜

  • 场景说明:使用 map join 解决小表关联大表的倾斜问题。

  • 解决方案

    使用 map join 在内存中处理小表,避免 reduce 阶段:

    SELECT /*+ MAPJOIN(b) */ a.id, b.name
    FROM large_table a
    JOIN small_table b ON a.id = b.id;
    
    • Hive 中自动开启 map join 优化:
      SET hive.auto.convert.join=true;
      SET hive.mapjoin.smalltable.filesize=25000000;
      
  • 大表关联:将大表切分成小表,再分别进行 map join。

  • 小表不大不小

    如果小表较大,无法直接用 map join,则采用如下策略:

    SELECT /*+ MAPJOIN(x) */ *
    FROM log a
    LEFT OUTER JOIN (SELECT /*+ MAPJOIN(c) */ d.*FROM (SELECT DISTINCT user_id FROM log) cJOIN users d ON c.user_id = d.user_id
    ) x ON a.user_id = x.user_id;
    
    • 总结:根据具体场景选择适合的优化策略。

2. Map 阶段优化

  • 使用 Combiner

    • 在 Map 阶段聚合中间结果,减少传输数据量。
  • MapJoin 优化

    • 对小表进行 MapJoin,在 Map 阶段完成连接。
    SELECT /*+ MAPJOIN(small_table) */ ... FROM large_table JOIN small_table ON ...
    

3. 增加 Reducer 个数

  • 根据数据量合理调整 Reducer 的数量,以分散负载。
    SET mapreduce.job.reduces = <num>;
    

4. 优化 Count Distinct

  • 减少使用使用Count Distinct次数或使用 approx_distinct 等近似计算方法。

6. 其他

数据扩散

  • 定义:数据扩散指的是在执行某些操作(如连接操作)时,数据量显著增加。例如,当两个表进行连接时,结果集的大小远远超过原始表的大小。
  • 影响:会导致资源消耗增加,处理时间变长,甚至可能导致内存溢出。
  • 解决方法
    • 优化连接条件,确保只连接必需的数据。
    • 使用过滤条件提前减少数据量。

数据漂移

  • 定义:数据漂移通常指的是数据在不同时间段内的分布或特征发生了变化。例如,由于时间延迟,当天的数据可能在第二天被处理。
  • 影响:数据分析结果可能不准确,影响实时性。
  • 解决方法
    • 设计合理的时间窗口,确保数据在合适的时间范围内被处理。
    • 定期检查和调整数据处理策略以适应数据特征的变化。

相关文章:

Hive优化操作(二)

Hive 数据倾斜优化 在使用 Hive 进行大数据处理时&#xff0c;数据倾斜是一个常见的问题。本文将详细介绍数据倾斜的概念、表现、常见场景及其解决方案。 1. 什么是数据倾斜&#xff1f; 数据倾斜是指由于数据分布不均匀&#xff0c;导致大量数据集中到某个节点或任务中&…...

销冠的至高艺术:让自己不像销售

若想在销售领域脱颖而出&#xff0c;首先是让自己超越传统销售的框架&#xff0c;成为客户心中不可多得的行业顾问与信赖源泉。这不仅是身份的蜕变&#xff0c;更是影响力与信任度质的飞跃。 销冠对客户只吸引不骚扰&#xff0c;不讲自己卖什么&#xff0c;只讲自己能解决什么…...

Hive数仓操作(十一)

一、Hive 日期函数 在日常的数据处理工作中&#xff0c;日期和时间的处理是非常常见的操作。Hive 提供了丰富的日期函数&#xff0c;能够帮助我们方便地进行日期和时间的计算。本文将详细介绍 Hive 中常用的日期函数&#xff0c;并通过具体的示例展示其用法和结果。 1. 获取当…...

C语言初步介绍(初学者,大学生)【上】

1.C语⾔是什么&#xff1f; ⼈和⼈交流使⽤的是⾃然语⾔&#xff0c;如&#xff1a;汉语、英语、⽇语 那⼈和计算机是怎么交流的呢&#xff1f;使⽤ 计算机语⾔ 。 ⽬前已知已经有上千种计算机语⾔&#xff0c;⼈们是通过计算机语⾔写的程序&#xff0c;给计算机下达指令&am…...

陈文自媒体:现在的房价,已经跌到7年前!

今年的国庆北上广深都放开了政策&#xff0c;很多人都放弃旅游去看房了&#xff0c;现在的全民都有一个基本意识&#xff0c;现在的房子已经到了谷底&#xff0c;从各大政策就可以看出来&#xff0c;稍微有点钱的可以出手买房了。 昨天我哥跟我说&#xff0c;现在xx地方的房子…...

基于STM32的智能水族箱控制系统设计

引言 本项目基于STM32微控制器设计一个智能水族箱控制系统。该系统能够通过传感器监测水温、照明和水位&#xff0c;并自动控制加热器、LED灯和水泵&#xff0c;确保水族箱内的环境适宜鱼类生长。该项目展示了STM32在环境监测、设备控制和智能反馈系统中的应用。 环境准备 1…...

java语言基础案例-cnblog

java语言基础案例 象棋口诀 输出 package nb;public class XiangQi {public static void main(String[] args) {char a 马;char b 象;char c 卒;System.out.println(a"走日"b"走田""小"c"一去不复还");} }输出汇款单 package nb…...

MyBatis-Plus 之 typeHandler 的使用

一、typeHandler 的使用 1、存储json格式字段 如果字段需要存储为json格式&#xff0c;可以使用JacksonTypeHandler处理器。使用方式非常简单&#xff0c;如下所示&#xff1a; 在domain实体类里面要加上&#xff0c;两个注解 TableName(autoResultMap true) 表示自动…...

HDLBits中文版,标准参考答案 |2.5 More Verilog Features | 更多Verilog 要点

关注 望森FPGA 查看更多FPGA资讯 这是望森的第 7 期分享 作者 | 望森 来源 | 望森FPGA 目录 1 Conditional ternary operator | 条件三目运算符 2 Reduction operators | 归约运算器 3 Reduction: Even wider gates | 归约&#xff1a;更宽的门电路 4 Combinational fo…...

提升开机速度:有效管理Windows电脑自启动项,打开、关闭自启动项教程分享

日常使用Windows电脑时&#xff0c;总会需要下载各种各样的办公软件。部分软件会默认开机自启功能&#xff0c;开机启动项是指那些在电脑启动时自动运行的程序和服务。电脑开机自启太多的情况下会导致电脑卡顿&#xff0c;开机慢&#xff0c;运行不流畅的情况出现&#xff0c;而…...

数据库简单介绍

数据库是现代信息技术中用于存储、管理和检索数据的重要工具。数据库技术的发展经历了多个阶段&#xff0c;从早期的层次模型和网状模型&#xff0c;到关系型数据库的兴起&#xff0c;再到NoSQL和NewSQL的多样化发展。数据库系统已经成为现代信息系统的核心和基础设施。 数据库…...

运用MinIO技术服务器实现文件上传——利用程序上传图片(二 )

在上一篇文章中&#xff0c;我们已经在云服务器中安装并开启了minio服务&#xff0c;本章我们将为大家讲解如何利用程序将文件上传到minio桶中 下面介绍MinIO中的几个核心概念&#xff0c;这些概念在所有的对象存储服务中也都是通用的。 - **对象&#xff08;Object&#xff0…...

C语言 | Leetcode C语言题解之第461题汉明距离

题目&#xff1a; 题解&#xff1a; int hammingDistance(int x, int y) {int s x ^ y, ret 0;while (s) {s & s - 1;ret;}return ret; }...

Qt 3D、QtQuick、QtQuick 3D 和 QML 的关系

理清 Qt 3D、QtQuick、QtQuick 3D 和 QML 的关系 在开发图形界面应用时&#xff0c;特别是在使用 Qt 框架时&#xff0c;开发者可能会接触到多个概念&#xff0c;如 Qt 3D、QtQuick、QtQuick 3D 和 QML。这些术语分别代表了 Qt 中不同的模块或技术&#xff0c;但由于它们的功能…...

软件设计师(软考学习)

数据库技术 数据库基础知识 1. 数据库中的简单属性、多值属性、复合属性、派生属性简单属性&#xff1a;指不能够再分解成更小部分的属性&#xff0c;通常是数据表中的一个列。例如学生表中的“学号”、“姓名”等均为简单属性。 多值属性&#xff1a;指一个属性可以有多个值…...

第一讲:Go语言开发入门:环境搭建与基础语法

文章目录 环境搭建windows环境搭建Mac环境搭建安装GO使用 Homebrew 安装 Go手动下载安装 Go 配置环境变量配置环境变量检查 Go 是否正确安装 验证安装&#xff1a;编写第一个 Go 程序创建 Go 工作区编写 Hello World 程序运行程序编译程序 常用的 Go 命令 Go语言基础语法1. 变量…...

Linux CentOS stream9配置本地yum源

在Linux系统中,yum源配置是一个重要的环节。把系统安装时配置的国外yum源转换为国内yum源,能够帮助系统快速安装软件包。对于网络环境不稳定或无法联网的系统,配置本地yum源,可以让用户在离线状态下也能进行软件包的安装,十分重要。 一、国内源 在使用Linux的日常工作中…...

std::string

std::string是C标准库中的一个基本类模板&#xff0c;专门用于处理字符串。它提供了一个可变长度的字符序列&#xff0c;以及一系列用于字符串操作的方法。std::string是值类型&#xff0c;这意味着当它作为函数参数传递或赋值时&#xff0c;整个字符串数据会被复制。 std::st…...

【Docker】03-自制镜像

1. 自制镜像 2. Dockerfile # 基础镜像 FROM openjdk:11.0-jre-buster # 设定时区 ENV TZAsia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone # 拷贝jar包 COPY docker-demo.jar /app.jar # 入口 ENTRYPOINT ["ja…...

Java GC 分类,8和9使用的哪种?

Java的垃圾收集器&#xff08;Garbage Collector, GC&#xff09;负责自动管理内存&#xff0c;回收不再使用的对象所占用的空间。随着JVM的发展&#xff0c;出现了多种不同特性的垃圾收集器来适应不同的应用场景和性能需求。在Java 8中&#xff0c;主要有以下几种垃圾收集器&a…...

Bili2Text:3分钟将B站视频转为文字稿,AI语音识别提升学习效率10倍

Bili2Text&#xff1a;3分钟将B站视频转为文字稿&#xff0c;AI语音识别提升学习效率10倍 【免费下载链接】bili2text Bilibili视频转文字&#xff0c;一步到位&#xff0c;输入链接即可使用 项目地址: https://gitcode.com/gh_mirrors/bi/bili2text 还在为无法快速获取…...

VSCode调试STM32实战:解决Cortex-Debug插件配置JLink/OpenOCD时最常见的5个报错

VSCode调试STM32实战&#xff1a;破解Cortex-Debug插件五大经典报错 当你在深夜赶工STM32项目&#xff0c;按下F5期待调试器顺利启动时&#xff0c;终端却弹出鲜红的错误信息——这种挫败感每个嵌入式开发者都深有体会。本文不重复那些基础配置教程&#xff0c;而是直击VSCode…...

Arduino库持续集成实战:Travis CI自动化编译测试指南

1. 项目概述&#xff1a;为什么Arduino库需要持续集成&#xff1f; 如果你和我一样&#xff0c;维护过几个甚至几十个Arduino库&#xff0c;那你一定对下面这个场景深恶痛绝&#xff1a;你修复了一个库里的Bug&#xff0c;或者添加了一个新功能&#xff0c;满怀信心地提交了代…...

AD中域用户密码策略不生效的解决方案

每到一个月&#xff0c;AD就会提示修改密码&#xff0c;改就改吧&#xff0c;但是还提示一些乱七八糟的规则。 我把这些规则都禁用或是设为没有定义了&#xff0c;但还是报“不能和之前的0个密码相同”&#xff0c; 最后&#xff0c; 解决方案&#xff1a; 在域控制器服务器中&…...

硬件预取技术:Alecto框架优化与性能提升

1. 硬件预取技术基础与挑战在现代处理器架构中&#xff0c;内存墙&#xff08;Memory Wall&#xff09;问题一直是制约性能提升的关键瓶颈。随着CPU与DRAM之间的速度差距不断拉大&#xff0c;硬件预取技术已成为缓解这一问题的核心手段。传统预取器通过分析程序的内存访问模式&…...

使用kern工具自动化构建Linux内核:从原理到实战

1. 项目概述&#xff1a;一个内核构建与管理的瑞士军刀如果你曾经尝试过编译Linux内核&#xff0c;或者需要为特定的硬件、研究项目定制一个内核&#xff0c;那么你大概率体验过这个过程&#xff1a;下载源码、配置成千上万个选项、解决依赖、漫长编译&#xff0c;最后可能因为…...

不只是安装:在龙芯2k1000LA上为Loongnix配置WiFi、蓝牙与触摸屏驱动的完整流程

龙芯2k1000LA开发板外设驱动深度配置指南&#xff1a;从WiFi到触摸屏的全栈解决方案 在国产化硬件开发领域&#xff0c;龙芯2k1000LA开发板凭借其完全自主的LoongArch架构&#xff0c;正成为物联网和嵌入式设备开发者的重要选择平台。不同于x86架构的"开箱即用"体验&…...

归档日志较多导致磁盘使用率100%,数据库停止服务

文章目录环境症状问题原因解决方案环境 系统平台&#xff1a;银河麒麟 &#xff08;鲲鹏&#xff09; 版本&#xff1a;9.0 症状 数据库服务停止&#xff0c;对外停止响应。 问题原因 服务器磁盘使用率100%&#xff0c;数据库服务因此停止。 解决方案 1、检查服务器磁盘…...

避开这3个坑,你的HMC7044时钟输出才稳定:从VCO选择到奇数分频实战

HMC7044时钟系统设计避坑指南&#xff1a;从VCO选型到分频配置的工程实践 在高速数字系统设计中&#xff0c;时钟信号的稳定性往往决定着整个系统的性能上限。作为业界广泛使用的高性能时钟发生器&#xff0c;HMC7044凭借其出色的抖动性能和灵活的配置选项&#xff0c;成为众多…...

Python篇---常考的数据类型

一、常见数据类型及其特点Python 的数据类型可以分两大类&#xff1a;不可变类型和可变类型。这个区分是很多考点的基础。1. 不可变类型&#xff08;值变了&#xff0c;对象就换了&#xff09;整数 int特点&#xff1a;精度无限&#xff0c;只有整数不分长短。适合大数运算。考…...