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. 数据倾斜的原因
-
Key 分布不均匀:
- 在分组(Group By)或连接(Join)中,某些 key 的数据远多于其他 key。
-
业务数据特性:
- 某些特定值(如默认值、异常值)出现频率过高。
-
建表时考虑不周:
- 未合理设计表的分区或分桶策略。
-
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;
- Hive 中自动开启 map join 优化:
-
大表关联:将大表切分成小表,再分别进行 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 进行大数据处理时,数据倾斜是一个常见的问题。本文将详细介绍数据倾斜的概念、表现、常见场景及其解决方案。 1. 什么是数据倾斜? 数据倾斜是指由于数据分布不均匀,导致大量数据集中到某个节点或任务中&…...
销冠的至高艺术:让自己不像销售
若想在销售领域脱颖而出,首先是让自己超越传统销售的框架,成为客户心中不可多得的行业顾问与信赖源泉。这不仅是身份的蜕变,更是影响力与信任度质的飞跃。 销冠对客户只吸引不骚扰,不讲自己卖什么,只讲自己能解决什么…...
Hive数仓操作(十一)
一、Hive 日期函数 在日常的数据处理工作中,日期和时间的处理是非常常见的操作。Hive 提供了丰富的日期函数,能够帮助我们方便地进行日期和时间的计算。本文将详细介绍 Hive 中常用的日期函数,并通过具体的示例展示其用法和结果。 1. 获取当…...
C语言初步介绍(初学者,大学生)【上】
1.C语⾔是什么? ⼈和⼈交流使⽤的是⾃然语⾔,如:汉语、英语、⽇语 那⼈和计算机是怎么交流的呢?使⽤ 计算机语⾔ 。 ⽬前已知已经有上千种计算机语⾔,⼈们是通过计算机语⾔写的程序,给计算机下达指令&am…...
陈文自媒体:现在的房价,已经跌到7年前!
今年的国庆北上广深都放开了政策,很多人都放弃旅游去看房了,现在的全民都有一个基本意识,现在的房子已经到了谷底,从各大政策就可以看出来,稍微有点钱的可以出手买房了。 昨天我哥跟我说,现在xx地方的房子…...
基于STM32的智能水族箱控制系统设计
引言 本项目基于STM32微控制器设计一个智能水族箱控制系统。该系统能够通过传感器监测水温、照明和水位,并自动控制加热器、LED灯和水泵,确保水族箱内的环境适宜鱼类生长。该项目展示了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格式,可以使用JacksonTypeHandler处理器。使用方式非常简单,如下所示: 在domain实体类里面要加上,两个注解 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 | 归约:更宽的门电路 4 Combinational fo…...
提升开机速度:有效管理Windows电脑自启动项,打开、关闭自启动项教程分享
日常使用Windows电脑时,总会需要下载各种各样的办公软件。部分软件会默认开机自启功能,开机启动项是指那些在电脑启动时自动运行的程序和服务。电脑开机自启太多的情况下会导致电脑卡顿,开机慢,运行不流畅的情况出现,而…...
数据库简单介绍
数据库是现代信息技术中用于存储、管理和检索数据的重要工具。数据库技术的发展经历了多个阶段,从早期的层次模型和网状模型,到关系型数据库的兴起,再到NoSQL和NewSQL的多样化发展。数据库系统已经成为现代信息系统的核心和基础设施。 数据库…...
运用MinIO技术服务器实现文件上传——利用程序上传图片(二 )
在上一篇文章中,我们已经在云服务器中安装并开启了minio服务,本章我们将为大家讲解如何利用程序将文件上传到minio桶中 下面介绍MinIO中的几个核心概念,这些概念在所有的对象存储服务中也都是通用的。 - **对象(Object࿰…...
C语言 | Leetcode C语言题解之第461题汉明距离
题目: 题解: 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 的关系 在开发图形界面应用时,特别是在使用 Qt 框架时,开发者可能会接触到多个概念,如 Qt 3D、QtQuick、QtQuick 3D 和 QML。这些术语分别代表了 Qt 中不同的模块或技术,但由于它们的功能…...
软件设计师(软考学习)
数据库技术 数据库基础知识 1. 数据库中的简单属性、多值属性、复合属性、派生属性简单属性:指不能够再分解成更小部分的属性,通常是数据表中的一个列。例如学生表中的“学号”、“姓名”等均为简单属性。 多值属性:指一个属性可以有多个值…...
第一讲:Go语言开发入门:环境搭建与基础语法
文章目录 环境搭建windows环境搭建Mac环境搭建安装GO使用 Homebrew 安装 Go手动下载安装 Go 配置环境变量配置环境变量检查 Go 是否正确安装 验证安装:编写第一个 Go 程序创建 Go 工作区编写 Hello World 程序运行程序编译程序 常用的 Go 命令 Go语言基础语法1. 变量…...
Linux CentOS stream9配置本地yum源
在Linux系统中,yum源配置是一个重要的环节。把系统安装时配置的国外yum源转换为国内yum源,能够帮助系统快速安装软件包。对于网络环境不稳定或无法联网的系统,配置本地yum源,可以让用户在离线状态下也能进行软件包的安装,十分重要。 一、国内源 在使用Linux的日常工作中…...
std::string
std::string是C标准库中的一个基本类模板,专门用于处理字符串。它提供了一个可变长度的字符序列,以及一系列用于字符串操作的方法。std::string是值类型,这意味着当它作为函数参数传递或赋值时,整个字符串数据会被复制。 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的垃圾收集器(Garbage Collector, GC)负责自动管理内存,回收不再使用的对象所占用的空间。随着JVM的发展,出现了多种不同特性的垃圾收集器来适应不同的应用场景和性能需求。在Java 8中,主要有以下几种垃圾收集器&a…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
