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>