Hive优化操作(一)

Hive SQL 优化指南

在使用 Hive 进行数据分析时,提高查询性能至关重要。以下是一些具体的优化策略,帮助我们在工作中更有效地管理和查询数据。

一、 减少数据量进行优化

1. 分区表优化

  • 分区是一种表的子集,用于按某一列(如日期、地区等)将数据划分成多个部分。

  • 当查询一个分区表时,Hive 会只扫描相关的分区,而不是整个表。这能显著减少需要读取的数据量,从而提高查询速度。

示例:

CREATE TABLE sales (id INT,amount DECIMAL(10,2),date STRING
) PARTITIONED BY (year INT, month INT);

在插入数据时,指定每个记录的分区信息。

2. 分桶表优化

  • 分桶将数据分成多个“桶”,每个桶是一个独立的数据集合。

  • 在进行 JOIN 操作时,分桶表可以避免全表扫描,提高查询效率。

示例:

CREATE TABLE employees (id INT,name STRING
) CLUSTERED BY (id) INTO 10 BUCKETS;

这里,表会按照 id 列划分为 10 个桶。

3. 拆分大表为临时表

  • 将一个大表拆分成多个小的临时表。

  • 小表的处理速度通常更快,可以在查询时更灵活地组合和查询。
    临时表用于存储在会话期间存在的数据,通常不需要持久化,主要用于存储临时计算结果。

优化原理

  • 避免数据写入磁盘:临时表只在会话中存在,在会话结束时自动消失,避免了对磁盘的I/O操作。
  • 加速数据处理:适合用于存储需要在多个查询中使用的中间结果,可以减少重复计算,提高查询效率。

示例

CREATE TEMPORARY TABLE temp_table AS
SELECT customer_id, COUNT(*) as order_count
FROM sales
GROUP BY customer_id;SELECT * FROM temp_table WHERE order_count > 10;

4. 列裁剪

  • 只选择查询所需的列,万万不可使用 SELECT *

  • 聚合分析,连接其它表前使用列裁剪,能减少传输的数据量,降低 I/O 成本。

示例:

SELECT amount FROM sales;

5. 数据过滤

  • 在聚合分析,连接其它表前使用 WHERE 子句提前过滤不必要的数据。

  • 这样可以减少后续处理的数据量,提高性能。

示例:

SELECT SUM(amount) FROM sales WHERE amount > 1000;

6. 中间表制作

  • 在执行复杂查询时,先将部分结果存入中间表,然后再进行后续查询。

  • 这样可以让查询逻辑更清晰,也有助于提高性能。

中间表通常用于在复杂查询中存储中间结果,以便于后续的查询或分析。这种做法可以降低重复计算的开销。

优化方式

  • 分步执行:将复杂的查询拆分为多个小查询,使用中间表保存中间结果,避免重复计算。
  • 数据分区:可以对中间表进行分区,以加速数据读取和查询。
  • 聚合和过滤:在生成中间表时,可以进行初步的聚合和过滤,减少后续操作的数据量。

示例

CREATE TABLE intermediate_table AS
SELECT customer_id, SUM(amount) AS total_amount
FROM sales
GROUP BY customer_id;SELECT * FROM intermediate_table WHERE total_amount > 1000;

二、 对数据进行压缩,行列存储格式转换

1. 磁盘 I/O

什么是 I/O?

  • I/O 指的是数据在计算机系统与外部存储(如磁盘驱动器、SSD、HDFS)之间的传输过程。对大数据来说,这通常涉及从硬盘读取数据或将数据写入硬盘。

2. HDFS 的 工作原理

HDFS 中的数据存储

  • HDFS 将文件分割成固定大小的块(默认是 128MB 或 256MB),并将这些块分散存储在多个节点上。每个块可能会有多个副本(通常是 3 个),以确保数据的可靠性。

数据访问

  • 当进行查询时,Hive 需要访问存储在 HDFS 上的这些数据块。为了执行查询,Hive 需要读取相应的数据块,并将它们加载到内存中进行处理。

3. 磁盘 I/O 在 HDFS 中的影响

