12.2 分布式文件系统
1.常用RAID技术
![](https://static001.geekbang.org/infoq/1c/1c5be14ffc82bd07d1c76b48e7813eca.png)
RAID0: 优点:读写性能高。缺点:安全性降低。
RAID1:优点:安全性高。缺点:读写性能低。
RAID10:优点:既保证了安全性,又保证了读写性能。缺点:磁盘利用率降低。
RAID5:优点:保证读写性能,保证安全性,利用校验位提高磁盘利用率。业界常用方案。
RAID6:利用两个校验位,恢复两个磁盘。
本质:数据分片+复制。
2.HDFS系统架构
![](https://static001.geekbang.org/infoq/80/80150fbe83b5cd88cdcf183d66eeb3e6.png)
本质:数据分片+复制。
2.1数据存储细节
![](https://static001.geekbang.org/infoq/a7/a7bcc6ce812f97d72a1e690d41c9efdf.png)
r:replication:复制
2.2HDFS设计目标
HDFS以流式数据访问模式存储超大文件,运行于商用硬件集群上。
超大文件(TB级别,不适合小文件)
流式数据访问
一次写入多次读取(一次写入后,不再修改数据,多次读取数据,进行挖掘)
商用硬件
2.3不适合HDFS场景
低延迟的数据访问
大量小文件
超过NameNode的处理能力
多用户随机写入修改文件
MapReduce生成数据,MapReduce访问数据。
MapReduce,Spark的支撑系统。非面向开发者,调用文件系统的编程接口访问系统。
HDFS为了做到可靠性(reliability)创建了多份数据块(Data Blocks)的复制(replicas),
放置它们在服务器群的计算节点中(compute nodes),MapReduce就可以在它们所在的节点上处理这些数据啦。
![](https://static001.geekbang.org/infoq/88/8882afc38193993d09537667c73de7bd.png)
2.4设计目标
假设:节点失效是常态
理想:
1.任何一个节点失效,不影响HDFS服务
2.HDFS可以自动完成副本的复制。
2.5文件
文件切分成块(默认大小64M),以块为单位,每个块有多个副本存储在不同的机器上,副本可在文件生成时指定(默认为3)。
NameNode是主节点,存储文件的元数据如文件名,文件目录结构,文件属性(生成时间,副本数,文件权限),以及每个文件的块列表,以及块数据的校验和。
可以创建,删除,移动或重命名文件,当文件创建,写入和关闭之后不能修改文件内容。
2.6分而治之(Divide and Conquer)
![](https://static001.geekbang.org/infoq/ee/ee15bc760a5fd0cdbbda9e6eb122b324.png)
![](https://static001.geekbang.org/infoq/7d/7d0b6e5eea6a246dc21ff7732f5f21a8.png)
2.7HDFS如何写文件
![](https://static001.geekbang.org/infoq/1c/1caf3e6005fbe458c417c6c600d73e98.png)
2.8HDFS如何读文件
![](https://static001.geekbang.org/infoq/ad/adc2ed120d89437ace90bb8b74441899.png)
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,修改时间等)
![](https://static001.geekbang.org/infoq/9a/9ad61fd82e72bea7b742474ffea11327.png)
关键点:主主复制。只有一个主NameNode处于活动状态,对外提供服务。
不能两个NameNode都处于活动状态。和数据库的主主复制原理相同。
2.9.4Client挂了怎么办?
问:Client所在机器挂了有什么影响?
答:一致性问题。
![](https://static001.geekbang.org/infoq/a0/a031779aebcdeaf7836e2591b2473c9c.png)
2.9.5HDFS一致性模型
文件创建后,不保证在NameNode立即可见,即使文件刷新并存储,文件长度依然可能为0;
当写入数据超过一个块后,新的reader可以看见第一个块,reader不能看见当前正在写入的块。
HDFS提供sync()方法强制缓存与数据节点同步,sync()调用成功后,当前写入数据对所有reader可见且一致。
调用sync()会导致额外的开销。
2.9.6副本摆放策略
![](https://static001.geekbang.org/infoq/ed/edb3ccf737e729909dc59b1d47f8f502.png)
特点:跨机架复制。数据存放在多个机架中。其中一个机架数据不可用,其他机架仍然可对外提供服务。
数据块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文成数据的读写操作。
评论