HDFS介绍及简单操做

目录html

1.HDFS是什么?node

2.HDFS设计基础与目标linux

3.HDFS体系结构算法

3.1 NameNode(NN)
3.2 DataNode(DN)
3.3 SecondaryNameNode(SNN)
3.4 块(Block)的概念
3.5 文件安全shell

3.读取数据流程数据库

4.HDFS的可靠性express

4.1 冗余副本策略
4.2 机架策略
4.3 心跳策略
4.4 安全模式
4.5 校验和
4.6 回收站
4.7 元数据保护
4.8 快照机制apache

5.HDFS基础架构以及工做原理segmentfault

6.HDFS读操做缓存

7.HDFS写操做

8.HDFS现实举例

9.HDFS简单操做

10.HDFS管理与更新

11.HDFS 优势 VS 缺点

12.Block的副本放置策略

13.HDFS文件权限


 

Hadoop其实并非一个产品,而是一些独立模块的组合。主要由分布式文件系统HDFS和大型分布式数据处理算法MapReduce组成。那么咱们今天就来看看HDFS到底是什么鬼?

 

1.HDFS是什么?

HDFS即Hadoop Distributed File System。首先它是一个开源系统,同时它是一个可以面向大规模数据使用的,可进行扩展的文件存储与传递系统。是一种容许文件经过网络在多台主机上分享的文件系统,可以让多机器上的多用户分享文件和存储空间。让其实是经过网络来访问文件的动做,由程序与用户看来,就像是访问本地的磁盘通常。即便系统中有某些节点脱机,总体来讲系统仍然能够持续运做而不会有数据损失。
它分为2个部分:NameNode和DataNode。NameNode至关于一个领导,它管理集群内的DataNode,当客户发送请求过来后,NameNode会根据状况制定存储到哪些DataNode上,而其自己本身并不存储真实的数据。那NameNode怎么知道集群内DataNode的信息呢?DataNode发送心跳信息给NameNode(一会详见原理图)。
Hadoop分布式文件系统是根据Google发表的GFS(Google File System)论文产生过来的。

 

2.HDFS设计基础与目标

HDFS是基于流数据模式访问和处理超大文件的需求而开发的,能够运行于廉价的商业服务器上。

(1) 硬件错误是常态。所以须要冗余。
在Google不多会使用超级计算机,也不多会使用一些厂商很昂贵的设备,他们通常会使用的就是普通的PC集群。PC集群即便是PC server,它的底子基本上也是家用机的模式,因此这种机器的耐用性确定没有小型机或者专用的服务器高。若是一个集群里机器不少,好比几百台,那么每一个星期坏几台是很常见的。这个“坏掉”不必定是完全坏掉,多是宕机等,好比内存不稳定或者CPU过热,致使某些节点死掉;或者过了一段时间以后,硬盘的寿命到期,硬盘的介质发生了损坏,由于普通PC不少都是采用很便宜的SATA硬盘,它设计的也不必定就是7*24工做的,或者在7*24模式底下工做它的寿命就会大大缩短。不管什么缘由,总之在hadoop集群里面,咱们面对的就是常常性地发生错误这种状况。天天可能就是要面对各类各样的错误,有些时候多是节点机器自己失效,好比死机、断网等,有些时候多是硬盘介质问题,好比某个文件损坏、某个硬盘彻底坏掉等。因为错误是常常性发生,因此备份都不足够防止这种错误。所以须要冗余,就是在运行的过程当中直接对数据进行备份,好比说数据原本只须要写一份,如今可能须要一次写好几份,万一某个节点失效,咱们还能够从其余节点把这个数据拿出来。所以冗余是HDFS自己直接嵌入的一个功能,它并非一个额外的功能,它是在设计的时候就必须考虑的一点。冗余思想是深刻到HDFS的骨髓里面的。

(2) 流式数据访问。即数据批量读取而非随机读写,hadoop擅长作的是数据分析而不是事物处理。
HDFS是为大数据而生。通常来讲不多会让Hadoop集群去作OLTP(联机事务处理)。所谓OLTP就是偶尔地、随机性地去读写一些数据,主要就是随机读,随机写,可能还会有一些修改的工做。Hadoop不多会处理这种事情,它处理的是大数据的流式读写,好比说我整堆整堆的去读,而后去加以处理。