3.1 数据读取
  • 读取效率:HDFS 的设计旨在处理大文件的顺序访问,但在执行复杂查询时,如果查询涉及多个数据块,就需要频繁进行磁盘读取。
  • 随机访问 vs 顺序访问:虽然 HDFS 优化了顺序访问,但对于随机读取操作,磁盘 I/O 会显著增加,因为每次读取都可能涉及不同的物理位置,导致寻址时间增加。
3.2 数据写入
  • 写入操作:在将数据写入 HDFS 时,系统同样需要进行 I/O 操作。写入操作必须将数据写入到多个节点上(副本),这也会消耗 I/O 带宽。
  • 数据块的分散写入:HDFS 将文件的每个块写入不同的节点,这个过程可能会导致额外的 I/O 开销。

4. 压缩优化原理

4.1 减少 I/O 负担
  • 小数据量:通过压缩,读取的数据量减少,进而减少了所需的磁盘 I/O 操作。例如,读取一个 100MB 的压缩文件可能只需读取 20MB 的数据。
  • 提高效率:减少 I/O 直接提高了查询的速度,因为磁盘读取的次数减少,CPU 等待数据的时间也降低。
4.2 列式查询
  • 优化查询:列式存储格式使得 Hive 在执行查询时能够跳过不必要的列读取,只读取与查询相关的列数据。当查询只涉及几个列时,列式存储可以显著减少读取的数据量。
  • 聚合和扫描:列格式通常对聚合和分析操作进行了优化,能加速这些操作的执行速度。

三、 Hive 的 MapReduce阶段优化

在使用Hive进行大数据处理时,合理优化Map和Reduce的执行是提高任务效率的关键。下文将详细介绍如何优化Map和Reduce,以提高Hive任务的性能。

1. 合理设置Map数量

  • 影响因素

    • 输入文件的总数量和大小
    • 集群设置的文件块大小
  • 优化策略

    • 小文件过多时,每个文件会作为一个独立的Map任务,启动和初始化时间长,造成资源浪费。应尽量合并小文件以提高效率。
    • 如果文件较大且任务复杂,可以通过调整maxSize参数来增加Map任务数量,以减少每个Map处理的数据量,提高效率。

1.1 合并小文件(减少Map数量)

  • 小文件过多弊端

    • HDFS上每个文件需要在NameNode创建元数据,占用内存空间,影响索引速度。
    • 过多小文件会导致MapTask数量增加,单个MapTask处理数据量小,资源消耗大。
  • 解决方案

    1. 数据采集阶段合并小文件。
    2. 使用CombineHiveInputFormat在Map执行前合并小文件。
      set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
      

1.2 调整maxSize参数(增加Map数量)

  • 要调整maxSize参数,可以在Hive的配置中设置以下属性:
SET mapreduce.input.fileinputformat.split.maxsize=<desired_size>;
注意:
  • maxSize参数指的是每个Map任务处理的数据块的最大大小。通过调整这个参数,可以控制Map任务的数量,但它并不直接指定Map任务的数量。
  • maxSize设置为小于HDFS的块大小(blocksize),这样可以分割数据成更多块,每个块会启动一个Map任务。
  • 通过设置较小的maxSize,可以让输入数据分割成更多的块,从而增加Map任务的数量,减少每个Map处理的数据量。
  • 例如,如果HDFS块大小是128MB,可以将maxSize设置为64MB,这样会生成更多的Map任务,每个任务处理较少的数据量。

2. 合理设置Reduce数量

  • Reduce数量 = min(参数2, 总数据量/参数1)
  • 可以在mapred-default.xml文件中设置参数2:
    <property><name>mapreduce.job.reduces</name><value>15</value>
    </property>
    
  • Reduce数量不宜过多,以免资源浪费。

3. 设置缓冲区大小

  • 默认缓冲区为100M,可以提升至200M,减少溢写次数,提高效率。

4. 使用压缩技术

  • 使用Snappy压缩减少磁盘I/O,提高性能。

5. 提高MapTask默认内存

  • 默认内存为1024M,可以根据需要提升以处理更大的数据量。

6. 增加MapTask的CPU核数

  • 对于计算密集型任务,增加CPU核数可以提升处理速度。

