vlambda博客
学习文章列表

大数据平台中HDFS组件上传小文件数过多导致大数据平台夯死问题的解决

问题描述

大数据平台中HDFS组件上传小文件数过多导致大数据平台夯死问题的解决

 

问题分析

根据客户业务情景,需要上传海量的小文件,小文件包含PDF、jpg等格式。此应用场景后端对接存储比较适合对象存储(存储桶COS),建议客户后期将应用后端对接到对象存储上,既方便应用的存取又可以存储海量应用数据。

 

针对HDFS的应用场景对存放海量小文件是不友好的,因为1个小文件大小大约1MB-20MB,而HDFS1个Block的存储大小为128MB,无论1个小文件多大都会占用1个Block块。这样海量的小文件会大量占用HDFS的Block块,实际1个小文件又会占用3个Block存储空间。当小文件数过多时,数据节点DN是扛不住的,最终会导致应用程序写不进数据,平台不可用。

 

获取hdfs用户的认证信息:

getkey.py  hdfs  hadoop

export hadoop_security_authentication_secureid=

export hadoop_security_authentication_securekey=

export hadoop_security_authentication_username=

 

登录控制节点NN上,测试可执行Hadoop指令:

hadoop fs  -ls /

上传1个文件做测试:

hadoop fs  -put xxxtest.doc /temp

查看文件

hadoop fs  -ls  /temp/xxxtest.doc

造1个2GB的大文件做测试

truncate -s 2G  test.zip