(3) 大规模数据集。

(4) 简单一致性模型,为了下降系统复杂度,对文件采用一次性写屡次读的逻辑设计,便是文件一经写人,关闭,就不能修改。
因为面临的是批量性地操做,因此hadoop在设计时就会采起一些简单的一致性模型,针对这种大批量读却不多去写的模型。为了下降系统的复杂度,Hadoop文件一般是一次性写进去,好比说拷贝文件一次性拷好,这个文件拷好以后通常你不会去改,除非你把它删除掉。就是说这个文件写进去以后你会屡次去读它,可是不能改变它的内容。若是你必定要改变它,那就把原来的文件删除,而后再把改后的文件从新写进去。

(5) 程序采用“数据就近”原则分配节点执行。

HDFS在设计时也要考虑到MapReduce体系跟它的融合,就是咱们的数据到底怎么放,才能使做业以最快的速度来运行。
在读取数据时,为了减小总体带宽消耗和下降总体的带宽延时,HDFS会尽可能让读取程序读取离客户端最近的副本。

 

3.HDFS体系结构

HDFS体系结构中主要有2类节点,一类是NameNode,一类是DataNode。这两类节点分别承担Master和Worker的任务。NameNode就是Master管理集群中的执行调度,DataNode就是Worker具体任务的执行节点。NameNode管理文件系统的命名空间,维护整个文件系统的文件目录树以及这些文件的索引目录。这些信息以两种形式存储在本地文件系统中,一种是命名空间镜像(Namespace image),一种是编辑日志(Edit log)。从NameNode中你能够得到每一个文件的每一个块所在的DataNode。须要注意的是,这些信息不是永久保存的,NameNode会在每次系统启动时动态地重建这些信息。当运行任务时,客户端经过NameNode获取元数据信息,和DataNode进行交互以访问整个文件系统。
固然,HDFS体系结构中还有一类节点,那就是Secondary NameNode。这个节点的主要做用就是周期性地合并日志中的命名空间镜像,以免编辑日志过大。

HDFS采用Master/Slave架构对文件系统进行管理。一个HDFS集群是由一个NameNode和必定数目的DataNode组成的。NameNode是一个中心服务器,负责管理文件系统的命名空间(Namespace)以及客户端对文件的访问,集群的DataNode通常是由一个节点运行一个DataNode进程,负责管理它所在节点上的存储。
从内部看,一个文件其实被分红了一个或多个数据块,这些块存储在一组DataNode上。NameNode执行文件系统的名字空间操做,好比打开、关闭、重命名文件或目录。它负责肯定数据块到具体DataNode节点的映射。DataNode负责处理文件系统客户端的读/写请求。在NameNode的统一调度下进行数据块的建立、删除和复制(注意这里没有修改)。

中心目录服务器(NameNode)管理大量数据服务器(DataNode):
NameNode管理元数据(文件目录树,文件——>块映射,块——>数据服务器映射表,etc)
DataNode负责存储数据、以及响应数据读写请求
客户端与NameNode交互进行文件建立/删除/寻址等操做,以后直接与DataNode交互进行文件I/O

下面咱们来逐一观察一下架构里面的一些元素。

 

3.1 NameNode(NN)

(1) 管理文件系统的命名空间。
就是说它是文件系统总控的节点。

(2) 记录每一个文件的数据块在各个DataNode上的位置和副本信息。
就好比说如今我有一个表格,这个表格的每个项目均记录了一个文件的状况,好比说文件名、权限、元数据信息(创建修改时间、长度等)。除此以外,它还记录这些文件究竟在集群的哪些节点上,好比说存在节点1的某个数据块上面。

(3) 协调客户端对文件的访问。
当有节点须要访问某个文件时,首先访问NameNode来获取文件位置信息,而后跟相应的DataNode通信,读取数据块。因此NameNode在这里起到了一个相似书里面目录的做用。

(4) 记录命名空间内的改动或空间自己属性的改动。
好比说它的权限发生了一些什么样的变化之类的