7. 增加Reduce阶段的并行度

  • 默认从Map中拉取数据的并行数为5,可以适当提高。

8. 提高ReduceTask的内存上限

  • 可以根据任务需要,适当提高内存上限。

9. 提高ReduceTask的CPU核数

  • 根据任务的复杂程度,增加CPU核数以提升性能。

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

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

相关文章

【Flutter】- 核心语法

文章目录 知识回顾前言源码分析1. 有状态组件2. 无状态组件3. 组件生命周期4. 常用组件Container组件Text组件Image组件布局组件row colum stack expandedElevntButton按钮拓展知识总结知识回顾 【Flutter】- 基础语法 前言 Flutter是以组件化的思想构建客户端页面的,类似于…

windows C++-创建数据流代理(二)

完整的数据流演示 下图显示了 dataflow_agent 类的完整数据流网络&#xff1a; 由于 run 方法是在一个单独的线程上调用的&#xff0c;因此在完全连接网络之前&#xff0c;其他线程可以将消息发送到网络。 _source 数据成员是一个 unbounded_buffer 对象&#xff0c;用于缓冲…

Windows 编译 FFmpeg 源码详细教程

FFmpeg FFmpeg 是一个开源的多媒体框架,它包括了一整套工具和库,可以用来处理(转码、转换、录制、流式传输等)音频和视频。FFmpeg 支持广泛的音视频格式,并且可以在多种操作系统上运行,包括 Windows、Linux 和 macOS。 FFmpeg 的主要组件包括: ffmpeg:这是一个命令行工…

OpenCV视频I/O(20)视频写入类VideoWriter之用于将图像帧写入视频文件函数write()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::VideoWriter::write() 函数用于将图像帧写入视频文件。 该函数/方法将指定的图像写入视频文件。图像的大小必须与打开视频编写器时指定的大…

在Python中处理文件路径

在Python中处理文件路径 下面将详细介绍如何使用 pathlib 模块来处理文件路径。我们将从创建 Path 对象、绝对路径与相对路径、访问文件路径分量&#xff0c;以及检查文件路径是否存在等几个方面进行讲解。 1. 创建 Path 对象 要使用 pathlib&#xff0c;首先需要导入模块并…

网站建设中常见的网站后台开发语言有哪几种,各自优缺点都是什么?

市场上常见的网站后台开发语言有PHP、Python、JavaScript、Ruby、Java和.NET等。这些语言各有其独特的优缺点&#xff0c;适用于不同的开发场景和需求。以下是对这些语言的具体介绍&#xff1a; PHP 优点&#xff1a;PHP是一种广泛用于Web开发的动态脚本语言&#xff0c;特别适…

Diffusion models(扩散模型) 是怎么工作的

前言 给一个提示词, Midjourney, Stable Diffusion 和 DALL-E 可以生成很好看的图片&#xff0c;那么它们是怎么工作的呢&#xff1f;它们都用了 Diffusion models&#xff08;扩散模型&#xff09; 这项技术。 Diffusion models 正在成为生命科学等领域的一项尖端技术&…

基于STM32的智能花盆浇水系统设计

引言 本项目设计了一个基于STM32的智能花盆浇水系统。该系统通过土壤湿度传感器检测土壤湿度&#xff0c;当湿度低于设定阈值时&#xff0c;自动启动水泵进行浇水。它还结合了温湿度传感器用于环境监测。该项目展示了STM32在传感器集成、自动控制和节水智能化应用中的作用。 …

Mongo Java Driver使用getCollection做分页查询遇到的一些坑

背景 最近在做Mongo上的表数据的迁移&#xff0c;原本应该是DBA要干的活&#xff0c;但是想着DBA排期比较长&#xff0c;加上我们开发的权限又非常有限&#xff0c;而且数据量又没有多少&#xff0c;就想着自己开发个小小的程序从旧实例上查&#xff0c;写到新实例上去算了。于…

Nginx05-基础配置案例

零、文章目录 Nginx05-基础配置案例 1、案例需求 &#xff08;1&#xff09;有如下访问 http://192.168.119.161:8081/server1/location1 访问的是&#xff1a;index_sr1_location1.htmlhttp://192.168.119.161:8081/server1/location2 访问的是&#xff1a;index_sr1_loca…

