解决HDFS小文件带来的计算问题
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小文件带来的计算问题的更多相关文章
- 彻底解决Hive小文件问题
最近发现离线任务对一个增量Hive表的查询越来越慢,这引起了我的注意,我在cmd窗口手动执行count操作查询发现,速度确实很慢,才不到五千万的数据,居然需要300s,这显然是有问题的,我推测可能是有 ...
- 合并hive/hdfs小文件
磁盘: heads/sectors/cylinders,分别就是磁头/扇区/柱面,每个扇区512byte(现在新的硬盘每个扇区有4K) 文件系统: 文件系统不是一个扇区一个扇区的来读数据,太慢了,所以 ...
- 数仓面试高频考点--解决hive小文件过多问题
本文首发于公众号:五分钟学大数据 小文件产生原因 hive 中的小文件肯定是向 hive 表中导入数据时产生,所以先看下向 hive 中导入数据的几种方式 直接向表中插入数据 insert into ...
- HDFS小文件处理——Mapper处理
处理小文件的时候,可以通过org.apache.hadoop.io.SequenceFile.Writer类将所有文件写出到一个seq文件中. 大致流程如下: 实现代码: package study. ...
- HDFS 小文件处理——应用程序实现
在真实环境中,处理日志的时候,会有很多小的碎文件,但是文件总量又是很大.普通的应用程序用来处理已经很麻烦了,或者说处理不了,这个时候需要对小文件进行一些特殊的处理——合并. 在这通过编写java应用程 ...
- hadoop 小文件 挂载 小文件对NameNode的内存消耗 HDFS小文件解决方案 客户端 自身机制 HDFS把块默认复制3次至3个不同节点。
hadoop不支持传统文件系统的挂载,使得流式数据装进hadoop变得复杂. hadoo中,文件只是目录项存在:在文件关闭前,其长度一直显示为0:如果在一段时间内将数据写到文件却没有将其关闭,则若网络 ...
- 用Hadoop AVRO进行大量小文件的处理(转)
使用 使用使用 使用 HDFS 保存大量小文件的缺点:1.Hadoop NameNode 在内存中保存所有文件的“元信息”数据.据统计,每一个文件需要消耗 NameNode600 字节内存.如果需要保 ...
- hive小文件合并设置参数
Hive的后端存储是HDFS,它对大文件的处理是非常高效的,如果合理配置文件系统的块大小,NameNode可以支持很大的数据量.但是在数据仓库中,越是上层的表其汇总程度就越高,数据量也就越小.而且这些 ...
- <Hadoop><SequenceFile><Hadoop小文件>
Origin 我们首先理解一下SequenceFile试图解决什么问题,然后看SeqFile怎么解决这些问题. In HDFS 序列文件是解决Hadoop小文件问题的一个方法: 小文件是显著小于HDF ...
随机推荐
- 博弈的dfs
题目: 链接:https://ac.nowcoder.com/acm/contest/283/D来源:牛客网 小西买了一堆肥宅快乐水和肥宅快乐茶,准备和室友比谁更肥宅. 快乐水有A瓶,快乐茶B瓶. 小 ...
- Java使用Jsoup简单解析页面
jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址.HTML 文本内容.它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出 ...
- python基础类型(字典:dict)
字典的介绍: 字典(dict)Python中唯一的一个映射类型.他是以{}括起来的键值对组成,在dict中key是唯一的.在保存的时候,根据key来计算出一个内存地址,然后将key-value保存到这 ...
- 拓展练习--find查找、打包压缩、服务器、磁盘挂载
目录 find查找.打包压缩 服务器部分 磁盘挂载及单用户模式 find查找.打包压缩 1.超级用户(管理员用户)提示符是_#,普通用户提示符是$_. 2.如何快速返回上一次所在的目录? cd - 3 ...
- Ubuntu下下载使用sublime
使用Sublime真心很舒服.安装方法很简单,如下 进入官网http://www.sublimetext.com/2下载你的Sublime Text 2,然后解压文件. 把解压后得到的文件移动到/us ...
- CNN基础四:监测并控制训练过程的法宝——Keras回调函数和TensorBoard
训练模型时,很多事情一开始都无法预测.比如之前我们为了找出迭代多少轮才能得到最佳验证损失,可能会先迭代100次,迭代完成后画出运行结果,发现在中间就开始过拟合了,于是又重新开始训练. 类似的情况很多, ...
- python3.x 匿名函数lambda_扩展sort
#匿名函数lambda 参数: 表达式关键字 lambda 说明它是一个匿名函数,冒号 : 前面的变量是该匿名函数的参数,冒号后面是函数的返回值,注意这里不需使用 return 关键字. ambda只 ...
- hdu 6085 Rikka with Candies (set计数)
Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, so he ...
- Codeforces 789e The Great Mixing (bitset dp 数学)
Sasha and Kolya decided to get drunk with Coke, again. This time they have k types of Coke. i-th typ ...
- NetHogs——Linux下按进程实时统计网络带宽利用率
Debian/Ubuntu下安装很简单,执行:apt-get install nethogs 就可以安装. CentOS/RHEL下建议先安装上EPEL,再执行:yum install libpcap ...