(5) 使用事物日志记录HDFS元数据的变化,使用映像文件存储文件系统的命名空间,包括文件映射,文件属性等。
NameNode使用两个东西来记录元数据。分别是事物日志和映像文件。具体来讲你们能够打开NameNode节点上面你所定义的保存元数据的目录,在HDFS配置文件里面有一项参数是指出元数据在什么地方,那是一个目录,打开目录以后能够看到有一些文件,其中fsimage就是映像文件。

[root@hadoop ~]# cat /usr/local/hadoop/etc/hadoop/core-site.xml 
...
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/var/hadoop/tmp</value>   
    </property>    
...
[root@hadoop ~]# cd /var/hadoop/tmp/dfs/name/current/
[root@hadoop current]# ll
total 1052
-rw-r--r-- 1 root root      42 Jul 18 04:03 edits_0000000000000000001-0000000000000000002
-rw-r--r-- 1 root root 1048576 Jul 18 04:03 edits_inprogress_0000000000000000003
-rw-r--r-- 1 root root     389 Jul 18 04:02 fsimage_0000000000000000000
-rw-r--r-- 1 root root      62 Jul 18 04:02 fsimage_0000000000000000000.md5
-rw-r--r-- 1 root root     389 Jul 18 04:03 fsimage_0000000000000000002
-rw-r--r-- 1 root root      62 Jul 18 04:03 fsimage_0000000000000000002.md5
-rw-r--r-- 1 root root       2 Jul 18 04:03 seen_txid
-rw-r--r-- 1 root root     219 Jul 18 04:02 VERSION
View Code

补充:

NameNode(NN)主要功能:接受客户端的读写服务(不理解?)
NameNode保存metadata信息包括:a.文件ownership和permissions;b.文件包含哪些块;c.Block保存在哪一个DataNode(由DataNode启动时上报)。
NameNode的Metadata信息在启动后都会加载到内存中,同时metadata信息(包括上述a和b)也会存储到磁盘文件名为“fsimage”,可是上述 c.Block的位置信息 不会保存到fsimage,只会存在于内存中;edits记录对metadata操做日志。

 

3.2 DataNode(DN)

(1) 负责所在物理节点的存储管理

(2) 一次写入,屡次读取(不修改)
因为这个特性,那么咱们就不须要考虑一致性问题。所谓一致性就是说假若有不少人同时修改一个文件,那么最终应该采纳哪一个修改的版本呢?这是在数据库环境里常常要考虑的问题。在Oracle中采用回滚,在块结构里也加了一些机制来保证读取一致性,可是Oracle里面作的巨复杂。而在hadoop中很是简单,由于文件一经写入就不能改,因此根本就不可能发生不少人一块儿修改的状况。所以它彻底不须要考虑一致性

(3) 文件由数据块组成,典型的块大小是128MB(v1版本是64MB,v2版本是128MB)
hadoop中每一个数据块是一个blk文件,通常来讲缺省的数据块能够达到128MB,你们能够尝试往Hadoop里面不断写文件,可观察到数据块在不断增加,通常来讲增加到128MB就再也不增加,而后数据块文件就不断增多。

(4) 数据块尽可能散布到各个节点
实现冗余的效果

补充:

DataNode存储数据(Block);
启动DN线程的时候会向NN汇报block信息;
经过向NN发送心跳保持与其联系(3秒一次),若是NN 10分钟没有收到DN的心跳,则认为其已经lost,并copy其上的block到其余DN。

 

3.3 SecondaryNameNode(SNN)

1)它不是NN的备份(但能够作备份),它的主要工做是帮助NN合并edits log,减小NN启动时间。
2)SNN执行合并时机:
根据配置文件设置的时间间隔fs.checkpoint.period,默认3600秒。
根据配置文件设置edits log大小fs.checkpoint.size规定edits文件的最大值默认为64MB。

SNN合并流程

 

3.4 块(Block)的概念

