欢迎关注交流微信公众号:小满锅

问题导言

最近在使用hive时,发现一些任务的因为使用mapreduce的缘故,跑的太慢了,才几十个G的数据就经常跑一个多小时,于是有了切换spark的想法。
但是刚刚切换了spark,第二天发现跑出来的数据文件数大大增加,而且每个文件都非常小,导致下游spark任务为了每个小文件都启动一个task,申请资源对于spark来说是非常消耗资源的,任务又大大延迟了。
查了下关于spark合并小文件,目前有几个参数会提供参考。

输入端


set mapred.max.split.size=256000000;
设置:每个Map最大输入大小,这个值决定了合并后文件的数量;set mapred.min.split.size.per.node=100000000;
设置:一个节点上split的至少的大小,这个值决定了多个DataNode上的文件是否需要合并;set mapred.min.split.size.per.rack=100000000;
设置:一个交换机下split的至少的大小,这个值决定了多个交换机上的文件是否需要合并;set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
设置:输入端map合并小文件。

输出端

这个是hive on mapreduce的合并小文件参数:set hive.merge.mapfiles=true;
设置:启用小文件合并 - Map-Only作业,默认true;set hive.merge.mapredfiles=true;
设置:启用小文件合并 - Map-Reduce作业,默认false;hive.merge.size.per.task=268534456;
设置:合并后所需每个文件的大小,默认256MB;这个数值是个约数,合并后文件大小会有上下浮动。set hive.merge.smallfiles.avgsize=16777216;
设置:小文件平均大小合并阈值,默认16MB;

上面是针对hive on mapreduce的调参,但是换了spark后,就需要调整这些了

set hive.merge.sparkfiles=true;
设置:启用小文件合并 - Spark 作业,默认false;

有教程是这个样子,但是呢,会有一些问题,目前社区对spark合并小文件支持还不够完善,有些版本,或者有些公司的hive on spark可能这个参数设置效果没用或者根本不明显
但是目前首有介绍其他办法,可以做到这个合并小文件

SETspark.sql.adaptive.enabled=true;
SETspark.sql.adaptive.shuffle.targetPostShuffleInputSize = 512MB;

这两个参数能够自适应调整文件大小,但是呢仅仅靠这两个参数还不够用。因为它只能调整shuffle的分区,如果过于分区输出的文件数过小(比如只有十几M),而分区数有非常多。比如shuffle分区有200个,每个分区Read512MB,Output 20M,那么就有200个20M的小文件了。
有人会想着,将spark.sql.adaptive.shuffle.targetPostShuffleInputSize参数调大,但是这个不可控,因为你不能确定每个任务的十几Output是多少,所以就会有问题,而且这样每个任务都要去调整这个参数,非常不友好,再说了,万一shuffle分区Output只有1M,你这个值得调到多大,那么分区Read和父分区存储得有多大压力。

distribute by去重新调整数据分布

在上面的基础上,我们可以使用distribute by多进行一次shuffle。
原理就是因为spark.sql.adaptive.shuffle.targetPostShuffleInputSize它只能控制每个分区的Read的大小,而随着数据量增加,每个分区的read又被固定限制,导致分区数增加不可控,从而每个分区可能输出数据量非常小的文件。那么这时候,我们只需要在原来分散零碎的数据基础上,再增加一次shuffle,也就是进行一次distribute by。在这个distribute by过程中,分区read是512M左右,而单纯的distribute by不会进行过滤之类的,所以每个分区相当于一定要读取512M的数据,然后再将它们写出512M,那么就可以将那些小文件合并了。

distribute by和Group by

group by是根据字段去分组,做聚合计算,它的执行是在select之前。
而distribute是在select之后了。
注意如果group by和distribute by字段相同的话,效果会抵消,只会进行一次shuffle。这个还有待验证,会持续更新。

