解决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 ...
随机推荐
- rgba转化为16进制在线工具
https://www.sioe.cn/yingyong/yanse-rgb-16/
- SQL数据库—<5>视图、索引…简单学习
视图 掌握:1.视图是个什么东西?2.会建视图,会查视图3.知道视图的主要功能是查询,不是增删除改. 视图的定义: 视图可以认为是从一个数据表或者多个数据表中导出的表,视图本身没有任何数据,它是用来存 ...
- SHELL自动化--接口测试
#!/bin/bash fileNum=`ls /bin/testShell/apiCheck_shell/logs/ | grep $(date "+%Y-%m-%d") | w ...
- ANSI-2
一.ANSI编码 1. 如前所述,在全世界所有国家和地区的文字符号统一编码的UCS/Unicode编码方案问世之前(UCS.Unicode后文有详细介绍),各个国家.地区为了用计算机记录并显示自己的字 ...
- 多个ip地址获取
#include "stdafx.h"#include <stdio.h> #include <winsock.h> #include <window ...
- Linux常用功能脚本
设置定时任务 crontab -e 1 0 * * * /bin/find /mnt/tomcat/logs/ -mtime +3 -type f -name "*.log" -e ...
- 使用 sar 查看网卡的流量
1.常用命令 sar -n DEV #查看当天从零点到当前时间的网卡流量信息 sar -n DEV 1 10 #每秒显示一次,共显示10次 sar -n DEV -f /var/log/sa/saxx ...
- 【集群】Redis集群设计原理
Redis集群设计包括2部分:哈希Slot和节点主从 节点主从: 主从设计不算什么新鲜玩意,在数据库中我们也经常用主从来做读写分离,直接上图: 图上能看得到的信息: 1, 只有1个Master,可以有 ...
- hdu 3060 Area2 (计算几何模板)
Problem Description 小白最近又被空军特招为飞行员,参与一项实战演习.演习的内容还是轰炸某个岛屿(这次的岛屿很大,很大很大很大,大到炸弹怎么扔都能完全在岛屿上引爆),看来小白确实是飞 ...
- 2019牛客多校第四场D-triples I 贪心
D-triples 题意 给你一个\(n\),问至少有几个数或运算起来可以等于\(n\),并且输出数量和这个几个数.题目说明给的\(n\)一定符合条件(不会输出\(n= 1\) 之类不存在情况). 思 ...