du -sh ./*

hadoop fs  -put test.zip /temp

hadoop fs  -ls  /temp/

hadoop fs  -get  /temp/test.zip  /temp

针对单个小文件或者大文件,做上传、下载操作时,都是正常的。但是应用程序是大批量上传海量小文件,上传时就会失败报错,上传失败。

 

【解决方法】

解决方向大致有4个方向:

1、HDFS集群扩容(因为扩容周期和应用场景暂不考虑)

2、归档保存(Hadoop Archive 定期归档一下,建议定期做归档)

3、应用后端存储转移对接到 对象存储-存储桶

4、临时解决方案,若客户对历史数据可接受1副本的丢数据的风险,针对原先历史数据做降副本操作,可以临时解决当前应用程序无法上传的

 

针对4中临时解决方案,具体方法如下:

先用测试数据,做用例测试,测试通过后,再针对生产环境中的一小部分历史数据进行变更,变更结束后,应用侧验证无误后,最后对全量历史数据分批次进行变更,分批次变更是为了减小HDFS数据均衡的压力

A、变更前查看源文件属性,副本数为3

hdfs  fsck  /temp/test.zip

结果显示:

Default replication factor: 3 (系统默认副本数)

Average block replication: 1 (实际设置副本数)

 

B、文件副本数设置为1

hadoop  fs -setrep 1 /temp/test.zip

文件副本数设置为3(示例)

hadoop  fs -setrep 3 /temp/test.zip

 

C、变更后查看源文件属性,副本数为1

hdfs  fsck  /temp/test.zip

 

【问题结论】

在客户应用程序开发部署前,售前架构师应该对客户应用场景做充分得调研和了解,给出合理的规划,避免因应用需求和场景匹配不合理,造成后期维护吃力,甚至返工的尴尬局面。针对应用场景中海量存放小文件的需求,建议后端存储使用存储桶来对接解决

 

【知识点补充】

HDFS页面显示:

DFS硬盘使用,指的是所有DN节点组成的存储池的使用量

Blocks(total),是指1份数据所占用的block块

Datanodes页面中,Blocks是指实际多副本数据所占用的block块

用户在上传下载文件时,要先进行用户认证才能正常执行hadoop的指令

 

【问题描述1】

在客户端服务器上执行hdfs fsck /temp/test.zip 时报相关文件权限问题,permission denied的中文意思为:拒绝访问。即为没有对应的执行权限/usr/xxx/hadoop/bin/hadoop:line 25:exec:/usr/xxx/hadoop-hdfs/bin/hdfs:can not execute:Permission denied

【问题分析】

1、用户权限问题

2、文件权限问题

【解决方法】

检查客户端服务器上执行hadoop指令时,是否进行认证操作了

export hadoop_security_authentication_secureid=

export hadoop_security_authentication_securekey=

export hadoop_security_authentication_username=

检查客户端服务器上hadoop相关客户端,脚本执行权限,赋予执行权限

chmod  +x  *.sh

 

【问题描述2】

在客户端服务器上执行上传大量文件时,报文件打开数过多的异常错误。java.io.IOException:

Failed on local exception:java.net.SocketException:Too many open file;

【问题分析】

这是客户端服务器自身 能够打开的文件数限制造成的。

操作系统在打开文件时会临时分配一个叫文件句柄(file handle)来进行访问,为文件句柄保留一个特殊内存区域,该区域的大小决定了可以同时打开多少个文件,限制了shell可以同时打开的文件句柄的数量

为何限制打开文件的数目?

因为操作系统需要内存来管理每个文件,所以要对可以打开的文件数进行限制

 

在Linux下,有两种限制:软限制是指时候都可以更改的值,

硬限制:设置软限制不能超过的最大值

可以在Linux系统上看到打开的文件描述符的最大数量,如下所示:

cat /proc/sys/fs/file-max

100xxx

这个值显示用户每次登录会话可以打开的文件数,注意根据系统,结果可能不同

【解决方法】

1)ulimit命令

ulimit命令可用于增加在shell中打开的文件数量,此命令是bash命令,因此它仅影响bash和从它启动的程序

-a (当前设置):ulimit报告它当前设置

-f (文件限制)限制由shell创建的文件的数量

-n限制打开的文件描述符的数量

-H和-S (硬和软限制)选项修改其他选项,设置分别为硬限制或软限制,如果没有提供选项,那么ulimit为指定的特性设置硬限制和软限制

 

查看当前的限制

ulimit -a | grep open

open files (-n) 1024

 

检查硬限制:

ulimit -Hn

4096

 

检查软限制:

ulimit -Sn

1024

 

可以编辑限制

ulimit -n 3000

 

可以检查:

ulimit -n

3000


如果注销,并且登录或重新启动计算机,则值将重置。要让这些更改永久生效,需要编辑用户文件(.bashrc或.profile )或系统级配置文件(/etc/bashrc或/etc/profile )配置

vim .bash_profile

ulimit -n 3000

现在即使重新启动,用户设置的更改已经永久生效了


2)可插拔认证模块(PAM )模块

最好通过一个名为pam_limits的可插入身份验证模块(PAM)模块来更改此类限制。大多数主要Linux发行版都使用这个模块作为标准PAM配置的一部分,需要通过编辑/etc/security/limits.conf文件来配置

domain:描述限制所适用的实体。它可以是一个用户名,一个组名(使用@groupname)或Asterisk (* ))通配符,匹配每个人

type:此字段为硬或软限制

item :它指定要限制的项的类型

value:它指定应用于限制的值

编辑用户打开的文件的最大数量,例如,在文件末尾添加以下几行:

vim /etc/security/limits.conf

* hard nofile 20000

* soft nofile 15000

需要编辑文件/etc/pam.d/login#

vim /etc/pam.d/login

session required pam_limits.so

检查结果:

ulimit -Hn

20000

 

3)系统范围限制

通过编辑/etc/sysctl.conf或编辑指令fs.file-max来增加Linux中打开文件的限制

使用以下命令查看打开的文件的当前值

cat /proc/sys/fs/file-max

100576

按如下所示编辑默认值:

sysctl -w fs.file-max=250000

fs.file-max = 250000

检查结果

cat /proc/sys/fs/file-max

250000

要使配置永久化,直接编辑/etc/sysctl.conf文件,如下所示:

vim /etc/sysctl.conf

fs.file-max=250000

还需要使用sysctl命令的-p选项直接应用更改,如下所示:

sysctl -p

fs.file-max = 250000

配置即永久生效了


写在最后:

神话是人生的隐喻,每个人身上,都隐藏着自己独特的英雄力量(神话学大师 坎贝尔)

你每天学习一点点,每天只进步1%,一年以后你的水平值是多少呢?
37.78(1.01×365=37.78)
相信概率,不要相信运气,在过程中提升概率