关于hive on spark的distribute by和group by使用以及小文件合并问题相关推荐

  1. spark 实现HDFS小文件合并

    一.首先使用sparksql读取需要合并的数据.当然有两种情况, 一种是读取全部数据,即需要合并所有小文件. 第二种是合并部分数据,比如只查询某一天的数据,只合并某一个天分区下的小文件. val df ...

  2. hive与spark合并小文件,将大文件打碎成小文件

    场景一:将小文件合并成大文件. mro_hour_test表每个分区有几千个1m未压缩小文件, 以下语句是将几千个文件在输入时(map阶段)合并成150M一个的文件,插入到mro_hour_test_ ...

  3. spark sql合并小文件_Spark SQL小文件问题在OPPO的解决方案

    Spark SQL小文件是指文件大小显著小于hdfs block块大小的的文件.过于繁多的小文件会给HDFS带来很严重的性能瓶颈,对任务的稳定和集群的维护会带来极大的挑战. 一般来说,通过Hive调度 ...

  4. Hive中数据倾斜和小文件过多的解决方案

    数据倾斜: 任务进度长时间维持在99%(或100%),查看任务监控页面,发现只有少量(1个或几个)reduce子任务未完成.因为其处理的数据量和其他reduce差异过大. 原因:某个reduce的数据 ...

  5. Hive数据分析——Spark是一种基于rdd(弹性数据集)的内存分布式并行处理框架,比于Hadoop将大量的中间结果写入HDFS,Spark避免了中间结果的持久化...

    转自:http://blog.csdn.net/wh_springer/article/details/51842496 近十年来,随着Hadoop生态系统的不断完善,Hadoop早已成为大数据事实上 ...

  6. 调一调Hive on Spark参数,毫不夸张的说,使其性能达到最大化!

    前言 Hive on Spark是指使用Spark替代传统MapReduce作为Hive的执行引擎,在HIVE-7292提出.Hive on Spark的效率比on MR要高不少,但是也需要合理调整参 ...

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

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

  8. HIVE优化系列(1)-- 自动合并输出的小文件

    小文件的缺陷我们就不说了,直接进入到正题. HIVE自动合并输出的小文件的主要优化手段为: set hive.merge.mapfiles = true:在只有map的作业结束时合并小文件, set ...

  9. hive小文件处理方法

    方法一 hive方法处理 set hive.merge.mapfiles=true; -- map only job 结束是合并小文件 set hive.merge.mapredfiles=true; ...

最新文章

  1. .net网格怎么把值插入指定列表_Python列表有什么内置函数可以使用,怎么使用这些函数...
  2. c# WinForm开发 DataGridView控件的各种操作
  3. 夏意秋尽-08年1月
  4. endnote 参考文献加序号_Endnote教程|页码缩写
  5. c语言语法格式规范(1)常量的非法与合法
  6. Python线性代数扩展库numpy.linalg中几个常用函数
  7. Java 软件实践 VZone PPT Show 一次及其Perfect的演示
  8. 单维度量表验证性因子分析_探索性因子分析(EFA)和验证性因子分析(CFA)
  9. 【Steam VR 2.0】自定义按键 action 发布后无效的解决办法
  10. 马化腾的马氏建议:“小步快跑 快速迭代”
  11. 信号指示RSSI与显示格数关系
  12. 大数据之父_BIM先驱Charles (Chuck) M. Eastman逝世——致敬“BIM之父”
  13. 5种方案实现订单30分钟未支付,则自动取消
  14. Photoshop快速切图技巧
  15. 一个坑firewall-cmd: error: unrecognized arguments
  16. linux中shell的循环
  17. AS+kotlin+SurfaceView最佳实践之打造六子棋小游戏
  18. 工程伦理--6.4 风险沟通
  19. 用水流的概念来玩硬件(二)----三极管
  20. Redist-Java 有序列表操作

热门文章

  1. xcode6.3设备无法运行Ineligible Devices的解决方法
  2. 如何设置Sketch快捷键,Sketch提升效率的常用技巧
  3. FreeRTOS 遇坑(1)
  4. 安卓手机里的短信删除了如何恢复
  5. EDK II Module Writers Guide上
  6. Cause: java.sql.SQLException: Incorrect string value: ‘\xF4\x80\x80\x82\xF4\x80...‘ for column ‘xxx‘
  7. FLOWABLE 流程中的自动跳过
  8. c语言---16 关于goto语句
  9. PMP是什么?PMP证书在国用处大吗?
  10. POJ 1723 SOLDIERS