笔者也是接触大数据不久,大数据很多理论,也分为很多模块,在学习途中遇到了许多问题,在这过程中希望自己能将学到的东西整理下来,分享出来,知识不仅是自己的,也可以给大家进行借鉴。
一、HDFS概述
- HDFS其实在我看来应该是整个Hadoop生态系统中比较简单的知识部分了,HDFS全称Hadoop Distribute File System,可分布式的文件系统,可分布就意味着它可以存储超大文件,这是它最大的优势,它在Hadoop中的地位就相当于Windows中我们使用的文件系统。
- HDFS是基于流式的访问模式,也就是说存放在HDFS中的数据一定是流式数据,是可序列化和反序列化的数据,这样做的好处是可以将超大文件序列化为字节的序列或者字节数组来储存,不会破坏文件的结构。
这方面百度就可以查到更加详细的资料,这里就不再多写了。
二、HDFS的优势
- 处理超大文件
- 处理非结构化数据:这里需要说明的是结构化的数据就是我们经常用的表结构,很规则,可用sql写的,半结构化的数据则是我们经常用到的word和PPT等文档类的数据,非结构化的数据则是指视频、音频和图片等数据。
- 流式数据访问
- 运行于廉价的商务集群搭建
- 发生故障时能继续运行且不被用户发现:这一点用到了HDFS的副本放置策略,随后会说到
三、HDFS的局限性
有优点必然会存在缺点,HDFS存在以下几个缺点
- 不适合处理低延迟的数据访问,HDFS可以说是用来存储数据的好手,对于数据吞吐量这一块来说很有优势,但是处理毫秒级别的低延迟数据,HDFS捉襟见肘,不过HBase可以补这一块的短板
- 无法高效存储小型文件,因为HDFS存储机制是以块为单位进行存储的,所以不适合存储小型文件,这一块后面会说到。
- 不支持多用户写入及任意修改同一文件,这个缺点可以从数据访问上来进行解读,HDFS数据存储是以块的形式进行存储的,也就是说将一个大文件分成了很多块,牵一发而动全身。当然也可以从线程安全的角度上来说,这些都是可以的。
笔者在这里整理的不是很全面,因为这些不是重点,后面的一些核心设计才是HDFS的精华
四、HDFS核心设计
HDFS核心设计包含了数据块,数据块的复制,数据块副本存放策略,机架感知,数据块的备份数,安全模式,负载均衡以及心跳机制等功能模块的设计。以下将从以上几点进行学习
数据块
让我们先来看看什么是数据块?
数据块就是HDFS中存储数据的基本单位,其实任何一个文件系统都有数据块的概念,负责存储数据信息,HDFS中将数据的存储划分为块,每一个文件存储进来都会被切分成块,在Hadoop2.0中每一个块的单位就是128M,这样做的好处在于非常容易进行备份。
当文件丢失了,不用将整个文件找回,只需要找到某一个数据块即可。
使用工具上传了一个文件
在hdfs中查询以下看看这个文件的状态:
这是我们上传文件的一个状态,HDFS提供可视化的web界面,
访问ip:50070
可查看当前的节点状态,以及存储文件的状态。
数据块带来以下三点好处
- 数据块大小都是128M,这个值是可以在hadoop中进行改变的,将大文件切块成小文件可以方便在任意服务器上进行存储
- 更加容易操作,对文件的操作不在争对于文件,而是对于数据块,对于集群中任意节点上文件数据的存储就变得更加容易
- 数据块利于数据的备份,进而提高数据的容错能力和可用性
数据块的复制
这是HDFS的一大特殊,多副本机制
将超大文件切分为块了之后,可以创建多份数据块的副本(Replicas),并将他们放在DataNode节点上,有利于MapReduce分布式并行计算框架可以在数据块所在的节点上处理这些数据。
一般每一块数据会被复制成为3份,每一份是128M,在使用数据的时候会随机选取一份进行使用,而这些备份数一大小,都是可以在hdfs-site.xml
中进行修改。
数据块副本存放机制
既然数据块可以进行复制,一般来说复制成为3份,那么这3份文件该如何进行放置,HDFS又是怎么进行选择的。
这里就会用到HDFS的副本存放策略了。
- 首先复制了3个数据块,因为当集群节点特别多的时候,如果客户端离集群节点很远,那么就会造成资料浪费,所以原则上第一个节点是与客户端一起的节点中进行存放,如果客户端不在集群范围内,原则上随机选择一个节点进行存,但是也是选择离客户端最近的。
- 第二个节点是与第一个节点存放在不同的机架上(
机架下面说到
),随机选取。 - 第三个副本放在与第一个副本一样的节点
机架感知
这里就要说到上面说的机架感知了。
机架感知就是:整个副本的存放的实现原理被称为Hadoop的机架感知
机架感知在hdfs中默认是关闭的,可以通过core-site.xml进行配置
<property>
<name>topology.script.file.name</name>
<value>/etc/hadoop/conf/RackAware.py</value>
</property>
RackAware.py是一个python的脚本文件,具体配置需要看情况进行。
#!/usr/bin/python
#-*-coding:UTF-8 -*-
import sys
rack = {"NN01":"rack2",
"NN02":"rack3",
"DN01":"rack4",
"DN02":"rack4",
"DN03":"rack1",
"DN04":"rack3",
"DN05":"rack1",
"DN06":"rack4",
"DN07":"rack1",
"DN08":"rack2",
"DN09":"rack1",
"DN10":"rack2",
"172.16.145.32":"rack2",
"172.16.145.33":"rack3",
"172.16.145.34":"rack4",
"172.16.145.35":"rack4",
"172.16.145.36":"rack1",
"172.16.145.37":"rack3",
"172.16.145.38":"rack1",
"172.16.145.39":"rack4",
"172.16.145.40":"rack1",
"172.16.145.41":"rack2",
"172.16.145.42":"rack1",
"172.16.145.43":"rack2",
}
if __name__=="__main__":
print "/" + rack.get(sys.argv[1],"rack0")
编写好py文件后,对权限进行说明
chmod +x RackAware.py
重启Namenode,Namenode会显示启动机架成功
hdfs namenode -format
安全模式
安全模式是Hadoop集群中的一种保护模式,NameNode在启动时会自动进入安全模式,也可以手动进入安全模式。
安全模式:是指在不加载第三方设备驱动的程序的情况下启动计算机,是计算机运行在最简单的模式,这样用户可以方便进行检查和修复计算机的错误
当Hadoop集群处于安全模式中时,HDFS会自动检查数据块的完整性,此时不提供写操作
,如果一份副本损坏,HDFS会周期性的对数据块的完整性进行检查,对于损坏的数据块会及时向NameNode汇报并做好标记,随后由NameNode会负责对进行标记的数据进行修复。
当然,进入安全模式后,NameNode只负责数据块完整性的校验工作。
进入安全模式
hadoop dfsadmin -safemode enter
查看安全模式状态
hadoop dfsadmin -safemode get
等待安全模式结束
hadoop dfsadmin -safemode wait
强制退出安全模式
hadoop dfsadmin -safemode leave
负载均衡
在Hadoop的HDFS网络集群中,由于集群规模的庞大,非常容易出现服务器于服务器之间磁盘利用率步均衡的情况,例如集群内新增,删除节点,或者某个节点机器内硬盘存储达到饱和值。
启动方式,在Hadoop中包含一个start-balancer.sh脚本,通过运行它,可以启动HDFS数据均衡服务。