YoloV9改进策略:BackBone改进|CAFormer在YoloV9中的创新应用,显著提升目标检测性能

摘要 在目标检测领域,模型性能的提升一直是研究者和开发者们关注的重点。近期,我们尝试将CAFormer模块引入YoloV9模型中,以替换其原有的主干网络,这一创新性的改进带来了显著的性能提升。 CAFormer,作为MetaFormer框架下的一个变体,结合了深度可分离卷积和普通自注意力…

计算机网络自顶向下(2)----socket编程

1.套接字 套接字是用于在计算机网络中进行通信的一种技术。它是操作系统提供的一种接口&#xff0c;通过该接口&#xff0c;应用程序可以通过网络连接进行数据的传输和接收。 套接字包含了一个IP地址和一个端口号&#xff0c;用于唯一标识一个网络连接。通过套接字&#xff0c;…

Ansible学习之ansible-pull命令

想要知道ansible-pull是用来做什么的&#xff0c;就需要了解Ansible的工作模&#xff0c;Ansible的工作模式有两种&#xff1a; push模式 push推送&#xff0c;这是Ansible的默认模式&#xff0c;在主控机上编排好playbook文件&#xff0c;push到远程主机上来执行。pull模式 p…

远程调用的问题以及eureka原理

目录 服务调用出现的问题 问题分析 解决方案&#xff08;eureka原理&#xff09; eureka&#xff08;两个角色&#xff09; eureka的解决方案 此过程出现的问题 eureka的作用 总结 服务调用出现的问题 服务消费者该如何获取服务提供者的地址信息&#xff1f;如果有多个…

系统架构设计师论文《论企业应用系统的数据持久层架构设计》精选试读

论文真题 数据持久层&#xff08;Data Persistence Layer&#xff09;通常位于企业应用系统的业务逻辑层和数据源层之间&#xff0c;为整个项目提供一个高层、统一、安全、并发的数据持久机制&#xff0c;完成对各种数据进行持久化的编程工作&#xff0c;并为系统业务逻辑层提…

【SpringBoot】基础+JSR303数据校验

目录 一、Spring Boot概要 1. SpringBoot介绍 2. SpringBoot优点 3. SpringBoot缺点 4. 时代背景-微服务 二、Spring Boot 核心配置 1. Spring Boot配置文件分类 1.1 application.properties 1.2 application.yml 1.3 小结 2. YAML概述 3. YAML基础语法 3.1 注意事…

【教程】57帧! Mac电脑流畅运行黑神话悟空

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 1、先安装CrossOver。网上有许多和谐版&#xff0c;可自行搜索。&#xff08;pd虚拟机里运行黑神话估计够呛的&#xff09; 2、运行CrossOver&#xf…

nvidia英伟达显卡高刷新显示器dp接口无法进入bios的解决办法

nvidia英伟达显卡高刷新显示器dp接口无法进入bios的解决办法 问题分析 在gtx20x0之前的显卡&#xff0c;如1050ti&#xff0c;window能正常使用dp接口&#xff0c;但进入bios就无法显示&#xff08;显示器无信号输入&#xff09; 问题解决 安装NVIDIA Graphics Firmware Upda…

SpringBoot上传图片实现本地存储以及实现直接上传阿里云OSS

一、本地上传 概念&#xff1a;将前端上传的文件保存到自己的电脑 作用&#xff1a;前端上传的文件到后端&#xff0c;后端存储的是一个临时文件&#xff0c;方法执行完毕会消失&#xff0c;把临时文件存储到本地硬盘中。 1、导入文件上传的依赖 <dependency><grou…

Vueron引领未来出行:2026年ADAS激光雷达解决方案上市路线图深度剖析

Vueron ADAS激光雷达解决方案路线图分析&#xff1a;2026年上市展望 Vueron近期发布的ADAS激光雷达解决方案路线图&#xff0c;标志着该公司在自动驾驶技术领域迈出了重要一步。该路线图以2026年上市为目标&#xff0c;彰显了Vueron对未来市场趋势的精准把握和对技术创新的坚定…