Hive小文件问题:如何产生、造成影响、解决办法

2023-11-01

一、小文件是如何产生的

1.动态分区插入数据,产生大量的小文件,从而导致map数量剧增。

2.reduce数量越多,小文件也越多(reduce的个数和输出文件是对应的)。

3.数据源本身就包含大量的小文件。


二、小文件问题的影响

1.从Hive的角度看,小文件会开很多map,一个map开一个JVM去执行,所以这些任务的初始化,启动,执行会浪费大量的资源,严重影响性能。

2.在HDFS中,每个小文件对象约占150byte,如果小文件过多会占用大量内存。这样NameNode内存容量严重制约了集群的扩展。


三、小文件问题的解决方案

从小文件产生的途经就可以从源头上控制小文件数量,方法如下:

1.使用Sequencefile作为表存储格式,不要用textfile,在一定程度上可以减少小文件。

2.减少reduce的数量(可以使用参数进行控制)。

3.少用动态分区,用时记得按distribute by分区。

=========part2===================

 一  如何开启合并小文件

  1. Spark已经默认开启合并小文件,通过自研参数spark.sql.hive.mergeFiles控制,默认为true,合并过程是单独的一个spark job
  2. 对于HiveTask的SQL任务脚本,HiveTask本身也提供了一个合并小文件功能,通过merge_flag参数控制,默认False,合并过程是一个mapreduce job
  3. 使用HiveTask跑spark任务,由于mapreduce合并小文件并行读不高,且表的stats信息是错误的可能影响后续任务执行,建议大家直接使用Spark自带的合并小文件功能
  4. 合并小文件工具mergefile也是mapreduce job,与HiveTask提供的合并小文件是一样的原理,都是mapreduce job,都有并行读不高,表的stats信息有误的问题,谨慎使用
  5. 合并小文件问题汇总:10.4 合并小文件和压缩数据汇总
  6. HiveTask与合并小文件mergefile工具使用文档:4.8.1 HiveTask执行SQL及合并小文件工具使用说明

二  查看自己的任务到底产生了多少个文件

除了使用hdfs命令查看之外,还可以通过执行计划图得到小文件信息:

可以通过bytes_of_written_output / number_of_written_files 计算得到平均文件大小,以此评估是否有小文件问题.

注意:开启合并小文件之后,上图的数值不会变,即该方法得到的数字是合并小文件之前的状态

三  如何减少产生文件个数以及合并小文件stage执行慢的解决方案

Spark写入文件数的细节:

    对于动态分区表:number_of_written_files <=  number_of_tasks * number_of_dynamic_partitions     (即 产生的文件个数 <= output stage的task个数 * 动态分区的个数)

    若上图的number of dynamic part为0,说明该sql写入的表是静态分区,在表目录下产生的文件数就是number_of_written_files

1. 如果shuffle数据量不大,可以调小spark.sql.shuffle.partitions参数的值,直接减少partition个数来减少number_of_tasks,依上面公式,产生的合并小文件数目也会减少,以减少合并小文件stage的计算量来提高运行速度,详见3. Spark任务调优技巧

2. 如果中间shuffle数据量很大,最后output的数据量较小时,可以启用自适应执行的特性(spark.sql.adaptive.enabled=true; spark.sql.adaptive.repartition.enabled=true;)自动的减小partition个数

3. 如果上面两种方式都不能解决,可以尝试如下方式修改:

     设置spark.sql.repartitionBeforeWrite.enabled=true,使output stage阶段按动态分区健做repartition,此方法与下面的sql等效,但注意可能会引入数据倾斜的问题

     

# 原SQL

insert overwrite table xxx partition (p1, p2) select ... from  ...

# 优化后的SQL

insert overwrite table xxx partition (p1, p2) select ... from  ...  distribute by  p1, p2

4. 如果上述方式都无法解决,请重新评估业务模型,优化表结构,减少动态分区数量。


四、对于已有的小文件,我们可以通过以下几种方案解决:

1.使用hadoop archive命令把小文件进行归档。

2.重建表,建表时减少reduce数量。

3.通过参数进行调节,设置map/reduce端的相关参数,

即:采用CombineTextInputFormat

参数调节细节如下:


设置map输入合并小文件的相关参数:

//每个Map最大输入大小(这个值决定了合并后文件的数量)

set mapred.max.split.size=256000000;

//一个节点上split的至少的大小(这个值决定了多个DataNode上的文件是否需要合并)

set mapred.min.split.size.per.node=100000000;

//一个交换机下split的至少的大小(这个值决定了多个交换机上的文件是否需要合并)

set mapred.min.split.size.per.rack=100000000;

//执行Map前进行小文件合并

set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;


设置map输出和reduce输出进行合并的相关参数:

//设置map端输出进行合并,默认为true

set hive.merge.mapfiles = true

//设置reduce端输出进行合并,默认为false

set hive.merge.mapredfiles = true

//设置合并文件的大小

set hive.merge.size.per.task = 256*1000*1000

//当输出文件的平均大小小于该值时,启动一个独立的MapReduce任务进行文件merge。

set hive.merge.smallfiles.avgsize=16000000

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hive小文件问题:如何产生、造成影响、解决办法 的相关文章

