12.2 分布式文件系统

用户头像
张荣召
关注
发布于: 2020 年 12 月 14 日

1.常用RAID技术

   

   RAID0: 优点:读写性能高。缺点:安全性降低。

   RAID1:优点:安全性高。缺点:读写性能低。

   RAID10:优点:既保证了安全性,又保证了读写性能。缺点:磁盘利用率降低。

   RAID5:优点:保证读写性能,保证安全性,利用校验位提高磁盘利用率。业界常用方案。

   RAID6:利用两个校验位,恢复两个磁盘。

   本质:数据分片+复制。

2.HDFS系统架构



   本质:数据分片+复制。

2.1数据存储细节



     r:replication:复制

2.2HDFS设计目标

HDFS以流式数据访问模式存储超大文件,运行于商用硬件集群上。



超大文件(TB级别,不适合小文件)



流式数据访问

  • 一次写入多次读取(一次写入后,不再修改数据,多次读取数据,进行挖掘)

商用硬件

2.3不适合HDFS场景

低延迟的数据访问

大量小文件

  • 超过NameNode的处理能力

多用户随机写入修改文件



MapReduce生成数据,MapReduce访问数据。

MapReduce,Spark的支撑系统。非面向开发者,调用文件系统的编程接口访问系统。



HDFS为了做到可靠性(reliability)创建了多份数据块(Data Blocks)的复制(replicas),

放置它们在服务器群的计算节点中(compute nodes),MapReduce就可以在它们所在的节点上处理这些数据啦。





2.4设计目标

假设:节点失效是常态



理想:

1.任何一个节点失效,不影响HDFS服务

2.HDFS可以自动完成副本的复制。



2.5文件

文件切分成块(默认大小64M),以块为单位,每个块有多个副本存储在不同的机器上,副本可在文件生成时指定(默认为3)。



NameNode是主节点,存储文件的元数据如文件名,文件目录结构,文件属性(生成时间,副本数,文件权限),以及每个文件的块列表,以及块数据的校验和。



可以创建,删除,移动或重命名文件,当文件创建,写入和关闭之后不能修改文件内容。



2.6分而治之(Divide and Conquer)



2.7HDFS如何写文件



2.8HDFS如何读文件

2.9节点失效是常态

  • DataNode中的磁盘挂了怎么办?

  • DataNode所在机器挂了怎么办?

  • NameNode挂了怎么办?

  • Client挂了怎么办?

2.9.1DataNode中的磁盘挂了怎么办?

  • DataNode正常服务

  • 坏掉的磁盘的数据尽快通知NameNode

2.9.2DataNode所在机器挂了怎么办?

问:NameNode怎么知道DataNode挂掉了?

答:DataNode每3秒钟向NameNode发送心跳,如果10分钟DataNode没有向NameNode发送心跳,

       则NameNode认为该DataNode已经dead,NameNode将取出该DataNode上对应的Block,对其进行复制。

2.9.3NameNode挂了怎么办?

持久化元数据

  • 操作日志(edit log)

               记录文件创建,删除,修改文件属性等操作

  • Fsimage

               1.包含完整的命名空间

               2.File->Block的映射关系

               3.文件的属性(ACL,Quota,修改时间等)



关键点:主主复制。只有一个主NameNode处于活动状态,对外提供服务。

             不能两个NameNode都处于活动状态。和数据库的主主复制原理相同。



2.9.4Client挂了怎么办?

问:Client所在机器挂了有什么影响?

答:一致性问题。

2.9.5HDFS一致性模型

  • 文件创建后,不保证在NameNode立即可见,即使文件刷新并存储,文件长度依然可能为0;

  • 当写入数据超过一个块后,新的reader可以看见第一个块,reader不能看见当前正在写入的块。

  • HDFS提供sync()方法强制缓存与数据节点同步,sync()调用成功后,当前写入数据对所有reader可见且一致。

  • 调用sync()会导致额外的开销。

2.9.6副本摆放策略

特点:跨机架复制。数据存放在多个机架中。其中一个机架数据不可用,其他机架仍然可对外提供服务。



数据块block

  • 默认64M,通常设置为128M

  • 可以在hdfs-site.xml中设置

<property>

       <name>dfs.block.size</name>

       <value>134217728</value>

</property>



NameNode参数,在hdfs-site.xml中设置

dfs.name.dir

<property>

      <name>dfs.name.dir</name>

      <value>/data0/name,/nfs/name</value>

      <description>文件存储路径</description> 

</property>



dfs.replication

<property>

      <name>dfs.replication</name>

      <value>3</value>

      <description>副本数</description> 

</property>



dfs.data.dir

<property>

      <name>dfs.data.dir</name>

      <value>/data0/hdfs,/data1/hdfs</value>

      <description>数据存储目录</description> 

</property>

3.Hadoop文件系统

文件系统抽象(org.apache.hadoop)

  • fs.FileSystem

  • fs.LocalFileSystem

  • hdfs.DistributedFileSystem

  • hdfs.HttpFileSystem

  • hdfs.HsftpFileSystem

  • fs.HarFileSystem

4.JAVA接口

通过FileSystem API读取数据

  • Path对象

                  hdfs://localhost:9000/user/tom/t.txt

  • 获取FileSystem实例

                  public  static FileSystem get(Configuration conf) throws IOException;

                  public  static FileSystem get(URI uri,Configuration conf) throws IOException;

  • 获取文件输入流:

                  pubilc FSDataInputStream open(Path p) throws IOException;

                  public abstract FSDataInputStream open(Path p,int bufferSize) throws IOException;



通常不会针对Hadoop文件系统的API接口进行编程。

使用MapReduce,Spark文成数据的读写操作。



用户头像

张荣召

关注

还未添加个人签名 2018.05.02 加入

还未添加个人简介

评论

发布
暂无评论
12.2分布式文件系统