大数据Hadoop之——HDFS小文件问题与处理实战操作

目录

一、背景

每个文件均按块存储,每个块的元数据存储在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 ArchiveSequence fileCombineFileInputFormat,除了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之间。

<property>
    <name>mapreduce.job.jvm.numtasks</name>
    <value>10</value>
    <description>How many tasks to run per jvm,if set to -1 ,there is  no limit</description>
</property> 

5)合并本地的小文件,上传到 HDFS(appendToFile )

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

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

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

三、HDFS小文件问题处理实战操作

1)通过Hadoop Archive(HAR)方式进行合并小文件

在本地准备2个小文件:

cat >user1.txt<<EOF
1,tom,male,16
2,jerry,male,10
EOF

cat >user2.txt<<EOF
101,jack,male,19
102,rose,female,18
EOF

将文件put上hdfs

hdfs dfs -mkdir -p /foo/bar
hdfs dfs -put user*.txt /foo/bar/

进行合并

# 【用法】hadoop archive -archiveName  归档名称 -p 父目录 [-r <复制因子>]  原路径(可以多个)  目的路径
# 合并/foo/bar目录下的文件,输出到/outputdir
hadoop archive -archiveName user.har -p /foo/bar /outputdir

# 执行该命令后,原输入文件不会被删除,需要手动删除
hdfs dfs -rm -r /foo/bar/user*.txt

在这里插入图片描述


查看 yarn 任务:http://local-168-182-110:8088/

在这里插入图片描述


查看har文件

# 查看har合并文件
hdfs dfs -ls /outputdir/user.har
hdfs dfs -ls ///outputdir/user.har
hdfs dfs -ls hdfs://local-168-182-110:8082/outputdir/user.har

# 查看har里的文件
hdfs dfs -ls har:/outputdir/user.har
hdfs dfs -ls har:///outputdir/user.har
hdfs dfs -ls har://hdfs-local-168-182-110:8082/outputdir/user.har

在这里插入图片描述

解压har文件

# 按顺序解压存档(串行)
hdfs dfs -cp har:///outputdir/user.har /outputdir/newdir
# 查看
hdfs dfs -ls /outputdir/newdir

# 要并行解压存档,请使用DistCp,会提交MR任务进行并行解压
hadoop  distcp har:///outputdir/user.har  /outputdir/newdir2
# 查看
hdfs dfs -ls /outputdir/newdir2

在这里插入图片描述

【温馨提示】眼尖的小伙伴,可以已经发现了一个问题,就是cp串行解压,会在解压的目录下保留har文件。

Archive注意事项:

  • Hadoop archives是特殊的档案格式, 扩展名是*.har;
  • 创建archives本质是运行一个Map/Reduce任务,所以应该在Hadoop集群运行创建档案的命令;
  • 创建archive文件要消耗和原文件一样多的硬盘空间;
  • archive文件不支持压缩
  • archive文件一旦创建就无法改变,要修改的话,需要创建新的archive文件;
  • 当创建archive时,源文件不会被更改或删除

2)合并本地的小文件,上传到 HDFS(appendToFile )

在本地准备2个小文件:

cat >user1.txt<<EOF
1,tom,male,16
2,jerry,male,10
EOF

cat >user2.txt<<EOF
101,jack,male,19
102,rose,female,18
EOF

合并方式:

hdfs dfs -appendToFile user1.txt user2.txt /test/upload/merged_user.txt

# 查看
hdfs dfs -cat /test/upload/merged_user.txt

在这里插入图片描述

web HDFS: http://local-168-182-110:9870/explorer.html#/

在这里插入图片描述

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

# 先上传小文件到 HDFS:
hdfs dfs -put user1.txt user2.txt /test/upload
# 下载,同时合并:
hdfs dfs -getmerge /test/upload/user*.txt ./merged_user.txt

在这里插入图片描述

4)针对Hive表小文件数合并处理(CombineFileInputFormat)

