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线程和单线程的差别还是非常大的。
具体的语句也就两句话,记住,划分小文件还得保证每个文件尽量大小一样。

  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。

原文地址:https://www.cnblogs.com/xingfengzuolang/p/10752663.html

时间: 2024-10-03 23:28:39

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

如何在hadoop中控制map的个数

hadooop提供了一个设置map个数的参数mapred.map.tasks,我们可以通过这个参数来控制map的个数.但是通过这种方式设置map 的个数,并不是每次都有效的.原因是mapred.map.tasks只是一个hadoop的参考数值,最终map的个数,还取决于其他的因素. 为了方便介绍,先来看几个名词: block_size : hdfs的文件块大小,默认为64M,可以通过参数dfs.block.size设置 total_size : 输入文件整体的大小 input_file_num

Oracle 控制文件(CONTROLFILE)

--============================= -- Oracle 控制文件(CONTROLFILE) --============================= 一.Oracle 控制文件 为二进制文件,初始化大小由CREATE DATABASE指定,可以使用RMAN备份 记录了当前数据库的结构信息,同时也包含数据文件及日志文件的信息以及相关的状态,归档信息等等 在参数文件中描述其位置,个数等等.通常采用分散放开,多路复用的原则.在mount阶段被读取,open阶段一直被使

【oracle11g,9】控制文件

一.控制文件作用: 1.记录了数据库的物理状态. 2.维护数据库的一致性.控制文件中记录了数据库系统scn号.数据文件scn号与数据文件头里的开始scn号,如果这三个scn号一致说明数据库可以启动.如果不一致就要恢复. 3.在参数文件中定义控制文件的位置和个数. 控制文件最少1个,最多8个,多个文件是镜像的关系. 定义控制文件 *.control_files='/opt/oracle/oradata/orcl/control01.ctl','/opt/oracle/oradata/orcl/co

Oracle DB备份恢复篇之丢失控制文件

实验目的 本篇主要模拟控制文件丢失后,如何根据实际情况恢复数据库,才能使数据库尽可能不丢失数据. 实验环境 1)Linux系统环境 [[email protected] ~]$ lsb_release -a LSB Version: :core-3.1-ia32:core-3.1-noarch:graphics-3.1-ia32:graphics-3.1-noarch Distributor ID: RedHatEnterpriseServer Description: Red Hat Ente

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

重建控制文件的方法 參考原文: How to Recreate a Controlfile (Doc ID 735106.1) 适用于: Oracle Database - Enterprise Edition - Version 9.0.1.0 and later Information in this document applies to any platform. 解决方式: 警告: 仅仅有遇到下列场景时,你才应该recreate 你的控制文件 1.全部的当前的控制文件copies 已经

oracle参数文件、控制文件、数据文件、日志文件的位置及查询方法

参数文件:所有参数文件一般在  $ORACLE_HOME/dbs 下 sqlplus查询语句:show parameter spfile; 网络连接文件: $ORACLE_HOME/dbs/network/admin 目录中 控制文件:select * from v$controlfile; 数据文件:一般在oracledata/实例名  目录下 select FILE_NAME from dba_data_files; 日志文件:一般在oracledata/实例名  目录下 select *

hive优化----控制hive中的map数

1. 通常情况下,作业会通过input的目录产生一个或者多个map任务. 主要的决定因素有: input的文件总个数,input的文件大小,集群设置的文件块大小(目前为128M, 可在hive中通过set dfs.block.size;命令查看到,该参数不能自定义修改): 2. 举例:a) 假设input目录下有1个文件a,大小为780M,那么hadoop会将该文件a分隔成7个块(6个128m的块和1个12m的块),从而产生7个map数b) 假设input目录下有3个文件a,b,c,大小分别为1

ORACLE中没有参数文件和控制文件如何通过rman恢复数据库

场景: 一个DEV告诉我生产环境下某个用户的表都看不到了,需要恢复,而此时生产库上存储自动备份的参数文件控制文件的磁盘目录文件坏块,所以导致rman备份的只有数据文件和归档日志文件,这种情况下,如何在测试服务器上利用rman恢复数据呢?google了很多资料,咨询了朋友,恢复过程如下: 前期准备工作:事先查询好先查询下原来的数据文件路径SQL> select name from v$datafile; NAME-------------------------------------------

获取当前目录中的文件个数

一.获取当前目录下的文件个数 1.命令 ls -l | grep "^-" | wc -l 2.说明 ls -l 长列表输出该目录下文件信息(注意这里的文件,不同于一般的文件,可能是目录.链接.设备文件等):grep “^-“ 这里将长列表输出信息过滤一部分,只保留一般文件,如果只保留目录就是^d:wc -l 统计输出信息的行数,因为已经过滤得只剩一般文件了,所以统计结果就是一般文件信息的行数,又由于一行信息对应一个文件,所以也就是文件的个数 要想连隐藏文件一起统计,使用如下命令 ls