HDFS基本概念篇
HDFS前言
设计思想:
分而治之:将大文件、大批量文件,分布式存放在大量服务器上,以便于采取分而治之的方式对海量数据进行运算分析:
在大数据系统中的运用:
为各类分布式运算框架提供数据存储服务。
重点概念:文件切块,副本存放,元数据
HDFS概念和特性
重要特性:
采用分块存储
HDFS文件系统会给客户端提供一个统一的抽象目录树,客户端通过目录来访问文件。
目录结构及文件分块信息(元数据)的管理由namenode节点承担
namenode:HDFS的集群主节点,负责维护整个hdfs文件系统的目录树,以及每一个路径(文件)所对应的block块信息。
文件的各个block的储存管理有datanode节点承担
datanode:datanode是HDFS集群的从节点,每一个block都可以子啊多个datanode上储存多个副本(副本数量可以通过参数设置)
HDFS是设计成一次写入,多次读出的场景,且不支持文件的修改。
HDFS基本操作
HDFS提供shell命令行客户端:使用hadoop fs 命令参数
命令行客户端支持的命令参数
[-appendToFile <localsrc> ... <dst>]
[-cat [-ignoreCrc] <src> ...]
[-checksum <src> ...]
[-chgrp [-R] GROUP PATH...]
[-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
[-chown [-R] [OWNER][:[GROUP]] PATH...]
[-copyFromLocal [-f] [-p] <localsrc> ... <dst>]
[-copyToLocal [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
[-count [-q] <path> ...]
[-cp [-f] [-p] <src> ... <dst>]
[-createSnapshot <snapshotDir> [<snapshotName>]]
[-deleteSnapshot <snapshotDir> <snapshotName>]
[-df [-h] [<path> ...]]
[-du [-s] [-h] <path> ...]
[-expunge]
[-get [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
[-getfacl [-R] <path>]
[-getmerge [-nl] <src> <localdst>]
[-help [cmd ...]]
[-ls [-d] [-h] [-R] [<path> ...]]
[-mkdir [-p] <path> ...]
[-moveFromLocal <localsrc> ... <dst>]
[-moveToLocal <src> <localdst>]
[-mv <src> ... <dst>]
[-put [-f] [-p] <localsrc> ... <dst>]
[-renameSnapshot <snapshotDir> <oldName> <newName>]
[-rm [-f] [-r|-R] [-skipTrash] <src> ...]
[-rmdir [--ignore-fail-on-non-empty] <dir> ...]
[-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]]
[-setrep [-R] [-w] <rep> <path> ...]
[-stat [format] <path> ...]
[-tail [-f] <file>]
[-test -[defsz] <path>]
[-text [-ignoreCrc] <src> ...]
[-touchz <path> ...]
[-usage [cmd ...]]
常用命令介绍
-help
功能:输出这个命令参数手册
-ls
实例:hadoop fs -ls hdfs://hadoop-server01:9000/
功能:显示目录信息
-mkdir
实例:hadoop fs -mkdir -p /aaa/bbbb
功能:在hdfs上创建目录
-moveFormLocal
实例:hadoop fs -moveFormLocal /home/hadoop/a.txt /aaa/bb/cc/dd
功能:从本地剪切粘贴到hdfs
-appendToFile
实例:hadoop fs -appendToFile ./hello.txt hdfs://hadoop-server01:9000//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
实例:hadoop fs -chmod 666 /hello.txt
hadoop fs -chown someuser:somegrp /hello.txt
功能:Linux文件系统中的用法一样,对文件所属权限进行修改
-copyFromLocal
实例:hadoop fs -copyFromLocal ./jdk.tar.gz /aaa/
功能:从本地文件系统中拷贝文件到hdfs路径中去
-copyToLocal
实例:hadoop fs -copyToLocal /aaa/jdk.tar.gz
功能:从hdfs拷贝到本地。
-cp
功能呢:从hdfs的一个路径拷贝hdfs的另一个路径
实例:hadoop fs -cp /aaa/jdk.tar.gz /bbb/jdk.tar.gz
-mv
功能:在hdfs目录中移动文件
实例:hadoop fs -mv /aaa/jdk.tar.gz /
-get
功能:等同于-copyToLocal,就是从hdfs到本地
示例:hadoop fs -get /aaa/jdk.tar.gz
-getmerge
功能:合并下载多个文件
示例:hadoop fs -getmerge /aaa/log.* ./log.sum
-put
功能:等同于copyFromLocal
示例:hadoop fs -put /aaa/jdk.tar.gz /bbb/jdk/tar/gz/
-rm
功能:删除文件夹或文件
实例:hadoop fs -rm -r /aaa/bbb/
-rmdir
功能:删除空目录
实例:hadoop fs -rmdir /aaa/bb/cc
-df
功能:统计文件系统的可用空间信息
实例:hadoop fs -df -h /
-du
功能:统计文件夹的大小信息
实例:hadoop fs -du -s -h /aaa/*
-count
功能:统计指定目录下文件节点的数量
实例:hadoop fs -count /aaa/
-setrep
功能:设置hdfs中文件的副本数量
实例:hadoop fs -setrep 3 /aaa/jdkj.tar.gz
HDFS原理篇
HDFS集群分为两大角色:NameNOde,DataNode(Secondary Namenode)
NameNode负责管理整个文件系统元数据
DataNode负责管理用户的文件数据块
文件会按照固定的大小切成若干块后分布式存储在若干台datanode上
每一个文件块可以有多个副本块,并存放在不同的datanode上
datanode会定期向namenode汇报自身所保存的文件的block信息,而namenode则会负责保持文件的副本数量
hdfs的内部工作机制对客户端保持透明,客户端请求访问hdfs都是通过向nomanode申请来进行
hdfs写数据步骤解析
根namenode通信请求上传文件,namenode检查目标文件是否已经存在,父目录是否存在
namenode放回是否可以上传
client请求第一个block该传输到那些datanode服务器上
namenode放回三个datanode服务器ABC
client请求3台datanode中的一台A上传数据(本质上是一个RPC调用,建立pipeline),A收到请求之后会继续调用B,然后B调用C将真个pipeLine建立完成,逐级返回客户端
client开始往A上传第一个block,以packet为单位,A收到一个packet就会传给B,B传给C;A没传一个packet会放入一个应答队列等待应答
当一个block传输完成之后,client在此请求namenode上传第二个block服务器。
hdfs读数据步骤解析
更namenode通信查询元数据,找到文件块所在的datanode服务器
挑选一台datanode服务器,请求建立socket流
datanode开始发送数据(从磁盘里面读取数据放入流,以packet为单位来校验)
客户端以packet为单位来接受,在本地缓存,然后写入目标文件
NAMENODE工作机制
namenode职责:
负责客户端请求的响应
元数据的管理(查询,修改)
元数据的管理
namenode对数据的管理采用3中存储形式:
内存元数据(namesystem)
磁盘元数据镜像文件
数据操作日志文件(可通过日志运算出元数据)
元数据存储机制
内存中有一份完整的元数据(内存 meta data)
磁盘有一个“准完整”的元数据镜像(fsimage)文件(在namenode的工作目录中)
用于衔接内存metadata和持久化元数据镜像fsimage之间的操作日志(edits文件)(当客户端对hdfs中的文件进行新增或者修改操作,操作记录首先被计入edits日志文件中,当客户端操作成功之后,相应的元数据会更新到内存meta.data中)
元数据手动查看
bin/hdfs oev -i edits -o edits.xml
bin/hdfs oiv -i fsimage_0000000000000000087 -p XML -o fsimage.xml
元数据的checkpoint
每隔一段时间,会由secondary namenode将namenode上积累的所有edits和一个最新的fsimage下载到本地,并阿吉仔到内存进行merge(只有第一次下载fsimage?)
DATANODE的工作机制
datanode工作职责:
存储管理用户的文件块数据
定期向namenode汇报自身所持有的的block信息(通过心跳信息上报)(这点保证了集群中block的副本数量)
datanode掉线判断实现参数
datanode进程死亡或者网络故障造成datanode无法与namenode通信,namenode不会立即把该节点判断死亡,要经过一段时间,这段时间暂时称作超时时长。HDFS默认的超时时长为10分钟+30秒。如果定义超时时间为timeout,则超时时长的计算公式为:
timeout = 2 * heartbeat.rechect.interval + 10 * dfs.hertbeat.interval.
而默认的hearbeat.rechect.interval的大小为5分钟,dfs.heart.interval默认为3秒。
需要注意的是hdfs-site.xml配置文件中heartbeat.recheck.interval的单位为毫秒,dfs.heartbeat.interval的单位为秒。
<property>
<name>heartbeat.recheck.interval</name>
<value>2000</value>
</property>
<property>
<name>dfs.heartbeat.interval</name>
<value>1</value>
</property>