hive中控制文件生产个数
在有些时候,想要控制hql执行的mapper,reducer个数,reducer设置过少,会导致每个reducer要处理的数据过多,这样可能会导致OOM异常,如果reducer设置过多,则会导致产生很多小文件,这样对任务的执行以及集群都不太好.通常情况下这两个参数都不需要手动设置,Hive会根据文件的大小和任务的情况自动计算,但是某些特殊情况下可能需要进行调优,下面列举两个常用的调优场景看看这两个参数在调优的时候都是怎么用的:
方法一:设置reducer个数
reducer个数最直接的影响是hql执行完之后生成的文件个数,假设你的任务有n个reducer,那么最后可能会生成的文件肯定至少有n个,前提是你没有设置合并小文件,这个有什么用处呢?最简单的一个用处是我们在hive里面经常会调第三方接口来获取数据,例如解密之内的,假设接口不限速,我们在udf里面调接口的时候会发现特别慢,感觉直接select很快,但是把查询结果insert到一个表保存就很慢,这个原因就在于数据请求线程太少了。
在hadoop里面,一个文件至少会起一个mapper,如果你的文件很小(默认1G起一个mapper),那就完了,整个任务就一直是一个个来请求接口的,所以非常的慢。那如果想加快接口的调用呢?其实也简单,把文件分成几个小文件,假设分成了10个小文件,那么再次调接口就会快很多了,10线程和单线程的差别还是非常大的。
具体的语句也就两句话,记住,划分小文件还得保证每个文件尽量大小一样。
- set mapred.reduce.tasks=50;
- insert into table xxx
- select
- *
- from
- xxx
- distribute by rand();
方法二:设置每个reducer处理的数据
- set hive.exec.reducers.bytes.per.reducer=5120000000;
- insert into table xxx
- select
- *
- from
- xxx
- distribute by rand();
备注:第一个set设置的就是最后你要生成的文件个数,后面的distribute by rand()
保证了记录随机分配到50个文件,不管里数据量有多小,最后这50个文件的大小应该是一致的.
动态分区产生小文件
有些场景会产生大量的文件,比如动态分区插入,或者两个比较大的表做join,对于大表做join,我没有细测,但是我发现我用一个很小的表(大概70M),去join一个很大的表(大概400G),由于Hive在处理小表join大表的时候会做优化,左边的表会都加载到内存里面,然后分发到各个节点和大表做join,这样最后就会在大表所在的节点产生最终的结果,后果就是会原来大表的那些文件现在都变成小文件了,小文件太多其实对性能还是有影响的,这个其实可以最后用一个reducer来合并小文件。
主要说一下动态分区产生小文件问题,这是个很有意思的问题,动态分区好用,但是为啥会产生这么多小文件。原因就在于,假设动态分区初始有N个mapper,那么最后生成了m个分区,最终会有多少个文件生成呢?答案是N*m
,是的,每一个mapper会生成m个文件,就是每个分区都会对应一个文件,这样的话你算一下。所以小文件就会成倍的产生。怎么解决这个问题,通常处理方式也是像上面那样,让数据尽量聚到一个reducer里面,因为有时候虽然动态分区不会产生reducer,但是也就意味着最后没有进行文件合并,我们也可以用distribute
这句来保证数据聚类到相同的reducer。
by rand()
hive中控制文件生产个数的更多相关文章
- oracle 中控制文件中到底记录了哪些信息
oracle 控制文件中的信息 oracle 11g oracle 10g DATABASE ...
- 如何在hadoop中控制map的个数
hadooop提供了一个设置map个数的参数mapred.map.tasks,我们可以通过这个参数来控制map的个数.但是通过这种方式设置map的个数,并不是每次都有效的.原因是mapred.map. ...
- 如何在hadoop中控制map的个数 分类: A1_HADOOP 2015-03-13 20:53 86人阅读 评论(0) 收藏
hadooop提供了一个设置map个数的参数mapred.map.tasks,我们可以通过这个参数来控制map的个数.但是通过这种方式设置map的个数,并不是每次都有效的.原因是mapred.map. ...
- 【RMAN】Oracle中如何备份控制文件?备份控制文件的方式有哪几种?
真题1. 如何备份控制文件?备份控制文件的方式有哪几种? 答案:备份控制文件的方式有多种. ① 备份控制文件可以在线进行: SQL> ALTER DATABASE BACKUP CONTROLF ...
- Oracle控制文件
一.Oracle 控制文件 为二进制文件,初始化大小由CREATE DATABASE指定,可以使用RMAN备份 记录了当前数据库的结构信息,同时也包含数据文件及日志文件的信息以及相关的状态,归档信息等 ...
- Oracle 控制文件(CONTROLFILE)
一.Oracle 控制文件 为二进制文件,初始化大小由CREATE DATABASE指定,可以使用RMAN备份 记录了当前数据库的结构信息,同时也包含数据文件及日志文件的信息以及相关的状态,归档信息等 ...
- 关于RMAN的配置信息存储和控制文件的关系
没有使用catalog时,rman中的所有配置信息都会记入在 控制文件中 控制文件中dump出来的信息: *********************************************** ...
- Oracle备份恢复之断电导致控制文件和日志文件损坏修复
Oracle数据库遭遇断电遭遇ora-00214.ora-00314.ora-00312错误恢复案例一枚 1.数据库在17日21:19启动开始报错ora-214错误: Tue Jan 17 21:19 ...
- 【翻译自mos中文文章】重建控制文件的方法
重建控制文件的方法 參考原文: How to Recreate a Controlfile (Doc ID 735106.1) 适用于: Oracle Database - Enterprise Ed ...
随机推荐
- 自己写的一些公共js方法
/* 说明文件:这里用的都是es6的语法 导入导出,拿vue举个栗子,你只需要在用到的地方,按需要导入就行了,然后在mounted中直接可以拿来用 比如下面的手机****方法,在需要用到的地方impo ...
- Cocos Creator 监听安卓屏幕下方返回键
addEscEvent = function(node){ cc.eventManager.addListener({ event: cc.EventListener.KEYBOARD, onKeyP ...
- cdh安装spark遇到的几个BUG
spark安装后启动: [zdwy@master spark]$ sbin/start-all.sh starting org.apache.spark.deploy.master.Master, l ...
- SQL Server创建存储过程——动态SQL
简介: 存储过程(stored procedure)是一组为了完成特定功能的SQL语句集合,经编译后存储在服务器端的数据库中,利用存储过程可以加速SQL语句的执行. 自定义存储过程,由用户创建并能完成 ...
- centos6 更新gcc glibc2.17
curl -Lks http://www.hop5.in/yum/el6/hop5.repo > /etc/yum.repos.d/hop5.repo yum install gcc wget ...
- 接口自动化测试持续集成--Soapui接口功能测试参数化
按照自动化测试分层实现的原理,每一层的脚本实现都要进行参数化,自动化的目标就是要实现脚本代码与测试数据分离. 当测试数据进行调整的时候不会对脚本的实现带来震荡,从而提高脚本的稳定性与灵活度,降低脚本的 ...
- 前端JS插件整理
1.JQuery.js JavaScript 库,简化JS. 官网地址:https://jquery.com/ 菜鸟教程:http://www.runoob.com/jquery/jquery-tut ...
- maven clean或package报错
[ERROR] Failed to execute goal on project jeesns-service: Could not resolve dependencies for project ...
- python 之路 day5 - 常用模块
模块介绍 time &datetime模块 random os sys shutil json & picle shelve xml处理 yaml处理 configparser has ...
- poj3373--Changing Digits(DFS+剪枝///记忆化)
题目链接:点击打开链接 题目大意:给出一个n和一个k 求m 要求1.m要和n相同的位数 要求2.m要整除k 要求3.如果1和2满足,那么m要和n有尽量少的不同位 要求4.如果1.2.3满足,要使m尽量 ...