1、输入阶段合并

  • 需要更改Hive的输入文件格式即参hive.input.format,默认值是org.apache.hadoop.hive.ql.io.HiveInputFormat我们改成org.apache.hadoop.hive.ql.io.CombineHiveInputFormat

  • 这样比起上面对mapper数的调整,会多出两个参数是mapred.min.split.size.per.nodemapred.min.split.size.per.rack,含义是单节点和单机架上的最小split大小。如果发现有split大小小于这两个值(默认都是100MB),则会进行合并。具体逻辑可以参看Hive源码中的对应类。

2、输出阶段合并

  • 直接将hive.merge.mapfileshive.merge.mapredfiles都设为true即可,前者表示将map-only任务的输出合并,后者表示将map-reduce任务的输出合并,Hive会额外启动一个mr作业将输出的小文件合并成大文件。

  • 另外,hive.merge.size.per.task可以指定每个task输出后合并文件大小的期望值,hive.merge.size.smallfiles.avgsize可以指定所有输出文件大小的均值阈值,默认值都是1GB。如果平均大小不足的话,就会另外启动一个任务来进行合并。


HDFS小文件过多问题与处理实战操作就先到这里了,其实企业里基本上都是通过程序或者脚本去处理,这里只是通过命令去演示,其实原理都一样,只是客户端不一样,后面有时间单独会讲程序或者脚本去处理小文件,有疑问的小伙伴欢迎给我留言哦~

原文地址:https://www.cnblogs.com/liugp/p/16610549.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


hadoop搭建准备工作三台虚拟机:master、node1、node2检查时间是否同步:date检查java的jdk是否被安装好:java-version修改主机名三台分别执行vim/etc/hostname并将内容指定为对应的主机名 关闭防火墙:systemctlstopfirewalld   a.查看防火墙状态:systemctlstatu
文件的更名和移动:    获取文件详细信息       遇到的问题:不能直接在web上上传文件。   权限问题:修改后即可正常创建  参考:https://blog.csdn.net/weixin_44575660/article/details/118687993
目录一、背景1)小文件是如何产生的?2)文件块大小设置3)HDFS分块目的二、HDFS小文件问题处理方案1)HadoopArchive(HAR)2)Sequencefile3)CombineFileInputFormat4)开启JVM重用5)合并本地的小文件,上传到HDFS(appendToFile)6)合并HDFS的小文件,下载到本地(getmerge)三、HDFS小文件问题处理实战操
目录一、概述二、HadoopDataNode多目录磁盘配置1)配置hdfs-site.xml2)配置详解1、dfs.datanode.data.dir2、dfs.datanode.fsdataset.volume.choosing.policy3、dfs.datanode.available-space-volume-choosing-policy.balanced-space-preference-fraction4、dfs.datanode.available
平台搭建(伪分布式)伪分布式搭建在VM中搭建std-master修改配置文件centos7-cl1.vmdkstd-master.vmx-将配置文件中vm的版本号改成自己电脑对应的vm版本修改客户端的操作系统为centos764位打开虚拟机修改虚拟机网络cd/etc/sysconfigetwork-scripts
 一、HDFS概述 1.1、HDFS产出背景及定义 1.1.1、HDFS产生背景   随着数据量越来越大,在一个操作系统存不下所有的数据,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统。HDFS只是分布式
