关于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; ...
最新文章
- Equalizing Two Strings 冒泡排序or树状数组
- P1505 [国家集训队]旅游 树链剖分
- python读取txt文件代码-Python实现读取txt文件并画三维图简单代码示例
- js 替换任意字符串中间几位为*星号
- Web应用架构-Full-text Search Service
- 就算是蜗牛,也有爬到树顶的那一天!~
- 云服务器ECS登陆注意点
- win08跟linux,Win 8 PK Linux!八大优势助微软完胜
- 拼多多就知乎不当评论致歉;谷歌员工成立首个工会;MySQL 迁移工具新版发布
- 如何成为一名优秀的初级开发者?
- Linux基础——怎么样从手机 (Android安卓/IOS苹果) 通过 SSH 远程 Linux
- 现在企业编程用java还是python_想转行做程序员,是学习 Java 还是 Python 更好?
- php推送mip示例,首页—mip推送软件—首页
- hdu4608 暴力+大数
- pytorch 注意力机制
- 架构真经 | 那些年,我们踩过的缓存坑
- 网上英语学习资源大整理
- android删除自带应用程序,安卓手机自带软件怎么卸载?无需root卸载安卓手机自带软件方法...
- 1节课学会PS ,Adobe PhotoshopCS6超速入门
- python调用perl_perl和python的相互调用
热门文章
- 京东云 linux无法远程,问题解读 | Linux系统SSH无法远程登录时该怎么办?这里有篇小攻...
- frame buffer驱动
- vue中的prop验证
- C# 自动转换为半角 (输入法半角/全角切换) 转载
- 《一年学完mit计算机课程》,用了这种学习方法,他一年学完了33门MIT计算机课程...
- 【数据分析案例】从微信接龙中随机选择k名人员出席
- Oracle默认数据库角色账号密码
- Android百度地图
- python 证件照换背景色(蓝底->白底,蓝底->红底)
- 计算机二级考试应用与分值,计算机二级考试题型及分值