Hive合并小文件详解(参数介绍)

这篇具有很好参考价值的文章主要介绍了Hive合并小文件详解(参数介绍)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、MR输出时合并小文件
参数设置    含义
set hive.merge.mapfiles=true;    默认值ture,在Map-only的任务结束时合并小文件
set hive.merge.mapredfiles=true;    默认值false,在Map-Reduce的任务结束时合并小文件
set hive.merge.size.per.task=256000000;    默认值256M,
set hive.merge.smallfiles.avgsize=16000000
;    默认值16M,当输出文件的平均大小小于16M时,启动一个独立的map-reduce任务进行文件merge
reduce 计算方式:merge job后每个文件的目标大小(targetSize),用之前job输出文件的total size除以这个值,就可以决定merge job的reduce数目。merge job的map端相当于identity map,然后shuffle到reduce,每个reduce dump一个文件,通过这种方式控制文件的数量和大小

MapredWork work = (MapredWork) mrTask.getWork();

if (work.getNumReduceTasks() > 0) {

int maxReducers = conf.getIntVar(HiveConf.ConfVars.MAXREDUCERS);

int reducers = (int) ((totalSize +targetSize - 1) / targetSize);

reducers = Math.max(1, reducers);

reducers = Math.min(maxReducers, reducers);

work.setNumReduceTasks(reducers);

}


 

二、输入合并小文件,减小map数
set mapred.max.split.size=256000000;  #每个Map最大输入大小
set mapred.min.split.size.per.node=100000000; #一个节点上split的至少的大小 
set mapred.min.split.size.per.rack=100000000; #一个交换机下split的至少的大小
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;  #执行Map前进行小文件合并

在开启了org.apache.hadoop.hive.ql.io.CombineHiveInputFormat后,一个data node节点上多个小文件会进行合并,合并文件数由mapred.max.split.size限制的大小决定。
mapred.min.split.size.per.node决定了多个data node上的文件是否需要合并~
mapred.min.split.size.per.rack决定了多个交换机上的文件是否需要合并~


解读:CombineFileInputFormat类
MR-Job默认的输入格式FileInputFormat为每一个小文件生成一个切片。CombineFileInputFormat通过将多个“小文件”合并为一个"切片"(在形成切片的过程中也考虑同一节点、同一机架的数据本地性),让每一个Mapper任务可以处理更多的数据,从而提高MR任务的执行速度。详见 MR案例: CombineFileInputFormat类

1).三个重要的属性:

maxSplitSize:切片大小最大值。可通过属性 “mapreduce.input.fileinputformat.split.maxsize” 或 CombineFileInputFormat.setMaxInputSplitSize()方法进行设置【不设置,则所有输入只启动一个map任务】
minSplitSizeNode:同一节点的数据块形成切片时,切片大小的最小值。可通过属性 “mapreduce.input.fileinputformat.split.minsize.per.node” 或 CombineFileInputFormat.setMinSplitSizeNode()方法进行设置
minSplitSizeRack:同一机架的数据块形成切片时,切片大小的最小值。可通过属性 “mapreduce.input.fileinputformat.split.minsize.per.rack” 或 CombineFileInputFormat.setMinSplitSizeRack()方法进行设置
大小关系:maxSplitSize > minSplitSizeNode > minSplitSizeRack
2).切片的形成过程:

2.1. 不断迭代节点列表,逐个节点 (以数据块为单位) 形成切片(Local Split)

a. 如果maxSplitSize == 0,则整个节点上的Block数据形成一个切片

b. 如果maxSplitSize != 0,遍历并累加每个节点上的数据块,如果累加数据块大小 >= maxSplitSize,则将这些数据块形成一个切片。继续该过程,直到剩余数据块累加大小 < maxSplitSize 。则进行下一步

c. 如果剩余数据块累加大小 >= minSplitSizeNode,则将这些剩余数据块形成一个切片。继续该过程,直到剩余数据块累加大小 < minSplitSizeNode。然后进行下一步,并这些数据块留待后续处理

2.2. 不断迭代机架列表,逐个机架 (以数据块为单位) 形成切片(Rack Split)
  a. 遍历并累加这个机架上所有节点的数据块 (这些数据块即上一步遗留下来的数据块),如果累加数据块大小 >= maxSplitSize,则将这些数据块形成一个切片。继续该过程,直到剩余数据块累加大小<maxSplitSize。则进行下一步

