大数据Hadoop之 您所在的位置:网站首页 hdfsls排序 大数据Hadoop之

大数据Hadoop之

2023-03-16 22:01| 来源: 网络整理| 查看: 265

文章目录 一、背景1)小文件是如何产生的?2)文件块大小设置3)HDFS分块目的 二、HDFS小文件问题处理方案1)Hadoop Archive(HAR)2)Sequence file3)CombineFileInputFormat4)开启JVM重用5)合并本地的小文件,上传到 HDFS(appendToFile )6)合并 HDFS 的小文件,下载到本地(getmerge) 三、HDFS小文件问题处理实战操作1)通过Hadoop Archive(HAR)方式进行合并小文件2)合并本地的小文件,上传到 HDFS(appendToFile )3)合并 HDFS 的小文件,下载到本地(getmerge)4)针对Hive表小文件数合并处理(CombineFileInputFormat)1、输入阶段合并2、输出阶段合并

一、背景

每个文件均按块存储,每个块的元数据存储在NameNode的内存中,因此HDFS存储小文件会非常低效。因为大量的小文件会耗尽NameNode中的大部分内存。但注意,存储小文件所需要的磁盘容量和数据块的大小无关。每个块的大小可以通过配置参数(dfs.blocksize)来规定,默认的大小128M。例如,一个1MB的文件设置为128MB的块存储,实际使用的是1MB的磁盘空间,而不是128MB。

Hadoop 高可用环境部署,可参考我之前的文章:大数据Hadoop之——Hadoop 3.3.4 HA(高可用)原理与实现(QJM)

1)小文件是如何产生的? 动态分区插入数据,产生大量的小文件,从而导致 map 数量剧增;reduce 数量越多,小文件也越多,reduce 的个数和输出文件个数一致;数据源本身就是大量的小文件; 2)文件块大小设置

同样对于如何设置每个文件块的大小,官方给出了这样的建议:

所以对于块大小的设置既不能太大,也不能太小,太大会使得传输时间加长,程序在处理这块数据时会变得非常慢,如果文件块的大小太小的话会增加每一个块的寻址时间。所以文件块的大小设置取决于磁盘的传输速率。

3)HDFS分块目的

HDFS中分块可以减少后续中MapReduce程序执行时等待文件的读取时间,HDFS支持大文件存储,如果文件过大10G不分块在读取时处理数据时就会大量的将时间耗费在读取文件中,分块可以配合MapReduce程序的切片操作,减少程序的等待时间。

二、HDFS小文件问题处理方案

HDFS中文件上传会经常有小文件的问题,每个块大小会有150字节的大小的元数据存储namenode中,如果过多的小文件每个小文件都没有到达设定的块大小,都会有对应的150字节的元数据,这对namenode资源浪费很严重,同时对数据处理也会增加读取时间。对于小文件问题,Hadoop本身也提供了几个解决方案,分别为:Hadoop Archive,Sequence file和CombineFileInputFormat,除了hadoop本身提供的方案,当然还有其它的方案,下面会详细讲解。

1)Hadoop Archive(HAR)

Hadoop Archive(HAR) 是一个高效地将小文件放入HDFS块中的文件存档工具,它能够将多个小文件打包成一个HAR文件,这样在减少namenode内存使用的同时,仍然允许对文件进行透明的访问。

【示例】对某个目录/foo/bar下的所有小文件存档成/outputdir/zoo.har:

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

当然,也可以指定HAR的大小(使用-Dhar.block.size)。

HAR是在Hadoop file system之上的一个文件系统,因此所有fs shell命令对HAR文件均可用,只不过是文件路径格式不一样,HAR的访问路径可以是以下两种格式:

# scheme-hostname格式为hdfs-域名:端口,如果没有提供scheme-hostname,它会使用默认的文件系统。这种情况下URI是这种形式: har://scheme-hostname:port/archivepath/fileinarchive har:///archivepath/fileinarchive

可以这样查看HAR文件存档中的文件:

hdfs dfs -ls har:///user/zoo/foo.har 输出: har:///user/zoo/foo.har/hadoop/dir1 har:///user/zoo/foo.har/hadoop/dir2

使用HAR时需要注意两点:

对小文件进行存档后,原文件并不会自动被删除,需要用户自己删除;创建HAR文件的过程实际上是在运行一个mapreduce作业,因而需要有一个hadoop集群运行此命令。

此外,HAR还有一些缺陷:

一旦创建,Archives便不可改变。要增加或移除里面的文件,必须重新创建归档文件。要归档的文件名中不能有空格,否则会抛出异常,可以将空格用其他符号替换(使用-Dhar.space.replacement.enable=true 和-Dhar.space.replacement参数)。不支持修改 2)Sequence file Sequence file由一系列的二进制key/value组成,如果为key小文件名,value为文件内容,则可以将大批小文件合并成一个大文件。Hadoop-0.21.0中提供了SequenceFile,包括Writer,Reader和SequenceFileSorter类进行写,读和排序操作。如果hadoop版本低于0.21.0的版本。

和 HAR 不同的是,这种方式还支持压缩。该方案对于小文件的存取都比较自由,不限制用户和文件的多少,但是 SequenceFile 文件不能追加写入,适用于一次性写入大量小文件的操作。也是不支持修改的。

3)CombineFileInputFormat

CombineFileInputFormat是一种新的inputformat,用于将多个文件合并成一个单独的split,在map和reduce处理之前组合小文件。

4)开启JVM重用

有小文件场景时开启JVM重用;如果没有产生小文件,不要开启JVM重用,因为会一直占用使用到的task卡槽,直到任务完成才释放。 JVM重用可以使得JVM实例在同一个job中重新使用N次,N的值可以在Hadoop的mapred-site.xml文件中进行配置。通常在10-20之间。

mapreduce.job.jvm.numtasks 10 How many tasks to run per jvm,if set to -1 ,there is no limit 5)合并本地的小文件,上传到 HDFS(appendToFile )

将本地的多个小文件,上传到 HDFS,可以通过 HDFS 客户端的 appendToFile 命令对小文件进行合并。

6)合并 HDFS 的小文件,下载到本地(getmerge)

可以通过 HDFS 客户端的 getmerge 命令,将很多小文件合并成一个大文件,然后下载到本地。

三、HDFS小文件问题处理实战操作 1)通过Hadoop Archive(HAR)方式进行合并小文件

在本地准备2个小文件:

cat >user1.txt


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有