大数据-Hadoop小文件问题解决方案

标签: geek | 发表时间:2018-04-20 00:00 | 作者:
出处:http://itindex.net/relian

HDFS中小文件是指文件size小于HDFS上block( dfs.block.size)大小的文件。大量的小文件会给Hadoop的扩展性和性能带来严重的影响。

小文件是如何产生的?

  1. 动态分区插入数据,产生大量的小文件,从而导致map数量剧增

  2. reduce数量越多,小文件也越多,reduce的个数和输出文件个数一致

  3. 数据源本身就是大量的小文件

小文件问题的影响

  1. 从Mapreduce的角度看,一个文件会启动一个map,所以小文件越多,map也越多,一个map启动一个jvm去执行,所以这些任务的初始化,启动,执行会浪费大量的资源,严重的影响性能。

  2. 从HDFS角度看,HDFS中文件元信息(位置,大小,分块等)保存在NameNode的内存中,每个对象大约占用150字节,如果小文件过多,会占用大量内存,直接影响NameNode的性能;HDFS读写小文件也会更加耗时,因为每次都需要从NameNode获取元信息,并与对应的DataNode建立连接。

如何解决小文件问题

  1. 输入合并,在Map前合并小文件

  2. 输出合并,在输出结果的时候合并小文件

  3. 控制reduce个数来实现减少小文件个数

配置Map输入合并

可以通过在输入mapper的之前将是输入合并,以减少map的个数。

   -- 每个Map最大输入大小,决定合并后的文件数
set mapred.max.split.size=256000000;
-- 一个节点上split的至少的大小 ,决定了多个data node上的文件是否需要合并
set mapred.min.split.size.per.node=100000000;
-- 一个交换机下split的至少的大小,决定了多个交换机上的文件是否需要合并
set mapred.min.split.size.per.rack=100000000;
-- 执行Map前进行小文件合并
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;

配置Hive输出结果合并

   -- 在map-only job后合并文件,默认true
set hive.merge.mapfiles=true;
-- 在map-reduce job后合并文件,默认false
set hive.merge.mapredfiles=true;
-- 设置合并后文件大大小,默认256000000
set hive.merge.size.per.task=256000000;
-- 当输出文件的平均值大小小于该值是,启动一个独立的MR任务进行文件merge,是决定是否执行合并操作的阈值,默认16000000
set hive.merge.smallfiles.avgsize=16000000;

Hadoop Archive(HAR)

Hadoop Archive是一种特殊的归档格式,Hadoop Archive映射到文件系统目录,一个HAR是以扩展名 .har结尾 ,一个HAR目录包含元数据(以_index和_masterindex的形式)和data(part-*)文件。_index文件包含文件名称,这些文件是归档的一部分,并且包含这些文件在归档中的位置。
Hadoop Archive是一个高效地将小文件放入HDFS块中的文件存档工具,它能将多个小文件打包成一个HAR文件,这样在减少NameNode内存使用的同时,仍然允许对文件进行透明的访问。

使用hadoop命令进行文件归档

   hadoop archive -archiveName name -p <parent> <src>* <dest>

hadoop archive -archiveName zoo.har -p /foo/bar /outputdir

可以通过设置 -Dhar.block.size参数来指定HAR的大小。

在Hive中进行归档处理
Hive支持将已存的分区转换为HAR,从而使得分区下的文件数目大大减少。但是从HAR读数据需要额外的开销,因此查询归档下数据可能会变慢。

   sethive.archive.enabled=true;sethive.archive.har.parentdir.settable=true;sethar.partfile.size=1099511627776;ALTERTABLEtest ARCHIVEPARTITION(year='2017');ALTERTABLEtest UNARCHIVEPARTITION(year='2017');

如果不是分区表,可以创建成外部表,使用 har://协议来指定路径。

SequenceFile

SequenceFile是一个由二进制序列化过的key/value字节流组成的文本存储文件,它可以在map/reduce过程中的input/output的format时被使用。在map/reduce过程中,map处理文件的临时输出就是使用SequenceFile处理过的。

使用SequenceFile作为表存储格式。

   createtabletest2
STOREDASSEQUENCEFILEASSELECT*FROMtest;

控制reducer个数

为了提升MR的运算速度,可以通过增加reducer的个数,Hive也会做类似的优化,Reducer数量等于源数据量除以 hive.exec.reducers.bytes.per.reducer所配置的量(默认是1G)。Reducer的数量决定了结果文件的数量。所以在合适的情况下控制reducer的数量,可以实现减少小文件数量。

reducer决定因素:

  • hive.exec.reducers.bytes.per.reducer:这个参数控制一个job会有多少个reducer来处理,依据的是输入文件的总大小。默认1GB。

  • hive.exec.reducers.max:这个参数控制最大的reducer的数量, 如果 input / bytes per reduce > max 则会启动这个参数所指定的reduce个数。  这个并不会影响 mapre.reduce.tasks参数的设置。默认的max是999。

  • mapred.reduce.tasks:这个参数如果指定了,hive就不会用它的estimation函数来自动计算reduce的个数,而是用这个参数来启动reducer。默认是-1.

