大家好,又见面了,我是你们的朋友全栈君。
HDFS简介
一、HDFS:Hadoop Distributed File System
1. 一个分布式文件系统
2. 基于流数据模式访问和处理超大文件的需求而开发的
3. 适合应用在大规模数据集上
1.处理超大文件
能用来存储管理PB级的数据 1PB = 1024TB
2.处理非结构化数据、半结构化数据、结构化数据
流式的访问数据
一次写入、多次读取
3.运行于廉价的商用机器集群上
可运行在低廉的商用硬件集群上
故障时能继续运行且不让用户察觉到明显的中断
局限性/缺点:
1. 不适合处理低延迟数据访问
对于低延时的访问需求,HBase是更好的选择
2.无法高效存储大量的小文件
小文件会给Hadoop的扩展性和性能带来严重问题
利用SequenceFile、MapFile等方式归档小文件
3.不支持多用户对一个文件同时写入及任意修改文件
只有一个写入者,只能执行追加操作
不支持多个用户对同一文件的写操作,以及在文件任意位置进行修改
HDFS特性
一、高容错,可扩展性及可配置性强
二、跨平台
三、shell命令接口
四、机架感知功能
五、负载均衡
六、Web界面
HDFS目标
1.检测和快速恢复硬件故障
故障的检测和快速自动恢复是HDFS的一个核心目标
2.流式数据访问
设计成适合进行批量处理
重视数据吞吐量,而不是数据访问的反应速度
3.大规模数据集
支持大文件存储
一个单一的HDFS实例能支撑数以千万计的文件
4.简化一致性模型
对文件实行一次性写入,多次读取的访问模式
5.移动计算代价比移动数据代价低
一个应用请求的计算,离它操作的数据越近就越高效,这在数据达到海量级别的时候更是如此
6.可移植性
HDFS在设计时就考虑到平台的可移植性,这种特性方便了HDFS作为大规模数据应用平台的推广
7.通信协议
所有的通信协议都是在TCP/IP协议之上的
HDFS核心设计
数据块(Block)
数据块是HDFS上最基本的存储单位
HDFS块默认大小为128M (2.0为128M,1.0为64M)
小于一个块大小的文件不会占据整个块的空间
hadoop fsck /sogou.500w.utf8 -files -locations -blocks
对块进行抽象会带来的好处
一个文件的大小可以大于网络中任意一个磁盘的容量
使用块抽象而不是文件可以简化存储子系统
块非常适合用于数据备份进而提供数据容错能力和可用性
数据块复制
HDFS为了做到可靠性(reliability)创建了多份数据块(计算节点中(compute data blocks)的复制(replicas),并将它们放置在服务器群的nodes),MapReduce就可以在它们所在的节点上处理这些数据了。
HDFS将每个文件存储成块(Block)序列
每个文件的Block大小和复制(Replication)因子都是可配置的 hdfs-site.xml
数据副本的存放策略
数据分块存储和副本的存放,是保证可靠性和高性能的关键
将每个文件的数据进行分块存储
每一个数据块又保存有多个副本
这些数据块副本分布在不同的机器节点上
在多数情况下,HDFS默认的副本系数是3
Hadoop默认对3个副本的存放策略
第一块:在本机器的HDFS目录下存储一个Block
第二块:不同Rack(机架)的某个DataNode上存储一个Block
第三块:在该机器的同一个Rack下的某台机器上存储最后一个Block
更能多副本:随机节点
如图所示:
设置集群Block的备份数
方法一:配置文件hdfs-site.xml
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
方法二:通过命令修改备份数
bin/hadoop fs -setrep -R 1 /
注意:方法二可以改变整个HDFS里面的备份数,不需要重启HDFS系统,
而方法一需要重启HDFS系统才能生效。
安全模式(SafeMode)
安全模式是Hadoop集群的一种保护模式
NameNode在启动时会自动进入安全模式,也可以手动进入。
当系统处于安全模式时,会检查数据块的完整性。
用命令来操作安全模式
hadoop dfsadmin -safemode leave //强制NameNode退出安全模式
hadoop dfsadmin -safemode enter //进入安全模式
hadoop dfsadmin -safemode get //查看安全模式状态
hadoop dfsadmin -safemode wait //等待,一直到安全模式结束
负载均衡
机器与机器之间磁盘利用率不平衡是HDFS集群非常容易出现的情况
尤其是在DataNode节点出现故障或在现有的集群上增添新的DataNode的时候
分析数据块分布和重新均衡DataNode上的数据分布的工具
$HADOOP_HOME/bin/start-balancer.sh -t 10%
负载均衡
负载均衡程序作为一个与独立的进程NameNode进程分开执行
心跳机制
机架感知
大型Hadoop集群是以机架的形式来组织的
同一个机架上不同节点间的网络状况比不同机架之间的更为理想
默认情况下,Hadoop的机架感知是没有被启用的
启用机架感知功能,在NameNode所在机器的core-site.xml中配置一个选项:
<property>
<name>topology.script.file.name</name>
<value>/path/to/script</value> <!—value的值是一个脚本–>
</property>
HDFS体系结构
Master/Slave架构
文件切分成块(默认大小128M),以块为单位,每个块有多个副本存储在不同的机器上,副本数可在文件生成时指定(默认3)
NameNode是主节点,存储文件的元数据如文件名,文件目录结构,文件属性(生成时间,副本数,文件权限),以及每个文件的块列表以及块所在的DataNode等等
DataNode在本地文件系统存储文件块数据,以及块数据的校验
主要组件的功能
NameNode |
DataNode |
存储元数据 |
存储文件内容 |
元数据保存在内存中 |
文件内容保存在磁盘 |
保存文件,block ,datanode之间的映射关系 |
维护了block id到datanode本地文件的映射关系 |
NameNode
Namenode是一个中心服务器,单一节点,负责管理文件系统的名字空间(namespace)以及客户端对文件的访问
文件操作,NameNode负责文件元数据的操作,DataNode负责处理文件内容的读写请求,数据流不经过NameNode,只会询问它跟那个DataNode联系
副本存放在那些DataNode上由NameNode来控制,根据全局情况做出块放置决定,读取文件时NameNode尽量让用户先读取最近的副本,降低带宽消耗和读取时延
NameNode全权管理数据块的复制,它周期性地从集群中的每个DataNode接收心跳信号和块状态报告(BlockReport)。接收到心跳信号意味着该DataNode节点工作正常。块状态报告包含了一个该DataNode上所有数据块的列表。
DataNode
一个数据块在DataNode上以文件存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳
DataNode启动后向NameNode注册,通过后,周期性(1小时)的向NameNode上报所有的块信息
心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令,如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟NameNode没有收到某个DataNode 的心跳信息,则NameNode认为该DataNode节点已死亡不可用。
SecondaryNameNode
辅助的NameNode
周期性将EditsLog文件合并
工作原理,如图所示
工作流程
secondarynamenode通知namenode切换edits文件
secondarynamenode从namenode获得fsimage和edits(通过http)
secondarynamenode将fsimage载入内存,然后开始合并edits
secondarynamenode将新的fsimage发回给namenode
namenode用新的fsimage替换旧的fsimage
什么时候checkpiont
fs.checkpoint.period 指定两次checkpoint的最大时间间隔,默认3600秒。
fs.checkpoint.size 规定edits文件的最大值,一旦超过这个值则强制checkpoint,不管是否到达最大时间间隔。默认大小是64M
数据损坏处理
当DN读取block的时候,它会计算checksum;
如果计算后的checksum,与block创建时值不一样,说明该block已经损坏。
client读取其它DN上的block;NN标记该块已经损坏,然后复制block达到预期设置的文件备份数;
DN在其文件创建后三周验证其checksum。
HDFS文件权限
与Linux文件权限类似
r: read; w:write; x:execute,权限x对于文件忽略,对于文件夹表示是否允许访问其内容
如果Linux系统用户zhangsan使用hadoop命令创建一个文件,那么这个文件在HDFS中owner是zhangsan
HDFS的权限目的:阻止好人做错事,而不是阻止坏人做坏事。HDFS相信,你告诉我你是谁,我就认为你是谁
Root 用户只能查看,不能写入
hadoop dfs -chmod 777 /
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/137837.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...