分布式文件系统HDFS

一、namenode的职责:
①,记录整个集群存储了哪些文件,文件名,文件的大小,文件被切成几块,每一块存储的位置,以及副本块的信息,以上信息统称为元数据(Metadata)信息,管理元数据信息,不存储文件块。
②,通过RPC心跳机制管理和检测datanode集群中节点的状态信息。
③,为了达到数据的可靠性,引入副本冗余机制,Hadoop默认采用的是3副本策略
④,namanode会将元数据信息放在内存中,供用户快速查询,此外为了确保元数据的可靠性,会将元数据持久化到硬盘上。
⑤,Hadoop是通过两个文件来进行元数据的存储的,Fsimage文件存储的是整个元数据的信息,Edits文件存储的是操作记录,每次客户端发起的操作都会先写到整个Edits文件中,然后这两个文件会定期做合并,确保Fsimage文件里的元数据信息是最新的。
⑥,hadoop namenode -format 这是HDFS的格式化指令,作用就是初次使用HDFS时,生成新的Fsimage文件和Edits文件。这个指令可以通过配置文件使起生效,在hdfs-site.xml文件中配置dfs.namenode.support.allow.format为true或者false来决定是否开启,建议在生产系统中,初次格式化后,将其设置为false,防止其他人误操作,导致数据丢失。
⑦,再启动HDFS中,如果发现少进程,可以尝试多次启动,如果多次启动还是不行,则可以:删除tmp->创建tmp->执行格式化指令->启动HDFS(注意这个操作是在自己练习时可以使用,真正生产环境千万不要用)
⑧,如果在企业中,通过jps发现少线程(比如:少namenode),可以通过sh hadoop-daemon.sh start namenode来启动
⑨,如果还是启动不了,可以查看日志文件,根据日志文件中的信息调试。
⑩,每次分布式文件系统启动时,各个datanode会向Namenode汇报自身的文件块信息,Namenode会进行检测,比如文件块是否达到要求,如果未达到数量的要求,会进行块的复制,此时,HDFS会进入安全模式,在安全模式下,只能提供读服务,不能写服务。


二、安装并配置hadoop(单机模式下的伪分布式)
①上传压缩包,并解压
②修改配置文件,进入hadoop目录下的etc/hadoop/下,首先编辑vim hadoop-env.sh
将其中的JAVA_HOME指向java的安装目录,然后再将HADOOP_CONF_DIR指向hadoop的配置目录,到此该文件配置结束,接下来vim core-site.xml
在该文件的configuration标签中添加以下信息
<property>
<name>fs.default.name</name>
<value>hdfs://hadoop01:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/szl_software/Hadoop/hadoop-2.7.1/tmp</value>
</property>


