hive优化

### 一.小文件简述
#### 1.1. HDFS上什么是小文件?
HDFS存储文件时的最小单元叫做Block,Hadoop1.x时期Block大小为64MB,Hadoop2.x时期Block大小为128MB。(在hadoop部署下可以通过dfs.block.size进行设置)
小文件就是指,在HDFS上落地的文件大小远远小于一个Block块大小的文件。
#### 1.2. 小文件形成的原因
#### 1.3. 小文件的危害
* **内存占用** 小文件存储在HDFS上,对应的每个文件都会在namenode中存有相应的元数据信息(在namenode的内存中均被表示为一个对象(object)).如果每一个文件的元数据信息占用内存100byte,那么有10万个文件, 就占用了namenode10G的内存空间
* **数据查询** HDFS对小文件的读取, 涉及到磁盘读取, 同时涉及到从跨datanode的文件查询(Reading through small files normally causes lots of seeks and lots of hopping from datanode to datanode to retrieve each small file)
* **任务启动** 在hadoop上进行数据计算时,每一个小文件都要对应一个task,每一个task也要对应的申请slot。task启动阶段会耗费大量的时间在任务资源申请和释放上。

二. 小文件的处理方式

2.1. HDFS上现存的小文件

问题 : HDFS集群上目前存在的大量小文件

解决 : 不定期调用HDFS和sync()方法 和 append()方法, 整理小文件生成大文件

2.2. MapReduce上的小文件

上面已经描述过,一个文件对应启动一个mapTask,则小文件太多,会带来相应的很多问题。处理方式如下:

2.2.1. Hadoop Archive(略)
2.2.2. Sequence File(略)
2.2.3. CombineFileInputFormat方法

思路主要是, 将几个小文件合并在一起, "打包"提供给Task进行计算, 避免一个文件启动一个Task。

具体说来就是: Hadoop内置了CombineFileInputFormat类专门用于处理小文件, 将HDFS上多个小文件合并成一个InputSplit, 然后启用一个map来处理这个InputSplit。

这个环节主要包含如下的几个参数的使用:

mapreduce.input.fileinputformat.split.minsize.per.node
mapreduce.input.fileinputformat.split.minsize.per.rack
mapreduce.input.fileinputfornat.split.maxsize

mapreduce.input.fileinputfornat.split.maxsize参数说明

  • 如果未进行设置, 默认就会将同一个机架上的所有小文件组成一个InputSplit, 交由一个MapTask处理。
  • 如果进行了设置, 同一个节点(node)上的文件会组成一个InputSplit

2.3. Hive上的小文件

2.3.1. 输入文件多的解决方案

设置mapper输入文件合并的参数如下:

## Mapper执行前进行小文件合并
hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
## 每一个mapper最大的输入大小
mapred.max.split.size = 256000000
## 一个节点上split的至少的大小(这个值决定了多个DataNode上的文件是否需要合并)
mapred.min.split.size.per.node = 100000000
## 一个机架下split的至少的大小(这个值决定了该机架下的文件是否需要合并)
mapred.min.split.size.per.rack = 100000000
2.3.2. 输出文件过多(包括中间过程和输出结果)
## Map-only的任务结束时合并小文件(map-only应该就是只有map阶段没有reduce阶段吧)
hive.merge.mapfiles = true
## 在Map-reduce的任务结束时合并小文件
hive.merge.mapredfiles = true (默认是false)
## 控制合并文件的大小
hive.merge.size.per.task = 25610001000
## 当输出文件的平均大小小于该值时,启动一个独立的map-reduce任务进行文件merge
hive.merge.smallfiles.avgsize = 16000000
2.3.3. 生成的结果文件多的另一种折中处理

对reducer进行调整 a.调整reducer个数 b.调整reducer大小

## 设定reducer个数
set mapred.reduce.tasks = 50;
## 设定reduce的大小
set hive.exec.reducers.bytes.per.reducer = 512000000

ps:Hive对创建的文件总数是有限制的, 通过hive.exec.max.created.files参数进行控制(默认是10000).如果hive表有100个分区, 1000个mapper, 则总共创建的文件数就会是100*1000 = 100000, 任务执行阶段就会触发exceeds 100000.Killing the job的错误, 进行 hive.exec.max.created.files参数的放大可解决这个错误, 但同时会导致小文件。

