HDFS java
HDFS (Hadoop Distributed FileSystem) 是 Hadoop 分布式文件系统,以流式数据访问模式来存储超大文件,运行与商业硬件集群上,管理网络中跨多台计算机存储的文件系统,是分布式计算中数据管理的的基础。node
流式数据访问模式 : 指的是数据不是一次性获取过来,而是一点一点获取,处理流式数据也会一点一点处理。(所有接收在处理的话,延迟会很大)数据库
(1)HDFS优势express
(2)HDFS不适合的领域缓存
1.低延时数据访问安全
好比毫秒级的来存储数据,这是不行的,它作不到。它适合高吞吐率的场景,就是在某一时间内写入大量的数据。可是它在低延时的状况下是不行的,好比毫秒级之内读取数据,这样它是很难作到的。服务器
HDFS是单Master的,全部的对文件的请求都要通过它,当请求多时,确定会有延时。网络
2.小文件存储数据结构
存储大量小文件的话,它会占用 NameNode大量的内存来存储文件、目录和块信息(元信息)。这样是不可取的,由于NameNode的内存老是有限的。小文件存储的寻道时间会超过读取时间,它违反了 HDFS的设计目标。架构
三、并发写入、文件随机修改
一个文件只能有一个写,不容许多个线程同时写。仅支持数据 append(追加),不支持文件的随机修改。
(3)HDFS针对缺点的改善措施
一、利用SequenceFile、MapFile、Har等方式归档小文件,这个方法的原理就是把小文件归档起来管理,HBase就是基于此的。对于这种方法,若是想找回原来的小文件内容,那就必须得知道与归档文件的映射关系。
二、横向扩展,一个Hadoop集群能管理的小文件有限,那就把几个Hadoop集群拖在一个虚拟服务器后面,造成一个大的Hadoop集群。google也是这么干过的。
三、多Master设计,正在研发中的GFS II也要改成分布式多Master设计,还支持Master的Failover,并且Block大小改成1M,有意要调优处理小文件。(Alibaba DFS的设计,也是多Master设计,它把Metadata的映射存储和管理分开了,由多个Metadata存储节点和一个查询Master节点组成。
(4)HDFS概念
一、数据块(block)
每一个磁盘都有默认的数据块大小,是磁盘进行读写的最小单位,构建与单个磁盘之上的文件系统经过磁盘数据块进行管理文件系统的块。相似于磁盘文件系统,HDFS中也有数据块的概念,HDFS文件系统也被划分为多个块,块做为独立单元。
HDFS数据块特色:HDFS中的块大小比文件系统的块大,通常默认64MB(Hadoop2中默认为128MB),而文件系统为几千字节。HDFS小于一个块大小的文件不会占据整个块的空间
二、namenode
HDFS集群上有两类节点:管理节点namenode和工做节点datanode。
四、secondarynamenode
secondarynamenode辅助后台程序,与namenode通讯,以便按期保存namenode的元数据快照。(namenode的备份容错机制)
五、联邦HDFS
namenode在内存中保存着每一个文件和每一个数据块的引用关系(元数据信息),对于一个拥有大量数据的集群来讲,namenode节点上的内存将成为限制横向扩展的瓶颈。在Hadoop2中,引入的联邦HDFS系统容许系统添加namenode实现扩展。每一个namenode管理着系统文件命名空间的一部分(例如一个namenode管理着 /usr目录下的全部文件,另外一个namenode管理着 /share目录下的全部文件)
在联邦环境下,每一个namenode维护一个命名空间卷(包括数据源和文件的全部数据块的数据块池),命名空间卷之间是相互独立的,一个namenode的失效不会影响另一个namenode,所以集群中的datanode须要注册每一个namenode。
(6)HDFS结构
HDFS 采用的是Master/Slave架构存储数据,其中主要的组件:Client、namenode、datanode、secondarynamenode
Client:客户端
Namenode:Master节点(管理节点)
Datanode:Slave节点(工做节点)
secondarynamenode:namenode辅助节点,作日志合并,备份namenode节点做用(并不是热备份),secondarynamenode和namenode同时运行,通常来讲都是运行在不一样的机器上,namenode宕机, secondarynamenode并不能立刻替换namenode提供服务。
(7)HDFS读写流程
Client端将数据写入到HDFS
客户端读取HDFS数据
(8)Namenode结构
在了解Namenode结构以前,咱们先看下存储在namenode节点上的元数据信息。
上图的元数据信息描述为有一个文件a.log,有三个备份,文件a.log分为两个数据块,数据块blk_一、blk_2,blk_1块在{h0,h1,h3}三个datanode 上,blk_2在{h0,h2,h4}三个datanode上
namenode在格式化以后,会在l临时文件夹(hadoop.tmp.dir 设置,默认在/tmp/hadoop-${user.name}
)目录下建立一个dfs目录,以下:
VERSION:是一个java properties文件,包含HDFS版本信息。
一、Namenode始终在内存中保存metedata,用于处理“读请求。当namenode启动的时候,加载fsimage文件到内存,而且将editslog文件逐条加载到内存。而后生成新的空的editslog和新的数据最全的fsimage文件。
二、当客户端进行读写操做时,首先将日志记录到editslog,而后将日志加载到内存。
三、成功后,editslog同步到文件系统。
四、Fsimage是映像文件,是内存中元数据的checkpoint点,是一个序列化文件,不能在硬盘上直接修改。
SecondaryNameNode日志合并(建立检查点)
在core-site.xml中配置fs.checkpoint.period 指定两次checkpoint的最大时间间隔,默认3600秒。fs.checkpoint.size 规定edits文件的最大值,一旦超过这个值则强制checkpoint,无论是否到达最大时间间隔。默认大小是64M。
(9)Datanode结构
DataNode职责:
提供真实文件数据的存储服务。
文件块(block):最基本的存储单位。默认64M。(Hadoop2默认128MB)
对于文件内容而言,一个文件的长度大小是size,那么从文件的0偏移开始,按照固定的大小,顺序对文件进行划分并编号,划分好的每个块称一个Block。HDFS默认Block大小是64MB,以一个256MB文 件,共有256/64=4个Block.
不一样于普通文件系统的是,HDFS中,若是一个文件小于一个数据块的大小,并不占用整个数据块存储空间。
在Hadoop集群中,默认是有三个副本(dfs.replication配置的是HDFS存储时的备份数量),HDFS建立副本的策略通常是:
若是备份的副本设置的更多,例如备份4个的话,可能第四块在不一样机房的机器上...
datanode目录结构
VERSION文件和namenode的VERSION文件差很少
namespaceID是datanode首次访问namenode时获取的。
storageID,对每一个datanode是惟一的,能够根据这个属性区分datanode
块文件的目录扩展
hdfs dfsadmin -safemode get //hdfs dfsadmin是hdfs管理员命令
二、退出安全模式
在执行修改和写入操做的时候,须要先退出安全模式
hdfs dfsadmin -safemode wait
#command to read or write
hdfs dfsadmin -safemode enter
四、 离开安全模式
hdfs dfsadmin -safemode leave
安全模式的下属性
属性名称 | 类型 | 默认值 | 说明 |
dfs.replication.min | int | 1 | 最小副本级别:成功执行写操做的最小副本数目 |
dfs.safemode.threshold.pct | float | 0.999 | 最小副本条件:在namenode退出安全模式以前,知足最小副本级别的比例。设置高于1,永远不会退出安全模式,设置为0或者太小,可能会使得namenode没法启动安全模式 |
dfs.safemode.extention | int | 30 000 | 在知足最小副本条件以后,namenode还须要处于安全模式的时间(毫秒),对于小集群来讲,能够设置为0 |
(11)HDFS 命令行
HDFS有不少接口能够和HDFS交互(java API等),命令行是最简单的,也是入门学习须要了解的。
经常使用命令:
hadoop fs 和 hdfs dfs 均可以,可是推荐使用hdfs dfs
经过hadoop fs -help 查看
Usage: hadoop fs [generic options] [-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] [-l] [-d] <localsrc> ... <dst>] [-copyToLocal [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>] [-count [-q] [-h] [-v] [-t [<storage type>]] [-u] [-x] <path> ...] [-cp [-f] [-p | -p[topax]] [-d] <src> ... <dst>] [-createSnapshot <snapshotDir> [<snapshotName>]] [-deleteSnapshot <snapshotDir> <snapshotName>] [-df [-h] [<path> ...]] [-du [-s] [-h] [-x] <path> ...] [-expunge] [-find <path> ... <expression> ...] [-get [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>] [-getfacl [-R] <path>] [-getfattr [-R] {-n name | -d} [-e en] <path>] [-getmerge [-nl] [-skip-empty-file] <src> <localdst>] [-help [cmd ...]] [-ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] [<path> ...]] [-mkdir [-p] <path> ...] [-moveFromLocal <localsrc> ... <dst>] [-moveToLocal <src> <localdst>] [-mv <src> ... <dst>] [-put [-f] [-p] [-l] [-d] <localsrc> ... <dst>] [-renameSnapshot <snapshotDir> <oldName> <newName>] [-rm [-f] [-r|-R] [-skipTrash] [-safely] <src> ...] [-rmdir [--ignore-fail-on-non-empty] <dir> ...] [-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]] [-setfattr {-n name [-v value] | -x name} <path>] [-setrep [-R] [-w] <rep> <path> ...] [-stat [format] <path> ...] [-tail [-f] <file>] [-test -[defsz] <path>] [-text [-ignoreCrc] <src> ...] [-touchz <path> ...] [-truncate [-w] <length> <path> ...] [-usage [cmd ...]]
HDFS管理员命令
hdfs dfsadmin
可参照:https://blog.csdn.net/jjshouji/article/details/79087601
笔摘主要是对HDFS理论的上的了解,具体的操做仍是须要多多实战操做...
参考:https://blog.csdn.net/dpengwang/article/details/79297435
《Hadoop权威指南》