产生背景:sqoop抽取oracle数据到hive表时,只能写入到固定分区(--hive-partition-key #hive分区字段 --hive-partition-value #hive分区值)。于是先把数据抽取到一张增量表,然后从增量表动态写入分区表。

set hive.exec.dynamic.partition.mode = true;  --使用动态分区时,设置为ture。
set hive.exec.dynamic.partition.mode = nonstrict;  --动态分区模式,默认值:strict,表示必须指定一个分区为静态分区;nonstrict模式表示允许所有的分区字段都可以使用动态分区。一般需要设置为nonstrict。
set hive.exec.max.dynamic.partitions.pernode =10;  --在每个执行MR的节点上,最多可以创建多少个动态分区,默认值:100。
set hive.exec.max.dynamic.partitions =1000;  --在所有执行MR的节点上,最多一共可以创建多少个动态分区,默认值:1000。
set hive.exec.max.created.files = 100000;  --整个MR Job中最多可以创建多少个HDFS文件,默认值:100000。
set hive.error.on.empty.partition = false;  --当有空分区产生时,是否抛出异常,默认值:false。

  Hive文件产生大量小文件的原因:

    一是文件本身的原因:小文件多,以及文件的大小;

    二是使用动态分区,可能会导致产生大量分区,从而产生很多小文件,也会导致产生很多Mapper;

    三是Reduce数量较多,Hive SQL输出文件的数量和Reduce的个数是一样的。

  小文件带来的影响:

    文件的数量和大小决定Mapper任务的数量,小文件越多,Mapper任务越多,每一个Mapper都会启动一个JVM来运行,所以这些任务的初始化和执行会花费大量的资源,严重影响性能。

    在NameNode中每个文件大约占150字节,小文件多,会严重影响NameNode性能。

  解决小文件问题:

    如果动态分区数量不可预测,最好不用。如果用,最好使用distributed by分区字段,这样会对字段进行一个hash操作,把相同的分区给同一个Reduce处理;

    减少Reduce数量;

    进行以一些参数调整。

控制Mapper的数量:

  决定Mapper的数量的因素有:输入文件的个数,输入文件的大小、集群设置的文件块大小。

    例如:输入目录下有1个800M的文件,hadoop会将文件分成7个文件(6*128M + 1*32M),从而产生7个Mapper数;

    例如:输入目录下有5个文件,分别为:15M、20M、50M、100M、150M,那么hadoop会分隔成6个文件(15M、20M、50M、100M、128M、22M),从而产生6个Mapper。

  可以通过设置如下参数,让Map在执行之前合并小文件,从而减少Mapper数量:

set mapred.max.split.size=100000000;   -- 决定每个map处理的最大的文件大小,单位为B
set mapred.min.split.size.per.node=100000000;   -- 节点中可以处理的最小的文件大小
set mapred.min.split.size.per.rack=100000000;   -- 机架中可以处理的最小的文件大小
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;  ---实现map中的数据合并需要设置下面的参数,集群默认就是这个格式

  

  控制Mapper的整体原则:

    大数据量要利用合适的map数,单个map要处理合适的数据量;

    map占用资源要合并小文件,map不足要把大文件拆成小文件。

控制Reduce的数量:

  Reduce的个数会极大影响任务的执行效率

  • Hive自己确定reduce数

    不指定Reduce的个数的情况下,Hive会猜测确定一个Reduce个数,由下面两个参数决定:

    1、hive.exec.reducers.bytes.per.reducer(每个reduce任务处理的数据量,默认为1000^3=1G)

    2、hive.exec.reducers.max(每个任务最大的reduce数,默认为999)

    Reduce的个数N=min(参数2,输入总数据量/参数1),例如:如果Reduce的输入(map的输出)总大小不超过1G,那么只有一个Reduce任务。

  • 手动调整reduce数

    Hive官网:

In order to change the average load for a reducer (in bytes): set hive.exec.reducers.bytes.per.reducer=<number>
In order to limit the maximum number of reducers: set hive.exec.reducers.max=<number>
In order to set a constant number of reducers: set mapreduce.job.reduces=<number>

  Notes:动态分区采坑

    在使用动态分区的时候,如果已知数据会分成n个分区,SQL运行的时候创建了m个Mapper,则这个SQL产生m * n个文件。如果这个数值大于设置的创建文件的总数(hive.exec.max.created.files),默认值100000个,就会出现异常。

    在未知动态分区数时,可以使用distribute by 分区字段,将分区字段内容相同的数据放到同一个reduce,当然也可以使用distribute by rand()将数据随记分配给reduce,这样可以使每个reduce处理的数据大体相同。

  • 和map一样,启动和初始化reduce会消耗时间和资源,有多少reduce就会产生多少个文件
  • 以下情况下,会只有一个reduce:
    • 没有group by的汇总,如把select dt,count(1) from test where dt = '2019-12-12' group by dt;,写成select count(1) from test where dt = '2019-12-12';
    • 用了order by;
    • 有笛卡尔积;

  控制Reduce的整体原则:

    使大数据量利用合适的reduce数;

    使单个reduce任务处理合适的数据量。

  

HIVE SQL产生的文件数量及参数调优的更多相关文章

  1. 大数据:Hive常用参数调优

    1.limit限制调整 一般情况下,Limit语句还是需要执行整个查询语句,然后再返回部分结果. 有一个配置属性可以开启,避免这种情况---对数据源进行抽样 hive.limit.optimize.e ...

  2. 1,Spark参数调优

    Spark调优 目录 Spark调优 一.代码规范 1.1 避免创建重复RDD 1.2 尽量复用同一个RDD 1.3 多次使用的RDD要持久化 1.4 使用高性能算子 1.5 好习惯 二.参数调优 资 ...

  3. 看MySQL的参数调优及数据库锁实践有这一篇足够了

    史上最强MySQL参数调优及数据库锁实践 1. 应用优化 1.2 减少对MySQL的访问 1.2.1 避免对数据进行重复检索 1.2.2 增加cache层 1.3 负载均衡 1.3.1 利用MySQL ...

  4. Spark Shuffle原理、Shuffle操作问题解决和参数调优

    摘要: 1 shuffle原理 1.1 mapreduce的shuffle原理 1.1.1 map task端操作 1.1.2 reduce task端操作 1.2 spark现在的SortShuff ...

  5. Linux内核 TCP/IP、Socket参数调优

    Linux内核 TCP/IP.Socket参数调优 2014-06-06  Harrison....   阅 9611  转 165 转藏到我的图书馆   微信分享:   Doc1: /proc/sy ...

  6. 【转】XGBoost参数调优完全指南(附Python代码)

    xgboost入门非常经典的材料,虽然读起来比较吃力,但是会有很大的帮助: 英文原文链接:https://www.analyticsvidhya.com/blog/2016/03/complete-g ...

  7. php-fpm参数调优

    关于php-fpm.conf参数调优,只对重要的参数进程调优.其它可参数前辈的. http://php.net/manual/zh/install.fpm.configuration.php (官方的 ...

  8. XGBoost参数调优完全指南

    简介 如果你的预测模型表现得有些不尽如人意,那就用XGBoost吧.XGBoost算法现在已经成为很多数据工程师的重要武器.它是一种十分精致的算法,可以处理各种不规则的数据.构造一个使用XGBoost ...

  9. 【Spark篇】---Spark中内存管理和Shuffle参数调优

    一.前述 Spark内存管理 Spark执行应用程序时,Spark集群会启动Driver和Executor两种JVM进程,Driver负责创建SparkContext上下文,提交任务,task的分发等 ...

随机推荐

  1. JS基础语法---总结

    JS是一门什么样的语言? 是一门解释性的语言 是一门脚本语言 是一门弱类型语言,声明变量都用var 是一门基于对象的语言 是一门动态类型的语言:            1. 代码(变量)只有执行到这个 ...

  2. RMAN 'Duplicate From Active Database' Feature in Oracle11g (Doc ID 452868.1)

    RMAN 'Duplicate From Active Database' Feature in Oracle11g (Doc ID 452868.1) APPLIES TO: Oracle Data ...

  3. 初级模拟电路:3-2 BJT的工作原理

    回到目录 和前面介绍二极管的PN结的工作原理一样,BJT的量子级工作机制也非常复杂,一般教科书上为了帮助学习者能快速理解,也都是用一种简化模型的方法来介绍BJT的工作机理,一般只需大致了解即可.只要记 ...

  4. 一个版本烧录过程中记录:fdisk、mkfs.ext4、make_ext4fs、img2simg、simg2img

    关键词:dd.fdisk.mkfs.ext4.make_ext4fs.img2simg.simg2img等等. 一个典型的嵌入式系统是由uboot+kernel+rootfs组成的,其中uboot和k ...

  5. 2019 SDN上机第5次作业

    2019 SDN上机第5次作业 1.浏览RYU官网学习RYU控制器的安装和RYU开发入门教程,提交你对于教程代码的理解,包括但不限于: 描述官方教程实现了一个什么样的交换机功能? 答:官方教程实现了一 ...

  6. 记MacOs视频mov与mp4格式转换问题解决

    综述 记录了mov转mp4格式的方法 记录了自己是多蠢 问题背景 这学期选修的<工程英语视听说>课,需要提交一段口语考试视频,于是乎: 带着我的大疆Mavic Mini 和iPad Pro ...

  7. CF785D Anton and School - 2

    题目链接 problem 给出一个括号序列,要求删除一些括号使得剩下的括号序列是个匹配的括号序列,且改括号序列左边全部为左括号,右边全部为右括号. solution 考虑枚举左右括号交界的位置\(x\ ...

  8. 在 ASP.NET Core 项目中使用 npm 管理你的前端组件包

    一.前言 在项目的前端开发中,对于绝大多数的小伙伴来说,当然,也包括我,不可避免的需要在项目中使用到一些第三方的组件包.这时,团队中的小伙伴是选择直接去组件的官网上下载,还是图省事直接在网上搜索,然后 ...

  9. new 关键字 和 newInstance() 方法的 区别

    区别1: new是一个关键字,可以说是一个指令: newInstance()是一个方法,Class对象的一个方法. 区别2: new主要作用是在内存中生成一个实例,而这个类可以没有提前加载到内从中: ...

  10. 【zabbix告警配置】zabbix服务配置邮件告警

    一.安装邮件服务 在zabbix_server服务端安装邮件和邮件发送服务,这里可以参考我另一篇邮件服务部署文章:https://www.cnblogs.com/HeiDi-BoKe/p/118833 ...