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

问题导言

最近在使用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. Equalizing Two Strings 冒泡排序or树状数组
  2. P1505 [国家集训队]旅游 树链剖分
  3. python读取txt文件代码-Python实现读取txt文件并画三维图简单代码示例
  4. js 替换任意字符串中间几位为*星号
  5. Web应用架构-Full-text Search Service
  6. 就算是蜗牛,也有爬到树顶的那一天!~
  7. 云服务器ECS登陆注意点
  8. win08跟linux,Win 8 PK Linux!八大优势助微软完胜
  9. 拼多多就知乎不当评论致歉;谷歌员工成立首个工会;MySQL 迁移工具新版发布
  10. 如何成为一名优秀的初级开发者?
  11. Linux基础——怎么样从手机 (Android安卓/IOS苹果) 通过 SSH 远程 Linux
  12. 现在企业编程用java还是python_想转行做程序员,是学习 Java 还是 Python 更好?
  13. php推送mip示例,首页—mip推送软件—首页
  14. hdu4608 暴力+大数
  15. pytorch 注意力机制
  16. 架构真经 | 那些年,我们踩过的缓存坑
  17. 网上英语学习资源大整理
  18. android删除自带应用程序,安卓手机自带软件怎么卸载?无需root卸载安卓手机自带软件方法...
  19. 1节课学会PS ,Adobe PhotoshopCS6超速入门
  20. python调用perl_perl和python的相互调用

热门文章

  1. 京东云 linux无法远程,问题解读 | Linux系统SSH无法远程登录时该怎么办?这里有篇小攻...
  2. frame buffer驱动
  3. vue中的prop验证
  4. C# 自动转换为半角 (输入法半角/全角切换) 转载
  5. 《一年学完mit计算机课程》,用了这种学习方法,他一年学完了33门MIT计算机课程...
  6. 【数据分析案例】从微信接龙中随机选择k名人员出席
  7. Oracle默认数据库角色账号密码
  8. Android百度地图
  9. python 证件照换背景色(蓝底->白底,蓝底->红底)
  10. 计算机二级考试应用与分值,计算机二级考试题型及分值