解决HDFS小文件带来的计算问题的更多相关文章

  1. 彻底解决Hive小文件问题

    最近发现离线任务对一个增量Hive表的查询越来越慢,这引起了我的注意,我在cmd窗口手动执行count操作查询发现,速度确实很慢,才不到五千万的数据,居然需要300s,这显然是有问题的,我推测可能是有 ...

  2. 合并hive/hdfs小文件

    磁盘: heads/sectors/cylinders,分别就是磁头/扇区/柱面,每个扇区512byte(现在新的硬盘每个扇区有4K) 文件系统: 文件系统不是一个扇区一个扇区的来读数据,太慢了,所以 ...

  3. 数仓面试高频考点--解决hive小文件过多问题

    本文首发于公众号:五分钟学大数据 小文件产生原因 hive 中的小文件肯定是向 hive 表中导入数据时产生,所以先看下向 hive 中导入数据的几种方式 直接向表中插入数据 insert into ...

  4. HDFS小文件处理——Mapper处理

    处理小文件的时候,可以通过org.apache.hadoop.io.SequenceFile.Writer类将所有文件写出到一个seq文件中. 大致流程如下: 实现代码: package study. ...

  5. HDFS 小文件处理——应用程序实现

    在真实环境中,处理日志的时候,会有很多小的碎文件,但是文件总量又是很大.普通的应用程序用来处理已经很麻烦了,或者说处理不了,这个时候需要对小文件进行一些特殊的处理——合并. 在这通过编写java应用程 ...

  6. hadoop 小文件 挂载 小文件对NameNode的内存消耗 HDFS小文件解决方案 客户端 自身机制 HDFS把块默认复制3次至3个不同节点。

    hadoop不支持传统文件系统的挂载,使得流式数据装进hadoop变得复杂. hadoo中,文件只是目录项存在:在文件关闭前,其长度一直显示为0:如果在一段时间内将数据写到文件却没有将其关闭,则若网络 ...

  7. 用Hadoop AVRO进行大量小文件的处理(转)

    使用 使用使用 使用 HDFS 保存大量小文件的缺点:1.Hadoop NameNode 在内存中保存所有文件的“元信息”数据.据统计,每一个文件需要消耗 NameNode600 字节内存.如果需要保 ...

  8. hive小文件合并设置参数

    Hive的后端存储是HDFS,它对大文件的处理是非常高效的,如果合理配置文件系统的块大小,NameNode可以支持很大的数据量.但是在数据仓库中,越是上层的表其汇总程度就越高,数据量也就越小.而且这些 ...

  9. <Hadoop><SequenceFile><Hadoop小文件>

    Origin 我们首先理解一下SequenceFile试图解决什么问题,然后看SeqFile怎么解决这些问题. In HDFS 序列文件是解决Hadoop小文件问题的一个方法: 小文件是显著小于HDF ...

随机推荐

  1. Windows server 2016远程桌面登录和修改3389端口

  2. 数组Array的十种使用方法

    第一种方法 array toString () 将数组的元素全部转换为字符串; 第二种方法 array join ("这里是分隔符") 这种方法可以把数组的元素转换为字符串,并把分 ...

  3. WPF 的二维绘图(二)——几何图形Geometry

    <本文转自同行> 在WPF的DrawingContext对象中,提供了基本的绘制椭圆和矩形的API:DrawEllipse和DrawRectangle.但是,这些是远远不够用的,我们在日常 ...

  4. 【记录】STS设置maven远程仓库,加快下载jar包

    在STS中windows->preferences->maven->user settings 修改user settings里setting.xml配置文件 <?xml ve ...

  5. Tornado框架的简单使用

    一.Tornado Web应用程序的结构 import tornado.web class LoginHandler(tornado.web.RequestHandler): def get(self ...

  6. Android开发文档

    https://developer.android.com/ 用ke学上网方能打开

  7. paper 147:Deep Learning -- Face Data Augmentation(一)

    1. 在深度学习中,当数据量不够大时候,常常采用下面4中方法:  (1)人工增加训练集的大小. 通过平移, 翻转, 加噪声等方法从已有数据中创造出一批"新"的数据.也就是Data ...

  8. paper 140:TLD视觉跟踪算法(超棒)

    我是看了这样的一个视频:http://www.56.com/u83/v_NTk3Mzc1NTI.html 然后在准备针对TLD视觉跟踪算法来个小的总结. 以下博文转自:http://blog.csdn ...

  9. javascript 对象的设计模式

    1.为什么学习设计模式:http://www.iteye.com/news/32092   或  https://blog.csdn.net/pigpigpig4587/article/details ...

  10. Angular项目中引入jQuery

    npm install --save jquery npm install @types/jquery --save 在对应的组件中引入 import * as $ from "jquery ...