操做系统中的文件块。文件是以块的形式存储在磁盘中,此处块的大小表明系统读、写、可操做的最小文件大小。也就是说,文件系统每次只能操做磁盘块大小的整数倍数据。一般来讲,一个文件系统块大小为几千字节,而磁盘块大小为512字节。
HDFS中的块是一个抽象的概念,比操做系统中的块要大得多。在配置hadoop系统时会看到,它的默认大小是64MB(最新版本默认大小已经变成了128MB)。HDFS使用抽象的块的好处:1)能够存储任意大的文件而又不会受到网络中任一单个节点磁盘大小的限制。2)使用抽象块做为操做的单元能够简化存储子系统。

HDFS数据存储单元(block)

1)文件被切分红固定大小的数据块:默认数据块大小为64MB,可配置;若文件大小不到64MB,则单独存成一个block。
2)一个文件存储方式:按大小被切分红若干个block,存储到不一样节点上,默认状况下每一个block都有3个副本(可配置);Block大小和副本数经过client端上传文件时设置,文件上传成功后副本数能够变动,Block大小不可变动。

 

3.5 文件安全

hadoop采用了两种方法来确保文件安全。
第一种方法:将NameNode中的元数据转储到远程的NFS文件系统上。
第二种方法:系统中同步运行一个Secondary NameNode,这个节点的主要做用就是周期性地合并日志中的命名空间镜像,以免编辑日志过大。

 

4.HDFS的可靠性

4.1 冗余副本策略

(1) 能够在hdfs-site.xml中设置复制因子指定副本数量。

[root@hadoop ~]# cat /usr/local/hadoop/etc/hadoop/hdfs-site.xml 
...
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
...
View Code

复制因子:好比说replication=1表明没有冗余,2及以上表明有冗余。通常来讲,数越大表明越安全,即数据块重复的越多越安全。可是把数定大了也有坏处,那
就是空间利用率降低,好比说冗余数量增大一倍,此时空间利用率就会降低50%。还有一个坏处就是影响速度,由于数据要写入副本,确定会在性能上产生一些影响。因此说复制因子应该取什么数值呢?说实话这个通常没有什么原则,你们能够根据实际集群的状况、性能、空间利用率等综合的一个平衡,来选取一个折中的数值。

(2) 全部数据块都有副本。

(3) DataNode启动时,遍历本地文件系统,产生一份hdfs数据块和本地文件的对应关系列表(blockreport)汇报给NameNode。
通常来讲数据节点启动时,都会把本地的系统文件遍历一次,产生一个数据块和本地文件对应的清单(叫作blockreport)汇报给NameNode,NameNode根据blockreport来和它的元数据进行对照,看一看数据节点的实际状况跟元数据里面所记录的状况是否相符,再决定是否采起某些安全上的措施。

 

4.2 机架策略

集群通常放在不一样机架上,机架间带宽要比机架内宽带要小。
集群通常是放在若干个机柜里面,集群可能利用机柜里面的交换机共同连到一个大的交换机里面,通常来讲有这么一个规律,就是同一个机柜里面的机器因为连的是同一个机柜里的交换机,一般交换数据比较快。不一样机柜之间的服务器因为连到一个更加高级的一个交换机里面,因此他们的速度通常会慢一点。并且还有一个比较特别的状况,有时候可能会由于网线的故障或者交换机端口的故障,咱们每每会跟整个机柜里面的服务器失去联系。考虑到这种状况。hadoop对机架要有特殊的处理策略。好比机架感知和冗余策略。

HDFS的“机架感知”。

经过节点之间互相传递一个信息包来获知节点之间的关系(到底是分布在同一个机架仍是不一样的机架里面)。
副本的存放是HDFS可靠性和性能的关键。优化的副本存放策略也正是HDFS区分于其余大部分分布式文件系统的重要特征。HDFS采用一个称为“机架感知(rack-aware)”的策略来改进数据的可靠性、可用性和网络带宽的利用率。

冗余:通常在本机架存放一个副本,在其余机架存放别的副本,这样能够防止机架失效时丢失数据,也能够提升带宽利用率。

 

4.3 心跳策略

Namnode周期性从DataNode接收心跳信号和快报告;
所谓快报告就是说DataNode会不断地向NameNode发送一个blockreport,告诉他在本地的系统里面数据块和文件的对应关系。

NameNode会根据块报告验证元数据;
就是说数据节点实际状况和元数据里面记录的是否一致,若是不一致,可能须要进行相应的修正以及冗余策略等。

