在有些时候,想要控制hql执行的mapper,reducer个数,reducer设置过少,会导致每个reducer要处理的数据过多,这样可能会导致OOM异常,如果reducer设置过多,则会导致产生很多小文件,这样对任务的执行以及集群都不太好.通常情况下这两个参数都不需要手动设置,Hive会根据文件的大小和任务的情况自动计算,但是某些特殊情况下可能需要进行调优,下面列举两个常用的调优场景看看这两个参数在调优的时候都是怎么用的:

方法一:设置reducer个数

reducer个数最直接的影响是hql执行完之后生成的文件个数,假设你的任务有n个reducer,那么最后可能会生成的文件肯定至少有n个,前提是你没有设置合并小文件,这个有什么用处呢?最简单的一个用处是我们在hive里面经常会调第三方接口来获取数据,例如解密之内的,假设接口不限速,我们在udf里面调接口的时候会发现特别慢,感觉直接select很快,但是把查询结果insert到一个表保存就很慢,这个原因就在于数据请求线程太少了。
在hadoop里面,一个文件至少会起一个mapper,如果你的文件很小(默认1G起一个mapper),那就完了,整个任务就一直是一个个来请求接口的,所以非常的慢。那如果想加快接口的调用呢?其实也简单,把文件分成几个小文件,假设分成了10个小文件,那么再次调接口就会快很多了,10线程和单线程的差别还是非常大的。
具体的语句也就两句话,记住,划分小文件还得保证每个文件尽量大小一样。

  1. set mapred.reduce.tasks=50;
  2. insert into table xxx
  3. select
  4. *
  5. from
  6. xxx
  7. distribute by rand();

方法二:设置每个reducer处理的数据

  1. set hive.exec.reducers.bytes.per.reducer=5120000000;
  2. insert into table xxx
  3. select
  4. *
  5. from
  6. xxx
  7. 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
by rand()
这句来保证数据聚类到相同的reducer。

hive中控制文件生产个数的更多相关文章

  1. oracle 中控制文件中到底记录了哪些信息

     oracle 控制文件中的信息  oracle 11g                                             oracle 10g   DATABASE       ...

  2. 如何在hadoop中控制map的个数

    hadooop提供了一个设置map个数的参数mapred.map.tasks,我们可以通过这个参数来控制map的个数.但是通过这种方式设置map的个数,并不是每次都有效的.原因是mapred.map. ...

  3. 如何在hadoop中控制map的个数 分类: A1_HADOOP 2015-03-13 20:53 86人阅读 评论(0) 收藏

    hadooop提供了一个设置map个数的参数mapred.map.tasks,我们可以通过这个参数来控制map的个数.但是通过这种方式设置map的个数,并不是每次都有效的.原因是mapred.map. ...

  4. 【RMAN】Oracle中如何备份控制文件?备份控制文件的方式有哪几种?

    真题1. 如何备份控制文件?备份控制文件的方式有哪几种? 答案:备份控制文件的方式有多种. ① 备份控制文件可以在线进行: SQL> ALTER DATABASE BACKUP CONTROLF ...

  5. Oracle控制文件

    一.Oracle 控制文件 为二进制文件,初始化大小由CREATE DATABASE指定,可以使用RMAN备份 记录了当前数据库的结构信息,同时也包含数据文件及日志文件的信息以及相关的状态,归档信息等 ...

  6. Oracle 控制文件(CONTROLFILE)

    一.Oracle 控制文件 为二进制文件,初始化大小由CREATE DATABASE指定,可以使用RMAN备份 记录了当前数据库的结构信息,同时也包含数据文件及日志文件的信息以及相关的状态,归档信息等 ...

  7. 关于RMAN的配置信息存储和控制文件的关系

    没有使用catalog时,rman中的所有配置信息都会记入在 控制文件中 控制文件中dump出来的信息: *********************************************** ...

  8. Oracle备份恢复之断电导致控制文件和日志文件损坏修复

    Oracle数据库遭遇断电遭遇ora-00214.ora-00314.ora-00312错误恢复案例一枚 1.数据库在17日21:19启动开始报错ora-214错误: Tue Jan 17 21:19 ...

  9. 【翻译自mos中文文章】重建控制文件的方法

    重建控制文件的方法 參考原文: How to Recreate a Controlfile (Doc ID 735106.1) 适用于: Oracle Database - Enterprise Ed ...

随机推荐

  1. Linux启动顺序、运行级别及开机启动

    一.启动顺序 当我们经过BIOS引导,并选择了Linux作为准备引导的操作系统后,接下来的执行顺序如下:1.加载并执行内核 第一个被加载的东西就是内核.然后把内核在内存中解压缩,就可以开始运行了.2. ...

  2. 18.11.20-C语言练习-根据输入统计字符类型

    一.题目: 二.C程序:(注意:中文部分是程序注释,如果编译器不支持中文,需要把中文删掉) #include <stdio.h> int main() { ; //保存字母数量 ; //保 ...

  3. 常见mysql的慢查询优化方式

    一,第一步.开启mysql慢查询 方式一: 修改配置文件  在 my.ini 增加几行:  主要是慢查询的定义时间(超过2秒就是慢查询),以及慢查询log日志记录( slow_query_log) 方 ...

  4. Machine Learning 第三周

    ML week3 逻辑回归 Logistic Function h_\theta(x)=g(\theta^Tx) g(t)=\frac{1}{1+e^{-z}} 当t大于0, 即下面公式成立时,y=1 ...

  5. (转)sql 违反了 PRIMARY KEY 约束,不能在对象 中插入重复键

    说明你的数据里面有重复记录 两种情况 1.已存在的表中和要导入数据之间的重复 这个时候可以通过在两个表之间建立关联,将主键级联找出重复记录 2.要导入的表中存在重复记录 可通过类似如下的语句将表中的重 ...

  6. vivo Xplay 5的Usb调试模式在哪里,打开vivo Xplay 5Usb调试模式的经验

    在我们使用安卓手机链接PC的时候,如果手机没有开启Usb调试模式,PC则无办法成功检测到我们的手机,部分app也无办法正常使用,因此我们需要找处理方法将手机的Usb调试模式开启,如下内容我们介绍viv ...

  7. (2018干货系列二)最新HTML5学习路线整合

    怎么学HTML5 HTML5是万维网的核心语言,标准通用标记语言下的一个应用超文本标记语言(HTML)的第五次重大修改,一方面提升了用户体验,另一方面HTML5技术跨平台,适配多终端,改变了传统开发者 ...

  8. Vue 中如何引入第三方 JS 库

    一绝对路径直接引入全局可用 二绝对路径直接引入配置后import 引入后再使用 三webpack中配置 aliasimport 引入后再使用 四webpack 中配置 plugins无需 import ...

  9. prometheus监控

    一. 部署prometheus 1.1 下载 wget https://github.com/prometheus/prometheus/releases/download/v2.7.1/promet ...

  10. JS动态添加行列

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Add-Delete Row.a ...