配置workers进入hadoop/etc/hadoop  编辑workers文件  然后分发给另外两个服务器     准备启动集群第一次需要初始化.  初始化完成后增加了data文件,  进入上面那个路径,就能看到当前服务器的版本号  启动HDFS  启动完毕102  
这周我对ssm框架进行了更深一步的开发,加入了多用户,并对除登录外的请求进行了拦截,这样用户在未登录的时候是访问不到资源的。并且对hadoop进行了初步的学习,包括虚拟机的安装等等。下周会对hadoop进行更深一步的学习,加油! 
前言通过在Hadoop1安装Hadoop,然后配置相应的配置文件,最后将Hadoop所有文件同步到其他Hadoop节点。一、集群规划#主机名‘master/hadoop1’‘slave01/hadoop2’‘slave02/hadoop3’#启动节点NamenodeNodemanagerNodemanager
1.先杀死进程(先进入到hadoop版本文件里,我的是/opt/module/hadoop-3.1.3/)sbin/stop-dfs.sh2.删除每个集群上的data以及logsrm-rfdata/logs/3.格式化hdfsnamenode-format4.再启动sbin/sart-dfs.sh
查看文件目录的健康信息执行如下的命令:hdfsfsck/user/hadoop-twq/cmd可以查看/user/hadoop-twq/cmd目录的健康信息:其中有一个比较重要的信息,就是Corruptblocks,表示损坏的数据块的数量查看文件中损坏的块(-list-corruptfileblocks)[hadoop-twq@master~]
titlecopyrightdatetagscategoriesHadoop2.8.0的环境搭建true2019-08-0912:12:44-0700LiunxHadoopLiunxHadoop此文为在centos7下安装Hadoop集群前期准备Hadoop下载Hadoop的下载本文下载的是2.8.0版本的Hadoop安装3个虚拟机并实现ssh免密码的登录
这是我的地图publicstaticclassMapClassextendsMapper<LongWritable,Text,Text,Text>{publicvoidmap(LongWritablekey,Textvalue,Contextcontext)throwsIOException,InterruptedException{String[]fields=value.toString().s
组件:Hadoop三大核心组件:HDFS(HadoopDistributedFileSystem):分布式文件系统,数据存放在这里,提供对应用程序数据的高吞吐量访问。YARN(YetAnotherResourceNegotiator):资源管理调度系统,分配比如硬盘内存等资源。用这些资源来运行程序的计算MapReduce:分布式运算框架
查看Hadoop安全模式hadoopdfsadmin-safemodegetSafemodeisOFF进入Hadoop安全模式root@centos:/$hadoopdfsadmin-safemodeenter SafemodeisON推出安全模式nange@ubuntu:/$hadoopdfsadmin-safemodeleave SafemodeisOFF
当我尝试运行sqoop命令时,我收到错误,说没有连接字符串的管理器我尝试运行的内容:sqoopexport--connect"jdbc:vertica://xxxxxxxx.com:5433/PPS_GIIA"--usernamexxxxx--passwordxxxxx--tableCountry-m1--export-dir/Eservices/SIPOC/SQLimport/part-m-0000--
好程序员大数据学习路线Hadoop学习干货分享,ApacheHadoop为可靠的,可扩展的分布式计算开发开源软件。ApacheHadoop软件库是一个框架,它允许使用简单的编程模型跨计算机群集分布式处理大型数据集(海量的数据)。包括这些模块:HadoopCommon:支持其他Hadoop模块的常用工具。Hadoop
我正在使用java,我正在尝试编写一个mapreduce,它将接收一个包含多个gz文件的文件夹.我一直在寻找,但我发现的所有教程都放弃了如何处理简单的文本文件,但没有找到解决我问题的任何东西.我在我的工作场所问过,但只提到scala,我并不熟悉.任何帮助,将不胜感激.解决方法:Hadoop检查
linux下开机自启:在/etc/init.d目录下新建文件elasticsearch并敲入shell脚本:#!/bin/sh#chkconfig:23458005#description:elasticsearchexportJAVA_HOME=/home/hadoop/jdk/jdk1.8.0_172exportJAVA_BIN=/home/hadoop/jdk/jdk1.8.0_172/binexportPATH=$PATH:$JAVA_HOME/bi
离线数据处理的主要工具Hive是必须极其熟练地掌握和精通的,但Hive背后是Hadoop的HDFS和M叩Reduce,需要会MapReduce编程么?从笔者的工作实践以及了解来看,这不是必须掌握的,但是数据开发人员必须掌握其概念、架构和工作原理,也就是说,不但要知其然,而且要知其所以然。1.起源