没有按时发送心跳的DataNode会被标记为宕机,不会再给它任何I/O请求;

若是DataNode失效形成副本数量降低,而且低于预先设置的阈值,NameNode会检测出这些数据块,并在合适的时机进行从新复制;

引起从新复制的缘由还包括数据副本自己损坏、磁盘错误,复制因子被增大等。

 

4.4 安全模式

NameNode启动后会进入一个称为安全模式的状态。处于安全模式的NameNode不会进行数据块的复制,NameNode从全部的DataNode接收心跳信号和块状态报告。

过程:

NameNode启动时,首先将映像文件(fsimage)载入内存,并执行编辑日志(edits)中的各项操做。
一旦在内存中成功创建文件系统元数据的映射,则建立一个新的fsimage文件(这个操做不须要SecondaryNameNode)和一个空的编辑日志。
此刻NameNode运行在安全模式,即NameNode的文件系统对于客户端来讲是只读的(显示目录、文件内容等。写、删除、重命名都会失败)。
在此阶段NameNode收集各个DataNode的报告,当数据块达到最小副本数以上时,会被认为是安全的;在必定比例(可设置)的数据块被肯定为“安全”后,再过若干时间,安全模式结束。
当检测到副本数不足的数据块时,该块会被复制直到达到最小副本数,系统中数据块的位置并非由NameNode维护的,而是以块列表形式存储在DataNode中。

报错:

在运行hadoop程序时,有时候会报如下错误:
org.apache.hadoop.dfs.SafeModeException: Cannot delete /user/hadoop/input. Name node is in safe mode

在分布式文件系统启动时,开始的时候会进入安全模式,当分布式文件系统处于安全模式的状况下,文件系统中的内容不容许修改也不容许删除,直到安全模式结束。
安全模式主要是为了系统启动的时候检查各个DataNode上数据块的有效性,同时根据策略必要的复制或者删除部分数据块。运行期经过命令也能够进入安全模式。
在经过命令行启动hadoop的守护进程时,有时会由于操做不当,例如“Ctrl+z”或者命令行的切换关闭等会使得NameNode进入安全模式,解决此问题只要在hadoop的根目录下输入:
hdfs dfsadmin -safemode enter 即进入安全模式
hdfs dfsadmin -safemode leave 即离开安全模式
start-balancer.sh 负载均衡模式、

 

4.5 校验和

在文件创立时,每一个数据块都产生校验和;
校验和会做为单独一个隐藏文件保存在命名空间下;
客户端获取数据时能够检查校验和是否相同,从而发现数据块是否损坏;
若是正在读取的数据块损坏,则能够继续读取其它副本。


4.6 回收站

删除文件时,实际上是放入回收站/trash;
回收站里的文件能够快速恢复;
能够设置一个时间阈值,当回收站里文件的存放时间超过这个阈值,就会被完全删除,而且释放占用的数据块。


4.7 元数据保护

映像文件和事物日志是NameNode的核心数据,能够配置为拥有多个副本;
副本会下降NameNode的处理速度,但增长安全性;
NameNode依然是单点,若是发生故障要手工切换。

元数据在NameNode上,保存了整个文件系统的关键信息,若是元数据被破坏掉,那么毫无疑问文件系统就崩溃了,无可挽回的崩溃,为了防止这种状况的发生,咱们须要对元数据进行保护。

 

4.8 快照机制

支持存储某个时间点的映像,须要时可使数据重返这个时间点的状态;
Hadoop目前(2012年)还不支持快照,已经列入开发计划。

 

5.HDFS基础架构以及工做原理

HDFS基础架构

下图是hdfs写操做图,具体过程描述详见这里

 

6.HDFS读操做