b. 如果剩余数据块累加大小 >= minSplitSizeRack,则将这些剩余数据块形成一个切片。如果剩余数据块累加大小 < minSplitSizeRack,则这些数据块留待后续处理

2.3. 遍历并累加所有Rack上的剩余数据块,如果累加数据块大小 >= maxSplitSize,则将这些数据块形成一个切片。继续该过程,直到剩余数据块累加大小< maxSplitSize。则进行下一步

2.4. 将最终剩余的数据块形成一个切片。
Demo:
规定:maxSplit=100 > minSizeNode=50 > minSizeRack=30
原有文件:Rack01:{[30,60,70] [80,110]}   Rack02:{170}  
处理过程:
30+60+70 > 100 ? 100+60  80+110 > 100 ? 100+90  170 > 100 ? 100+70  
  —>  3个数据切片,以及Rack01:{[60] [90]}  Rack02:{70}  
    —>  60 > 50 ? 50+10  90 > 50 ? 50+40  70 > 50 ? 50+20  
      —>  3+3个数据切片,以及Rack01:{[10] [40]}  Rack02:{20}  
        —>  10+40 < 100 ?0  20 < 100 ? 0  
          —>  3+3+0个数据切片,以及Rack01:{50}  Rack02:{20}  
            —>  50+20 > 30 ? 30+30+10  
              —>  3+3+0+3个数据切片

对hive输入格式设置为CombineHiveInputFormat的进行分析map数是如何计算的
set hive.input.format=org.apache.hadoop.hive.al.io.CombineHiveInputFormat

注:对orcformat、外表和链接文件无法使用,会转到调用父类HiveInputFormat的getsplits()函数

map数与逻辑split数是一致的,决定map的主要因素有:

1、相关表或分区input的文件个数

2、input文件的大小

3、input文件在node和rack的分布

4、set mapred.max.split.size; 最大split大小

5、set mapred.min.split.size.per.node; 一个节点上最小的split大小

6、set mapred.min.split.size.per.rack; 一个机架上最小的split大小

例如:查询相关目录下有12个input file,每个input file的大小都在100M左右,block分布如下图:

情况一:参数设置如下:set mapred.max.split.size=256000000;

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

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

第一步:遍历node,嵌套遍历block,当block的累加值大于max.split.size时,创建一个split,小于时,但如果大于min.size.per.node,创建一个新的split,小于时暂存block,继续下一个node。这个遍历过程每个node最多生成一个split,为提高并发度,让split尽量分布到不同的node上。

node I 有三个block(A、B、E)累加值300M > 256M, 会新建一个split。

node II 只有一个C block < 256M,会进行暂存

第二步:遍历rack,嵌套遍历block,对暂存的block进行分割,当block的累加值大于max.split.size时,创建一个新的split,小于时,但如果大于min.size.per.rack,创建一个新的split,小于时暂存block,继续下一个rack

rack I 三个block(C、D、G)累加值300M > 256M,会新建一个split,继续到下一个rack

第三步:对垮rack最后溢出的block处理,当block累加值大于max.split.size时创建新的split,循环处理,最后剩的数据创建一个split

参考:

1.https://blog.csdn.net/weixin_34150503/article/details/91986719?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-3

2.https://www.ghcc.net/node/3287051

原文链接:https://blog.csdn.net/javastart/article/details/106686861文章来源地址https://www.toymoban.com/news/detail-441519.html