随机推荐

  • Oracle GoldenGate 将 SQLServer 数据实时同步到 ORACLE

    Oracle GoldenGate 简称 OGG 使在不同关系型数据库之间能进行实时同步复制可谓非常强大 OGG 支持 oracle sql server mysql db2 Sybase 等关系数据库直接的数据复制 OGG 这种灵活特性能
  • 计算机网络基础知识总结

    计算机网络学习的核心内容就是网络协议的学习 网络协议是为计算机网络中进行数据交换而建立的规则 标准或者说是约定的集合 因为不同用户的数据终端可能采取的字符集是不同的 两者需要进行通信 必须要在一定的标准上进行 一个很形象地比喻就是我们的语言
  • Arduino学习模拟输出

    1 实现效果 通过两个按键可以控制led变亮或者变暗 boolean pushButton1 定义布尔型变量存储按键1的状态 boolean pushButton2 定义布尔型变量存储按键2的状态 int ledPin 9 LED引脚号 i
  • Python3 面向对象

    Python从设计之初就已经是一门面向对象的语言 正因为如此 在Python中创建一个类和对象是很容易的 本章节我们将详细介绍Python的面向对象编程 如果你以前没有接触过面向对象的编程语言 那你可能需要先了解一些面向对象语言的一些基本特
  • 数据库备份和恢复

    这里介绍两种方法 1 mysqldump mysqldump不需要登录到数据库中就可以备份和恢复库和表 1 备份 mysqldump uroot p 123123 mytest gt mnt mytest bak date F sql 注意
  • Django学习 day4

    今天学习了简单的用户登录界面 也是对template的简单初探 Django有个叫模板 Template 的东东 可以直接把你的Html代码写在模板里 返回给浏览器 模板初探 使用模板的两个步骤 配置存html文件的模板目录 在你的view
  • html5期末大作业课程设计仿苹果官网(源码+报告)

    页面展示 下面有下载地址 免费哦 链接 https pan baidu com s 1 5ZDXVZmM64ALY2i31Hwfg 提取码 vtrk 一 需求分析 设计目的 一 可行性分析 时代背景 根据中国互联网络信息中心 CNNIC 在
  • 【教程】电信光猫烽火HG5140A怎么改桥接模式,telecomadmin超级密码

    一 背景 坐标杭州 宽带移机 师傅给我换了个战未来的 支持万兆的光猫 以前我是依据型号网上搜索搞到超级管理员用户就行桥接的 给我换了这个新光猫后 自己死活折腾不出来 二 正文 以前大家都习惯用超级管理员进入光猫 改桥接模式 利用光猫的安全漏
  • libevent中event_base_loopbreak与BEV_OPT_DEFER_CALLBACKS

    最近用C 和libevent改写了一个多线程网络服务器应用 大体框架是前端一个tcp连接监听线程 接收到连接后将socket随机交给一个后台工作线程做进一步处理 所有的线程均使用event base loop事件循环 其中有这样一个需求 我
  • Flink实战: 窗口TopN分析与实现1

    Flink实时计算topN热榜 主要思路可以这样做 可以继续优化的地方有 1 最后的processFunction中注册定时器在processElement方法中就要将ListState存储换掉 换成ValueState 不过是List类型
  • 最小二乘法曲线拟合

    最小二乘法曲线拟合以及Matlab实现 在实际工程中 我们常会遇到这种问题 已知一组点的横纵坐标 需要绘制出一条尽可能逼近这些点的曲线 或直线 以进行进一步进行加工或者分析两个变量之间的相互关系 而获取这个曲线方程的过程就是曲线拟合 目录
  • rtplib在linux上的编译安装

    JRTPlib简介 在http www tekuba net program 10 中提到过RTP的例程 这里参考网络上的资料给出JRtpLIB的嵌入式arm环境以及桌面环境开发环境的建立 RTP 是目前解决流媒体实时传输问题的最好办法 要
  • sql注入手法详解

    sql定义 sql 结构化查询语句 sql注入 首先我们通过前端将我们的payload 恶意代码 传送到后台服务器 传送到后台以后 我们提交的payload拼接到sql语句中 作为sql语句的一部分被执行 从而导致数据库又被脱库甚至删库的风
  • std:weak_ptr 用法小结。

    http blog csdn net coolmeme article details 43266319 参考了这篇博客 感谢博主的贡献 感谢博主的翻译 不过他写的太多了 我只是记录一下使用方法 原理就不深究了 需要了解其原理的可以自行去那
  • Unity性能优化一些学习总结

    关于Unity性能优化的自我总结 1 硬件支持优化 1 平台设置优化 减少FPS 在ProjectSetting gt Quality中的 VSync Count 参数会影响你的FPS EveryVBlank相当于FPS 60 EveryS
  • 【Go语言学习之路 2】Go目录结构划分

    目录结构划分 三个环境变量的配置 GOROOT Go 安装后的根目录 例如 D Program Files Go 安装过程中会由安装程序自动写入系统环境变量中 go语言自带的类库 GOBIN Go 的二进制文件存放目录 GOPATH bin
  • JDBC中级实现--数据库连接四要素的抽取与动态获取

    1 数据库连接四要素不应该写死在代码中 扩展性不高 应该抽取到配置文件中动态读取 扩展文件名 properties DRIVER CLASS NAME com mysql jdbc Driver URL jdbc mysql mysql j
  • 爬虫课程笔记(七)scrapy入门与深入

    爬虫课程笔记 Scrapy 异步与非阻塞区别 爬虫流程 入门 创建一个scrapy项目 生成一个爬虫 提取数据 保存数据 logging 实现翻页请求 深入scrapy 定义item 程序的debug信息 scrapy shell sett
  • Python学习笔记(小甲鱼版)

    目录 文章目录 一 python是什么 1 Python 特点 2 idea是什么 3 print 的作用是什么 4 基础语法 一 python是什么 Python 是一个高层次的结合了解释性 编译性 互动性和面向对象的脚本语言 Pytho
  • Hive小文件问题:如何产生、造成影响、解决办法

    一 小文件是如何产生的 1 动态分区插入数据 产生大量的小文件 从而导致map数量剧增 2 reduce数量越多 小文件也越多 reduce的个数和输出文件是对应的 3 数据源本身就包含大量的小文件 二 小文件问题的影响 1 从Hive的角