客户端(client)用FileSystem的open()函数打开文件。
DistributedFileSystem用RPC(Remote Procedure Call—远程过程调用)调用元数据节点,获得文件的数据块信息。
对于每个数据块,元数据节点返回保存数据块的数据节点的地址。
DistributedFileSystem返回FSDataInputStream给客户端,用来读取数据。
客户端调用stream的read()函数开始读取数据。
DFSInputStream链接保存此文件第一个数据块的最近的数据节点。
Data从数据节点读到客户端(client)。
当此数据块读取完毕时,DFSInputStream关闭和此数据节点的链接,而后链接此文件下一个数据块的最近的数据节点。
当客户端读取完毕数据的时候,调用FSDataInputStream的close()函数。
在读取数据的过程当中,若是客户端在与数据节点通讯出现错误,则尝试链接包含此数据块的下一个数据节点。失败的数据节点将被记录,之后再也不链接。

 

7.HDFS写操做

客户端调用create()来建立文件。
DistributedFileSystem用RPC调用元数据节点,在文件系统的命名空间中建立一个新的文件。
元数据节点首先肯定文件原来不存在,而且客户端有建立文件的权限,而后建立新文件。
DistributedFileSystem返回DFSOutputStream,客户端用于写数据。
客户端开始写入数据,DFSOUTputStream将数据分红块,写入data queue。
DataQuery由DataStreamer读取,并通知元数据节点分配数据节点,用来存储数据块(每块默认复制3块)分配的数据节点放在一个pipeline里。
DataStreamer将数据块写入pipeline中的第一个数据节点。
第一个数据节点将数据块发送给第二个数据节点,第二个数据节点将数据发送给第三个数据节点。
DFSOutputStream为发出去的数据块保存了ack queue,等待pipeline中的数据节点告知数据已经写入成功。

 

8.HDFS现实举例

 

9.HDFS简单操做

linux操做系统中的不少命令在HDFS系统中也可使用,只不过须要在前面添加一个前缀hdfs dfs -。具体操做举例以下:

[root@hadoop ~]# start-all.sh #启动hadoop
...
[root@hadoop ~]# vi 123.txt #新建一个测试文件
I love hadoop

[root@hadoop ~]# hdfs dfs -put 123.txt / #将测试文件放到hdfs根目录下

[root@hadoop ~]# hdfs dfs -ls / #查看hdfs根目录
Found 1 items
-rw-r--r--   1 root supergroup         14 2018-07-18 21:47 /123.txt

[root@hadoop ~]# hdfs dfs -cat /123.txt  #查看hdfs中的测试文件内容
I love hadoop

[root@hadoop ~]# hdfs dfs -mkdir /test #建立目录
[root@hadoop ~]# hdfs dfs -ls / #查看,建立目录成功
Found 2 items
drwxr-xr-x   - root supergroup          0 2018-07-18 21:51 /test
-rw-r--r--   1 root supergroup         14 2018-07-18 21:47 /123.txt

[root@hadoop ~]# hdfs dfs -cp /123.txt /test/ #复制文件
[root@hadoop ~]# hdfs dfs -ls /test/ #查看,复制文件成功
Found 1 items
-rw-r--r--   1 root supergroup         14 2018-07-18 21:54 /test/123.txt

[root@hadoop ~]# hdfs dfs -cd /test/ #注意:没有cd命令
-cd: Unknown command

[root@hadoop ~]# hdfs dfs -rm -r /test #删除目录
Deleted /test
[root@hadoop ~]# hdfs dfs -ls / #查看,删除目录成功
Found 1 items
-rw-r--r--   1 root supergroup         14 2018-07-18 21:47 /123.txt

[root@hadoop ~]# hdfs dfs -get /123.txt /var/hdfs_123.txt #将测试文件取出来放到本地
[root@hadoop ~]# cd /var/ #查看
[root@hadoop var]# ls
adm    crash  empty  gopher  hdfs_123.txt  lib    lock  mail  opt       run    tmp
cache  db     games  hadoop  kerberos      local  log   nis   preserve  spool  yp
[root@hadoop var]# cat hdfs_123.txt 
I love hadoop

[root@hadoop var]# hdfs dfs -df -h #查看hdfs使用状况
Filesystem            Size    Used  Available  Use%
hdfs://hadoop:9000  18.0 G  24.0 K     11.0 G    0%