到了这里,关于Hive合并小文件详解(参数介绍)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • hive on spark小文件问题【hive.merge.sparkfiles参数不生效】

    我也是查看了我们目前集群的版本是spark是3.2.3版本 hive是3.1.3版本,都是比较新的版本,正常是支持这个参数的 在测试环境中,如果在sql中不使用group by函数其实可以可以生效的 找原因,找问题 最后定位到生产上缺少这个包 :hive-exec-3.1.3.jar hadoop fs -put /usr/lib/hive/lib/hive-exe

    2024年02月13日
    浏览(49)
  • Logstash数据处理服务的输出插件Output配置参数详解

    output配置字段是将收集的日志数据存输出到生存储中,一般都是elasticsearch集群。 常用字段配置: hosts ES集群每个节点的地址信息。 index :指定存储到ES的哪个索引库。 将从file日志文件中收集来的数据存储到ES索引库中。

    2023年04月09日
    浏览(57)
  • YOLO V3详解(二):输出介绍

    YOLO V3详解(一):网络结构介绍 YOLO V3详解(二):输出介绍 YOLO V3详解(三):损失介绍 YOLO V3详解(四):进行目标检测 DarkNet53: YOLO v3中的Backbone 在学习Yolo v3时,不知道有没有小伙伴对它的输出感觉很疑惑。 以20类分类任务为例:为什么输出的是13*13*75、26*26*75以及52*52*75的。这些最

    2024年02月16日
    浏览(29)
  • C# 介绍、应用领域、入门、语法、输出和注释详解

    C# (发音为“C-Sharp”)是一种由 Microsoft 创建的面向对象的编程语言,运行在 .NET Framework 上。源于 C 家族,与流行的语言如 C++ 和 Java 相近。首个版本发布于 2002 年,而最新版本, C# 12 ,于 2023 年 11 月发布 C# 广泛用于: 移动应用程序 桌面应用程序 Web 应用程序 Web 服务 网站

    2024年01月16日
    浏览(39)
  • 高级两路和三路文件比较(diff)、合并和文件夹同步——Araxis Merge介绍

      0 1、对于法律和出版专业人士 立即识别不同合同或手稿草稿之间的每一个变化。直接打开和比较来自Microsoft Office(Word 和 Excel)、OpenDocument、 PDF和RTF文件的文本。从其他应用程序(如 Microsoft Word)复制文本并将其直接粘贴到文本比较中。 0 2、对于软件工程师和网络开发人

    2024年02月08日
    浏览(44)
  • 【Python从入门到人工智能】14个必会的Python内置函数(6)——打印输出 (详细语法参考+参数说明+具体示例) | 详解Python中的打印输出!附综合案例!

      你有不伤别人的教养,却缺少一种不被别人伤害的气场,若没有人护你周全,就请你以后善良中带点锋芒,为自己保驾护航。   🎯作者主页: 追光者♂🔥          🌸个人简介:   💖[1] 计算机专业硕士研究生💖   🌟[2] 2022年度博客之星人工智能领域TOP4🌟   🏅[

    2024年02月15日
    浏览(62)
  • hive文件存储格式orc和parquet详解

    hive支持的文件类型:textfile、sequencefile(二进制序列化文件)、rcfile(行列式文件)、parquet、orcfile(优化的行列式文件) 带有描述式的行列式存储文件。将数据分组切分,一组包含很多行,每一行再按例进行存储。 orc文件结合了行式和列式存储结构的优点,在有大数据量扫

    2024年02月03日
    浏览(39)
  • Linux ls -l输出文件信息详解

    在linux中,我们知道一切皆为文件,经常我们会使用ls -l去查看文件的信息,今天会大家详细讲解一下ls -l输出的文件属性信息。 命令: ls -l 通过ls -l命令输出,我们可以看到上图中的属性信息输出,那么属性信息输出都代表什么含义呢? d  rwxr-xr-x   2   root      root    

    2024年02月08日
    浏览(43)
  • 2、hive相关概念详解--架构、读写文件机制、数据存储

    1、apache-hive-3.1.2简介及部署(三种部署方式-内嵌模式、本地模式和远程模式)及验证详解 2、hive相关概念详解–架构、读写文件机制、数据存储 3、hive的使用示例详解-建表、数据类型详解、内部外部表、分区表、分桶表 4、hive的使用示例详解-事务表、视图、物化视图、DDL

    2024年02月09日
    浏览(47)
  • allegro16.6系统gerber文件输出规范详解

    一、设计检查 在 gerber 文件输出之前必须要进行最后检查! 检查项目: 1: update DRC,确保没有断短路 2:检查 Summary drawing report,确保 5 个“0” 3:检查 Dangling line and via report ,确保没有冗余孔和线 4:进行丝印、 loop、 90 度、 solder2line 等自动工具检查   二、钻孔文件输出

    2024年02月06日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包