<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>
配置完成之后,保存并退出,接下来配置另一个文件vim hdfs-site.xml,在configuration标签中添加以下信息:
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
配置完成后,保存并退出,接下来配置另一个文件vim mapred-site.xml,注意该文件开始没有,而是有一个mapred-site.xml.template的模版文件,可以使用cp 指令拷贝一个,然后开始编辑vim mapred-site.xml,在其中加入以下配置
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
配置完成后保存并退出,接下来配置另一个vim yarn-site.xml在其中加入以下配置:
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop01</value>
</property>
<property>
<name>yarn.namenodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
配置完成后,保存并退出,接下来配置另一个文件
vim slaves在其中配置从服务器的节点IP但是由于是单机模式,所以只能在其中配置本机的hadoop01
最后别忘了在hadoop安装目录手动创建tmp,接下来可以配置Hadoop的环境变量(不强制,方便在任何目录中启动Hadoop),如果是第一次配置Hadoop,再启动前,需要使用hadoop namenode -format 格式化一下,然后通过sh start-dfs.sh指令来启动hdfs.启动完成后,可以通过jps查看是否有NameNode,SecondaryNameNode和DataNode三个进程,如果有就证明配置启动成功
三,HDFS的一些细节
Fsiamge 文件和 Edits的合并是交给SNN来做的,这样的目的是可以保证NN和SNN都有元数
据。这样在NN宕机后,SNN可以顶替工作。
比如3点钟合一次,下一次合并是4点,如果在3.30NN宕机,则会丢失半小时的元数据。
总结:SNN的合并机制不是实时备份机制,可能会造成元数据丢失,这是Hadoop1.0的机
制。所以Hadoop1.0的namdnode还是存在单点故障问题。
Hadoop2.0舍弃了SNN机制,在完全分布式模式下,没有SNN。(注:在伪分布式模式下,会有SNN)
知识点1:无论是Hadoop1.0还是2.0,每次HDFS启动时,namenode都会将Fsimage和Edits文件合并。目的是确保元数据的合并。此外,也可以手动执行合并:hadoop dfsadmin -rollEdits
知识点2:datanode 数据节点,用来存储文件块的
知识点3:物理切块大小,Hadoop1.0 64MB Hadoop2.0 128MB
1.txt : 257MB=》①128MB ②128MB ③1MB
2.txt :100MB=》①100MB
知识点4:HDFS是否适合存储海量的小文件?
不适合,因为会占用过大的元数据信息保存,从而占用namenode的内存空间。(根据经验,一条元数据信息占用150字节)。如果内存不够用,可以考虑联邦机制。
知识点5:HDFS的适用场景:once-write-many-read 一次写入,多次读取的场景。
HDFS不允许修改文件数据。Hadoop2.0允许追加数据(注意:不是修改)
知识点6:HDFS不支持并行写
知识点7:namenode 名字节点。最主要的职责是管理HDFS的元数据信息。不存储文件块。
知识点8:namenode通过RPC心跳机制管理Datanode的节点状态
知识点9:namenode会将元数据信息放在内存中,供用户快速查询。此外为了确保元数据的
可靠性,会将元数据持久化到磁盘上。
知识点10:Hadoop是通过两个文件来进行元数据的存储,Fsimage文件存储的是整个元数据
信息,Edits文件存储的是操作记录,每次客户端发起的操作都会先写到整个Edtis文件里。 然后这个文件会定期(3600s)做合并,确保Fsiamge文件里的元数据信息是最新的。
知识点11:hadoop namenode -format 这是HFDS的格式指令,作用就是初次使用HDFS时,生成新的Fsimage文件和Edits文件。

知识点12:在启动HFDS中,如果发现少进程,可以尝试多次启动。如果多次启动还是不行,

步骤:删除tmp->创建tmp->执行格式化指令->启动HDFS(练习环境使用)

四 ,HDFS各流程图

1.HDFS架构图

分布式文件系统HDFS

1.namenode 管理元数据

2.datanode 存储文件块

3.Block 文件块,BlockSize 128MB

4.Replication 文件块的副本

5.Rack 机架

6.Client 通过API后指令操作的一端(比如上传或下载文件,操作文件)

 2. HDFS读取文件的流程

分布式文件系统HDFS

1.open file  Client找namenode获取指定文件的元数据。此外会检查文件路径的合法性,以及客户端的权限,

2.如果第一步的检测都通过,namenode会将元数据信息封装到输入流(FSDataInputStream),返回给客户端。

3.4 Client根据元数据信息去对应的Datanode读取文件块。按顺序读取。

5.读完之后关流

3. HDFS上传文件流程

分布式文件系统HDFS

1.Create file 获取分布式文件系统的输出流,去找namenode,namenode首先会检查路径的合法性以及客户端的权限,如果检测通过,对指定的文件的切块信息做分配,比如每个块发配到哪个datanode上,以及相应块的副本的分配。将这些信息封装到输出流返回给客户端。

2.客户端发送文件块,发给 datanode->datanode->datanode,每个datanode收到文件块收,会向上游发送ack机制,目的是确保文件块的副本数量到达要求。到达第五步之后,客户端就可以发送下一个文件块了。

注意:packet 是一个64kb大小的数据包,即Client发送的是一个一个的packet

全双工通信

pipeline数据流管道的设计思想及好处:

分布式文件系统HDFS

4. HDFS删除文件流程

比如我们在通过指令删除一个文件时:hadoop fs -rm /park01/1.txt

当执行这个指令后,文件不是马上从HDFS上被移除。

1.txt ①—>datanode01  ②——>datanode02  ③——>datanode03

当每个datanode向namenode发送RPC心跳时,会收到对应删除块的指令,从而从磁盘上删除文件块。