#其实,上面的命令基本上均可以用hadoop fs -前缀命令代替,好比
[root@hadoop ~]# hadoop fs -ls / #查看hdfs根目录
Found 1 items
-rw-r--r--   1 root supergroup         14 2018-07-18 21:47 /123.txt
hdfs简单操做举例
[root@hadoop ~]# hdfs dfs #显示全部的命令
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] [-t <thread count>] <localsrc> ... <dst>]
    [-copyToLocal [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
    [-count [-q] [-h] [-v] [-t [<storage type>]] [-u] [-x] [-e] <path> ...]
    [-cp [-f] [-p | -p[topax]] [-d] <src> ... <dst>]
    [-createSnapshot <snapshotDir> [<snapshotName>]]
    [-deleteSnapshot <snapshotDir> <snapshotName>]
    [-df [-h] [<path> ...]]
    [-du [-s] [-h] [-v] [-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>]
    [-head <file>]
    [-help [cmd ...]]
    [-ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] [-e] [<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 ...]]

Generic options supported are:
-conf <configuration file>        specify an application configuration file
-D <property=value>               define a value for a given property
-fs <file:///|hdfs://namenode:port> specify default filesystem URL to use, overrides 'fs.defaultFS' property from configurations.
-jt <local|resourcemanager:port>  specify a ResourceManager
-files <file1,...>                specify a comma-separated list of files to be copied to the map reduce cluster
-libjars <jar1,...>               specify a comma-separated list of jar files to be included in the classpath
-archives <archive1,...>          specify a comma-separated list of archives to be unarchived on the compute machines

The general command line syntax is:
command [genericOptions] [commandOptions]
hdfs dfs -前缀命令
[root@hadoop var]# hadoop fs
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] [-t <thread count>] <localsrc> ... <dst>]
    [-copyToLocal [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
    [-count [-q] [-h] [-v] [-t [<storage type>]] [-u] [-x] [-e] <path> ...]
    [-cp [-f] [-p | -p[topax]] [-d] <src> ... <dst>]
    [-createSnapshot <snapshotDir> [<snapshotName>]]
    [-deleteSnapshot <snapshotDir> <snapshotName>]
    [-df [-h] [<path> ...]]
    [-du [-s] [-h] [-v] [-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>]
    [-head <file>]
    [-help [cmd ...]]
    [-ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] [-e] [<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 ...]]

Generic options supported are:
-conf <configuration file>        specify an application configuration file
-D <property=value>               define a value for a given property
-fs <file:///|hdfs://namenode:port> specify default filesystem URL to use, overrides 'fs.defaultFS' property from configurations.
-jt <local|resourcemanager:port>  specify a ResourceManager
-files <file1,...>                specify a comma-separated list of files to be copied to the map reduce cluster
-libjars <jar1,...>               specify a comma-separated list of jar files to be included in the classpath
-archives <archive1,...>          specify a comma-separated list of archives to be unarchived on the compute machines

The general command line syntax is:
command [genericOptions] [commandOptions]
hadoop fs -前缀命令

附两个查看hdfs shell命令的网址:

http://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-common/FileSystemShell.html

http://hadoop.apache.org/docs/r2.6.2/hadoop-project-dist/hadoop-common/FileSystemShell.html

 

10.HDFS管理与更新

(1) 查看HDFS基本统计信息 hdfs dfsadmin -report

[root@hadoop ~]# hdfs dfsadmin -report               #如下是我本身翻译的,若有问题欢迎指正。
Configured Capacity: 19315818496 (17.99 GB)          #配置容量:1931581849617.99 GB)
Present Capacity: 11839451136 (11.03 GB)             #现有容量:1183945113611.03 GB)
DFS Remaining: 11838365696 (11.03 GB)                #分布式文件系统剩余:1183836569611.03 GB)
DFS Used: 1085440 (1.04 MB)                          #分布式文件系统已使用:10854401.04 MB)
DFS Used%: 0.01%                                     #分布式文件系统已使用百分比:0.01%
Replicated Blocks:                                   #复制块:
    Under replicated blocks: 4                       #    已复制块数:4
    Blocks with corrupt replicas: 0                  #    具备损坏副本的块数:0
    Missing blocks: 0                                #    丢失块数:0
    Missing blocks (with replication factor 1): 0    #    丢失块数(复制因子为1):0
    Pending deletion blocks: 0                       #    待删除块:0
Erasure Coded Block Groups:                          #擦除编码块组:
    Low redundancy block groups: 0                   #    低冗余块组:0
    Block groups with corrupt internal blocks: 0     #    内部块损坏的块组:
    Missing block groups: 0                          #    丢失块组:0
    Pending deletion blocks: 0                       #    待删除块:0
                                                     #
-------------------------------------------------    #
Live datanodes (1):                                  #实时数据节点(1)
                                                     #
Name: 192.168.42.134:9866 (hadoop)                   #名称:192.168.42.1349866(hadoop)
Hostname: hadoop                                     #主机名:hadoop
Decommission Status : Normal                         #退役状态:正常(未被移除)
Configured Capacity: 19315818496 (17.99 GB)          #配置容量:1931581849617.99 GB)
DFS Used: 1085440 (1.04 MB)                          #DFS已使用:10854401.04 MB)
Non DFS Used: 7476367360 (6.96 GB)                   #非DFS使用:74763673606.96 GB)
DFS Remaining: 11838365696 (11.03 GB)                #DFS剩余:1183836569611.03 GB)
DFS Used%: 0.01%                                     #DFS使用%:0.01%
DFS Remaining%: 61.29%                               #DFS剩余%:61.29%
Configured Cache Capacity: 0 (0 B)                   #配置的缓存容量:00 B)
Cache Used: 0 (0 B)                                  #缓存已使用:00 B)
Cache Remaining: 0 (0 B)                             #缓存剩余:00 B)
Cache Used%: 100.00%                                 #缓存已使用%:100.00%  
Cache Remaining%: 0.00%                              #缓存剩余%:0.00% 
Xceivers: 1                                          #Xceivers: 1  
Last contact: Fri Jul 20 04:58:17 EDT 2018           #上次链接时间:
Last Block Report: Fri Jul 20 03:04:12 EDT 2018      #上次发送块报告时间:
Num of Blocks: 10                                    #块数:10
View Code

(2) 进入安全模式

[root@hadoop mapreduce]# hdfs dfsadmin -safemode enter
Safe mode is ON

(3) 退出安全模式

[root@hadoop mapreduce]# hdfs dfsadmin -safemode leave
Safe mode is OFF

(4) 负载均衡
HDFS的数据在各个DataNode中的分布可能很不均匀,尤为是在DataNode节点出现故障或新增DataNode节点时。新增数据块时NameNode对DataNode节点的选择策略也有可能致使数据块分布的不均匀。用户可使用命令从新平衡DataNode上的数据块的分布。

[root@hadoop mapreduce]# start-balancer.sh

 

11.HDFS 优势 VS 缺点

HDFS优势:

高容错性:数据自动保存多个副本;副本丢失后,自动恢复。
适合批处理:移动计算而非数据;数据位置暴露给计算框架。
适合大数据处理:GB、TB、甚至PB级数据;百万规模以上的文件数量;10K+节点。
可构建在廉价机器上:经过多副本提升可靠性;提供了容错和恢复机制。

HDFS缺点:

不适合低延迟数据访问:好比毫秒级;低延迟与高吞吐率。
不适合小文件存取:占用NameNode大量内存;寻道时间超过读取时间。
不适合并发写入、文件随机修改:一个文件只能有一个写者;仅支持append。

 

12.Block的副本放置策略

第一个副本:放置在上传文件的DN;若是是集群外提交,则随机挑选一台磁盘不太满,CPU不太忙的节点。
第二个副本:放置在与第一个副本不一样的机架的节点上。
第三个副本:与第二个副本相同机架的节点上。
更多副本:随机节点。

 

13.HDFS文件权限

与linux文件权限相似:r:read;w:write;x:execte,权限x对于文件忽略,对于文件夹表示是否容许访问其内容。若是Linux系统用户zhangsan使用Hadoop命令建立一个文件,那么这个文件在HDFS中owner就是zhangsan。HDFS的权限目的:阻止好人作错事,而不是阻止坏人作错事。HDFS详细,你告诉我你是谁,我就认为你是谁。说白了,就是HDFS不作密码认证(不知道新版本有没有作这个功能?)。

相关文章
相关标签/搜索