1.HDFS前言
HDFS:Hadoop Distributed File System Hadoop 分布式文件系统,主要用来解决海量数据的存储问题
- 设计思想:分而治之,即将大文件,大批量文件,分布式的存放于大量服务器上。以便于采取分而治之的方式对海量数据进行运算分析。
2.在大数据系统架构中的应用:为各类分布式运算框架(MapReduce,Spark,Tez,Flink,…)提供数据存储服务。
- 重点概念:数据块/副本,负载均衡,心跳机制,副本存放策略,元数据/元数据管理,安全模式,机架感知…
2.HDFS相关概念和特性
2.1.HDFS设计思路
HDFS 被设计成用来使用低廉的服务器来进行海量数据的存储,那是怎么做到的呢?
1.大文件被切割成小文件,使用分而治之的思想让很多服务器对同一个文件进行联合管理
- 每个小文件做冗余备份,并且分散存到不同的服务器,做到高可靠不丢失
2.2.HDFS架构
主节点 Namenode:集群老大,掌管文件系统目录树,处理客户端读且请求
SecondaryNamenode:严格说并不是 namenode 备份节点,主要给 namenode 分担压力之用
从节点 Datanode:存储整个集群所有数据块,处理真正数据读写
2.3.概念和特性
首先,它是一个文件系统,用于存储文件,通过统一的命名空间——目录树来定位文件。其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器都有各自清晰的角色定位。
重要特性如下:
1.HDFS 中的文件在物理上是分块存储(block),块的大小可以通过配置参数(dfs.blocksize)来规定,默认大小在 hadoop2.x 版本中是 128M,老版本中是 64M,hadoop3.x版本中是256M。
2.HDFS 文件系统会给客户端提供一个统一的抽象目录树,客户端通过路径来访问文件,形如:
hdfs://namenode:port/dir-a/dir-b/dir-c/file.data
hdfs://hadoop02:9000/soft/hadoop-2.6.5-centos-6.7.tar.gz
3.目录结构及文件分块位置信息(元数据)的管理由 namenode 节点承担,namenode 是 HDFS 集群主节点,负责维护整个 hdfs 文件系统的目录树,以及每一个路径(文件)所对应的 block 块信息(block 的 id,及所在的 datanode 服务器)。
4.文件的各个 block 的存储管理由 datanode 节点承担,datanode 是 HDFS 集群从节点,每一个 block 都可以在多个 datanode 上存储多个副本(副本数量也可以通过参数设置 dfs.replication,默认是 3)。
5.HDFS 是设计成适应一次写入,多次读出的场景,且不支持文件的修改。
(PS:适合用来做数据分析,并不适合用来做网盘应用,因为,不便修改,延迟大,网络开销大,成本太高)
3.HDFS优缺点
3.1.HDFS优点
1.可构建在廉价机器上:通过多副本提高可靠性,提供了容错和恢复机制
2.高容错性:数据自动保存多个副本,副本丢失后,自动恢复
3.适合批处理:移动计算而非数据,数据位置暴露给计算框架
4.适合大数据处理:GB、TB、甚至 PB 级数据,百万规模以上的文件数量,10K+节点规模
5.流式文件访问:一次性写入,多次读取,保证数据一致性
3.2.HDFS缺点
不适于以下操作:
低延迟数据访问:比如毫秒级,低延迟与高吞吐率
小文件存取:占用 NameNode 大量内存 150b* 1000W = 15E,1.5G,寻道时间超过读取时间
并发写入、文件随机修改:一个文件只能有一个写者,仅支持 append
HDFS 不适合存储小文件:
元信息存储在 NameNode 内存中:一个节点的内存是有限的
存取大量小文件消耗大量的寻道时间:类比拷贝大量小文件与拷贝同等大小的一个大文件
NameNode 存储 block 数目是有限的:一个 block 元信息消耗大约 150 byte 内存,存储 1 亿个 block,大约需要 20GB 内存,如果一个文件大小为 10K,则 1 亿个文件大小仅为 1TB(但要消耗掉 NameNode 20GB内存)。
4.HDFS的shell(命令行客户端)操作
HDFS 提供 shell 命令行客户端,使用方法如下:
HDFS 支持的其他命令行参数如下:
[-appendToFile … ][-cat [-ignoreCrc] …][-checksum …][-chgrp [-R] GROUP PATH…][-chmod [-R] PATH…][-chown [-R] [OWNER][:[GROUP]] PATH…][-copyFromLocal [-f] [-p] … ][-copyToLocal [-p] [-ignoreCrc] [-crc] … ][-count [-q] …][-cp [-f] [-p] … ][-createSnapshot []][-deleteSnapshot ][-df [-h] [ …]][-du [-s] [-h] …][-expunge][-get [-p] [-ignoreCrc] [-crc] … ][-getfacl [-R] ][-getmerge [-nl] ][-help [cmd …]][-ls [-d] [-h] [-R] [ …]][-mkdir [-p] …][-moveFromLocal … ][-moveToLocal ][-mv … ][-put [-f] [-p] … ][-renameSnapshot ][-rm [-f] [-r|-R] [-skipTrash] …][-rmdir [–ignore-fail-on-non-empty] …][-setfacl [-R] [{-b|-k} {-m|-x } ]|[–set ]][-setrep [-R] [-w] …][-stat [format] …][-tail [-f] ][-test -[defsz] ][-text [-ignoreCrc] …][-touchz …][-usage [cmd …]]常用命令参数介绍:-help
功能:输出这个命令参数手册
[hadoop@hadoop02 ~]$ hadoop -help
[hadoop@hadoop02 ~]$ hadoop fs -help
[hadoop@hadoop02 ~]$ hadoop fs -help ls
-ls
功能:显示目录信息
示例: hadoop fs -ls hdfs://hadoop02:9000/
备注:这些参数中,所有的 hdfs 路径都可以简写成 hadoop fs -ls / 等同上条命令的效果
-mkdir
功能:在 hdfs 上创建目录
示例:hadoop fs -mkdir -p /aa/bb/cc/dd
-put
功能:等同于 copyFromLocal,进行文件上传
示例:hadoop fs -put /aaa/jdk.tar.gz /bbb/jdk.tar.gz.2
-get
功能:等同于 copyToLocal,就是从 hdfs 下载文件到本地
示例:hadoop fs -get /aaa/jdk.tar.gz
-getmerge
功能:合并下载多个文件
示例:比 getmerge 如 hdfs 的目录 /aaa/下有多个文件:log.1, log.2,log.3,…
hadoop fs -getmerge /aaa/log.* ./log.sum
-cp
功能:从 hdfs 的一个路径拷贝 hdfs 的另一个路径
示例: hadoop fs -cp /aaa/jdk.tar.gz /bbb/jdk.tar.gz.2
-mv
功能:在 hdfs 目录中移动文件
示例: hadoop fs -mv /aaa/jdk.tar.gz /
-rm
功能:删除文件或文件夹
示例:hadoop fs -rm -r /aaa/bbb/
-rmdir
功能:删除空目录
示例:hadoop fs -rmdir /aaa/bbb/ccc
-moveFromLocal
功能:从本地剪切到 hdfs
示例:hadoop fs – moveFromLocal /home/hadoop/a.txt /aa/bb/cc/dd
-moveToLocal
功能:从 hdfs 剪切到本地
示例:hadoop fs – moveToLocal /aa/bb/cc/dd /home/hadoop/a.txt
-copyFromLocal
功能:从本地文件系统中拷贝文件到 hdfs 文件系统去
示例:hadoop fs -copyFromLocal ./jdk.tar.gz /aaa/
-copyToLocal
功能:从 hdfs 拷贝到本地
示例:hadoop fs -copyToLocal /aaa/jdk.tar.gz
-appendToFile
功能:追加一个文件到已经存在的文件末尾
示例:hadoop fs -appendToFile ./hello.txt hdfs://hadoop-server01:9000/hello.txt
可以简写为:
hadoop fs -appendToFile ./hello.txt /hello.txt
-cat 功能:显示文件内容
hadoop fs -cat /hello.txt
-tail
功能:显示一个文件的末尾
示例:hadoop fs -tail /weblog/access_log.1
-text
功能:以字符形式打印一个文件的内容
示例:hadoop fs -text /weblog/access_log.1
-chgrp
-chmod
-chown
功能:linux 文件系统中的用法一样,对文件所属权限
示例:
hadoop fs -chmod 666 /hello.txt
hadoop fs -chown someuser:somegrp /hello.txt
-df
功能:统计文件系统的可用空间信息
示例:hadoop fs -df -h /
-du
功能:统计文件夹的大小信息
示例:hadoop fs -du -s -h /aaa/*
-count
功能:统计一个指定目录下的文件节点数量
示例:hadoop fs -count /aaa/
-setrep
功能:设置 hdfs 中文件的副本数量
示例:hadoop fs -setrep 3 /aaa/jdk.tar.gz
补充:查看 dfs 集群工作状态的命令
hdfs dfsadmin -report
5.HDFS的Java API操作
hdfs 在生产应用中主要是客户端的开发,其核心步骤是从 hdfs 提供的 api 中构造一个 HDFS的访问客户端对象,然后通过该客户端对象操作(增删改查)HDFS 上的文件。
5.1.利用eclipse查看hdfs集群的文件信息
1.下载一个 eclipse 开发工具 eclipse-jee-luna-SR1-win32-x86_64.zip
2.解压到一个文件夹 C:\myProgram\eclipse
3.把 hadoop-eclipse-plugin-2.6.5.jar 放入到 eclipse/plugins 文件夹下
4.双击启动 eclipse
5.将” windows 平台编译 hadoop-2.6.1.zip”解压到 windows 系统下一个文件夹下,文件夹的路径最好不要带中文。我的目录是:C:\myProgram\hadoop-2.6.1
6.打开了 eclipse 之后,点击 windows –> prefrences -> 会出现一个对话框。找到如图所示Hadoop MapReduce 选项:然后把你安装的 hadoop 路径配置上,就是上一步你解压的那个文件夹:C:\myProgram\hadoop-2.6.1
然后保存
7. 然后点击 windows -> show view -> other 在列表中找到图中这个东西:
然后双击
8. 会出现这么一个显示框,如下图
9.咱们点击红框中这个东西,会出现相应的这么一个对话框,修改相应的信息
10.填完以上信息之后,点击 finish 会出现:
11.最重要的时候在左上角的这个地方会出现:
5.HDFS核心设计
5.1.HDFS心跳机制(heartbeat)
1.Hadoop 是 Master/Slave 结构,Master 中有 NameNode 和 ResourceManager,Slave 中有Datanode 和 NodeManager。
- Master 启动的时候会启动一个 IPC(Inter-Process Comunication,进程间通信)server 服务,等待 slave 的链接。
3.Slave 启动时,会主动链接 master 的 ipc server 服务,并且每隔 3 秒链接一次 master,这个间隔时间是可以调整的,参数为 dfs.heartbeat.interval,这个每隔一段时间去连接一次的机制,我们形象的称为心跳。Slave 通过心跳汇报自己的信息给 master,master 也通过心跳给 slave 下达命令。
- NameNode 通过心跳得知 Datanode 的状态,ResourceManager 通过心跳得知 NodeManager 的状态。
- 如果 master 长时间都没有收到 slave 的心跳,就认为该 slave 挂掉了。
Namenode 感知到 Datanode 掉线死亡的时长计算:
HDFS 默认的超时时间为 10 分钟+30 秒。这里暂且定义超时时间为 timeout,计算公式为:
timeout = 2 * heartbeat.recheck.interval + 10 * dfs.heartbeat.interval
而默认的 heartbeat.recheck.interval 大小为 5 分钟,dfs.heartbeat.interval 默认的大小为 3 秒。需要注意的是 hdfs-site.xml 配置文件中的 heartbeat.recheck.interval 的单位为毫秒,dfs.heartbeat.interval 的单位为秒。所以,举个例子,如果heartbeat.recheck.interval 设置为 5000(毫秒),dfs.heartbeat.interval设置为 3(秒,默认),则总的超时时间为 40 秒。
heartbeat.recheck.interval 5000
dfs.heartbeat.interval 3
5.2.HDFS安全模式
问题引出:集群启动后,可以查看目录,但是上传文件时报错,打开web页面可看到namenode正处于 safemode 状态,怎么处理?
解释:safemode 是 namenode 的一种状态(active/standby/safemode 安全模式)
namenode 进入安全模式的原理:
1.namenode 发现集群中的 block 丢失率达到一定比例时(0.1%),namenode 就会进入安全模式,在安全模式下,客户端不能对任何数据进行操作,只能查看元数据信息(比如 ls/mkdir),这个丢失率是可以手动配置的,默认是 dfs.safemode.threshold.pct=0.999f
2.如何退出安全模式?
找到问题所在,进行修复(比如修复宕机的 datanode)
或者可以手动强行退出安全模式(但是并没有真正解决问题)
在 hdfs 集群正常冷启动时,namenode 也会在 safemode 状态下维持相当长的一段时间,此时你不需要去理会,等待它自动退出安全模式即可。
正常启动的时候进入安全的原理:
namenode 的内存元数据中,包含文件路径、副本数、blockid,及每一个 block 所在datanode 的信息,而 fsimage 中,不包含 block 所在的 datanode 信息,那么,当 namenode冷启动时,此时内存中的元数据只能从 fsimage 中加载而来,从而就没有 block 所在的datanode 信息——>就会导致 namenode 认为所有的 block 都已经丢失——>进入安全模式——>datanode 启动后,会定期向 namenode 汇报自身所持有的 blockid 信息,——>随着datanode 陆续启动,从而陆续汇报 block 信息,namenode 就会将内存元数据中的 block 所在 datanode 信息补全更新——>找到了所有 block 的位置,从而自动退出安全模式。
安全模式常用操作命令:
hdfs dfsadmin -safemode leave //强制 NameNode 退出安全模式
hdfs dfsadmin -safemode enter //进入安全模式
hdfs dfsadmin -safemode get //查看安全模式状态
hdfs dfsadmin -safemode wait //等待,一直到安全模式结束
如果你使用的版本是 2.X 之前的版本,那么这个 hdfs 命令可以替换成 hadoop,它们都在 bin目录下。
5.3.HDFS副本存放策略
1.作用
数据分块存储和副本的存放,是保证可靠性和高性能的关键。
2.方法
将每个文件的数据进行分块存储,每一个数据块又保存有多个副本,这些数据块副本分布在不同的机器节点上。
3.存放说明
在多数情况下,HDFS 默认的副本系数是 3。Hadoop 默认对 3 个副本的存放策略如下图,其中 Block1,Block2,Block3 分别表示 Block的三个副本:
第一个 block 副本放在和 client 所在的 node 里(如果 client 不在集群范围内,则这第一个 node是随机选取的,系统会尝试不选择哪些太满或者太忙的 node)。
第二个副本放置在与第一个节点不同的机架中的 node 中(近乎随机选择,系统会尝试不选择哪些太满或者太忙的 node)。
第三个副本和第二个在同一个机架,随机放在不同的 node 中。
4.修改副本数
第一种方式:修改集群文件 hdfs-site.xml
dfs.replication 1
第二种方式:命令设置 bin/hadoop fs -setrep -R 1 /
6.4.负载均衡
机器与机器之间磁盘利用率不平衡是 HDFS 集群非常容易出现的情况,尤其是在 DataNode 节点出现故障或在现有的集群上增添新的 DataNode 的时候。
分析数据块分布和重新均衡 DataNode 上的数据分布的工具:
命令:
sbin/start-balancer.sh
sbin/start-balancer.sh -threshold 5
自动进行均衡非常慢,一天能移动的数据量在 10G-10T 的级别,很难满足超大集群的需求。
原因:HDFS 集群默认不允许 balance 操作占用很大的网络带宽,这个带宽是可以调整的
hdfs dfsadmin -setBalanacerBandwidth newbandwidth
hdfs dfsadmin -setBalanacerBandwidth 10485760
该数值的单位是字节,上面的配置是 10M/s,默认是 1M/s
另外,也可以在 hdfs-site.xml 配置文件中进行设置:
dfs.balance.bandwidthPerSec 10485760 Specifies the maximum bandwidth that each datanode can utilize for the balancing purpose in term of the number of bytes per second.
sbin/start-balancer.sh -t 10% ##机器容量最高的那个值 和 最低的那个值得差距 不能超过 10%
————————————————
版权声明:本文为CSDN博主「jiangw-Tony」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_1018944104/article/details/84036504