关于hive on spark的distribute by和group by使用以及小文件合并问题
欢迎关注交流微信公众号:小满锅
问题导言
最近在使用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使用以及小文件合并问题相关推荐
- spark 实现HDFS小文件合并
一.首先使用sparksql读取需要合并的数据.当然有两种情况, 一种是读取全部数据,即需要合并所有小文件. 第二种是合并部分数据,比如只查询某一天的数据,只合并某一个天分区下的小文件. val df ...
- hive与spark合并小文件,将大文件打碎成小文件
场景一:将小文件合并成大文件. mro_hour_test表每个分区有几千个1m未压缩小文件, 以下语句是将几千个文件在输入时(map阶段)合并成150M一个的文件,插入到mro_hour_test_ ...
- spark sql合并小文件_Spark SQL小文件问题在OPPO的解决方案
Spark SQL小文件是指文件大小显著小于hdfs block块大小的的文件.过于繁多的小文件会给HDFS带来很严重的性能瓶颈,对任务的稳定和集群的维护会带来极大的挑战. 一般来说,通过Hive调度 ...
- Hive中数据倾斜和小文件过多的解决方案
数据倾斜: 任务进度长时间维持在99%(或100%),查看任务监控页面,发现只有少量(1个或几个)reduce子任务未完成.因为其处理的数据量和其他reduce差异过大. 原因:某个reduce的数据 ...
- Hive数据分析——Spark是一种基于rdd(弹性数据集)的内存分布式并行处理框架,比于Hadoop将大量的中间结果写入HDFS,Spark避免了中间结果的持久化...
转自:http://blog.csdn.net/wh_springer/article/details/51842496 近十年来,随着Hadoop生态系统的不断完善,Hadoop早已成为大数据事实上 ...
- 调一调Hive on Spark参数,毫不夸张的说,使其性能达到最大化!
前言 Hive on Spark是指使用Spark替代传统MapReduce作为Hive的执行引擎,在HIVE-7292提出.Hive on Spark的效率比on MR要高不少,但是也需要合理调整参 ...
- Hive小文件问题:如何产生、造成影响、解放办法
一.小文件是如何产生的 1.动态分区插入数据,产生大量的小文件,从而导致map数量剧增. 2.reduce数量越多,小文件也越多(reduce的个数和输出文件是对应的). 3.数据源本身就包含大量的小 ...
- HIVE优化系列(1)-- 自动合并输出的小文件
小文件的缺陷我们就不说了,直接进入到正题. HIVE自动合并输出的小文件的主要优化手段为: set hive.merge.mapfiles = true:在只有map的作业结束时合并小文件, set ...
- hive小文件处理方法
方法一 hive方法处理 set hive.merge.mapfiles=true; -- map only job 结束是合并小文件 set hive.merge.mapredfiles=true; ...
最新文章
- .net网格怎么把值插入指定列表_Python列表有什么内置函数可以使用,怎么使用这些函数...
- c# WinForm开发 DataGridView控件的各种操作
- 夏意秋尽-08年1月
- endnote 参考文献加序号_Endnote教程|页码缩写
- c语言语法格式规范(1)常量的非法与合法
- Python线性代数扩展库numpy.linalg中几个常用函数
- Java 软件实践 VZone PPT Show 一次及其Perfect的演示
- 单维度量表验证性因子分析_探索性因子分析(EFA)和验证性因子分析(CFA)
- 【Steam VR 2.0】自定义按键 action 发布后无效的解决办法
- 马化腾的马氏建议:“小步快跑 快速迭代”
- 信号指示RSSI与显示格数关系
- 大数据之父_BIM先驱Charles (Chuck) M. Eastman逝世——致敬“BIM之父”
- 5种方案实现订单30分钟未支付,则自动取消
- Photoshop快速切图技巧
- 一个坑firewall-cmd: error: unrecognized arguments
- linux中shell的循环
- AS+kotlin+SurfaceView最佳实践之打造六子棋小游戏
- 工程伦理--6.4 风险沟通
- 用水流的概念来玩硬件(二)----三极管
- Redist-Java 有序列表操作
热门文章
- xcode6.3设备无法运行Ineligible Devices的解决方法
- 如何设置Sketch快捷键,Sketch提升效率的常用技巧
- FreeRTOS 遇坑(1)
- 安卓手机里的短信删除了如何恢复
- EDK II Module Writers Guide上
- Cause: java.sql.SQLException: Incorrect string value: ‘\xF4\x80\x80\x82\xF4\x80...‘ for column ‘xxx‘
- FLOWABLE 流程中的自动跳过
- c语言---16 关于goto语句
- PMP是什么?PMP证书在国用处大吗?
- POJ 1723 SOLDIERS