在hive中可以通过调整上面三个参数实现控制reducer的个数。


—————END—————



喜欢本文的朋友们,欢迎长按下图关注订阅号DigNew,收看更多精彩内容


相关 [大数据 hadoop 文件] 推荐:

大数据-Hadoop小文件问题解决方案

- - IT瘾-geek
HDFS中小文件是指文件size小于HDFS上block(. dfs.block.size)大小的文件. 大量的小文件会给Hadoop的扩展性和性能带来严重的影响. 动态分区插入数据,产生大量的小文件,从而导致map数量剧增. reduce数量越多,小文件也越多,reduce的个数和输出文件个数一致.

大数据架构hadoop

- - CSDN博客云计算推荐文章
摘要:Admaster数据挖掘总监 随着互联网、移动互联网和物联网的发展,谁也无法否认,我们已经切实地迎来了一个海量数据的时代,数据调查公司IDC预计2011年的数据总量将达到1.8万亿GB,对这些海量数据的分析已经成为一个非常重要且紧迫的需求. 随着互联网、移动互联网和物联网的发展,谁也无法否认,我们已经切实地迎来了一个海量数据的时代,数据调查公司IDC预计2011年的数据总量将达到1.8万亿GB,对这些海量数据的分析已经成为一个非常重要且紧迫的需求.

hadoop多文件输出

- - CSDN博客云计算推荐文章
现实环境中,常常遇到一个问题就是想使用多个Reduce,但是迫于setup和cleanup在每一个Reduce中会调用一次,只能设置一个Reduce,无法是实现负载均衡. 问题,如果要在reduce中输出两种文件,一种是标志,另一种是正常业务数据,实现方案有三种:. (1)设置一个reduce,在reduce中将数据封装到一个集合中,在cleanup中将数据写入到hdfs中,但是如果数据量巨大,一个reduce无法充分利用资源,实现负载均衡,但是如果数据量较小,可以使用.

Hadoop掀起大数据革命 三巨头齐发力

- - 慕容鱼吐的新闻泡
导读:开源的数据处理平台凭借其低成本、高扩展性和灵活性的优势已经赢得了多数网络巨头的认可. 现在Hadoop将进入更多企业. IBM将在明年推出内置NoSQL技术的DB2旗舰级数据库管理系统. 上个月Oracle和Microsoft也分别透露了将计划在明年发布基于Hadoop的产品. 两家公司都计划提供协助部署服务和企业级支持.

大数据框架hadoop的序列化机制

- - ITeye博客
       对象的序列化(Serialization)用于将对象编码成一个字节流,以及从字节流中重新构建对象. “将一个对象编码成一个字节流”称为序列化该对象(Serializing);相反的处理过程称为反序列化(Deserializing). 1.1              Java内建序列化机制.

如何挑选合适的大数据或Hadoop平台

- - 互联网旁观者
今年,大数据在很多公司都成为相关话题. 虽然没有一个标准的定义来解释何为 “大数据”,但在处理大数据上,Hadoop已经成为事实上的标准. IBM、Oracle、SAP、甚至Microsoft等几乎所有的大型软件提供商都采用了Hadoop. 然而,当你已经决定要使用Hadoop来处理大数据时,首先碰到的问题就是如何开始以及选择哪一种产品.

hadoop多文件格式输入

- - CSDN博客云计算推荐文章
hadoop多文件格式输入,一般可以使用MultipleInputs类指定不同的输入文件路径以及输入文件格式. 现在需要把user和phone按照phone number连接起来,得到下面的结果:. 那么就可以使用MultipleInputs来操作,这里把user和phone上传到hdfs目录中,分别是/multiple/user/user , /multiple/phone/phone.

Oracle大数据机和连接器产品支持与Hadoop和Cloudera Manager集成

- - InfoQ cn
Oracle大数据机和大数据连接器软件支持与Hadoop、Cloudera Manager以及Oracle NoSQL数据库的集成. 上月Oracle 宣布携手Cloudera进军大数据机和连接器软件领域. 大数据机融合了Cloudera公司的 Apache Hadoop(CDH)和 Cloudera Manager管理应用,以及一个开源统计性编程语言 R.

自学大数据:用以生产环境的Hadoop版本比较

- - CSDN博客云计算推荐文章
生产环境中,hadoop的版本选择是一个公司架构之时,很重要的一个考虑因素. 这篇文章根据就谈谈现在主流的hadoop版本的比较. 如果有不同意见,或者指正,希望大家能交流. Apache Hadoop:Apache Hadoop是一款支持数据密集型分布式应用并以Apache 2.0许可协议发布的开源软件框架.

hadoop 处理不同的输入文件,文件关联

- - CSDN博客云计算推荐文章
file1和file2进行关联,想要的结果:. 2、将file1的key、value颠倒 ;file1和file2的key相同,file1的value做key,file2的value做value ,输出. if("file1".equals(fileName)){//加标记. // 设置Map和Reduce处理类.