不同的业务模块部署在不同的服务器上,或者同一个业务模块分拆多个子业务,部署在不同的服务器上,解决高并发的问题。
HDFS 分布式文件存储系统
管理者:NameNode
工作者:DataNode
辅助者:SecondayNameNode
MapReduce 分布式离线计算框架
Yarn Hadoop资源调度器
管理者:ResourceManager
工作者:NodeManager
第1个副本存放在客户端,如果客户端不在集群内,就在集群内随机挑选一个合适的节点进行存放;
第2个副本存放在与第1个副本同机架且不同节点,按照一定的规则挑选一个合适的节点进行存放;
第3个副本存放在与第1、2个副本不同机架且距第1个副本逻辑距离最短的机架,按照一定的规则挑选一个合适的节点进行存放;
一:管理,维护文件系统的元数据/名字空间/目录树
管理数据与节点之间的映射关系(管理文件系统中每个文件/目录的block块信息),
二:管理DataNode汇报的心跳日志/报告
三:客户端和DataNode之间的桥梁(元数据信息共享)
一:负责数据的读写操作
二:周期性的向NameNode汇报心跳日志/报告
三:执行数据流水线的复制
通俗的来说就是nameNode通过读取我们的配置来配置各个节点所在的机架信息
(告诉 Hadoop 集群中哪台机器属于哪个机架)
NameNode分配节点的时候 (数据的流水线复制和HDFS复制副本时)
1、 client发起文件上传请求,通过RPC与NameNode建立通讯,NameNode检查目标文件是否已存在,父目录是否存在,返回是否可以上传;
2、 client请求第一个block该传输到哪些DataNode服务器上;
3、 NameNode根据配置文件中指定的备份数量及机架感知原理进行文件分配,返回可用的DataNode的地址如:A,B,C;
4、 client请求3台DataNode中的一台A上传数据(本质上是一个RPC调用,建立pipeline),A收到请求会继续调用B,然后B调用C,将整个pipeline建立完成,后逐级返回client;
5、 client开始往A上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位(默认64K),A收到一个packet就会传给B,B传给C;A每传一个packet会放入一个应答队列等待应答。
6、 数据被分割成一个个packet数据包在pipeline上依次传输,在pipeline反方向上,逐个发送ack(命令正确应答),最终由pipeline中第一个DataNode节点A将pipelineack发送给client;
7、关闭写入流。
8、 当一个block传输完成之后,client再次请求NameNode上传第二个block到服务器。
1、客户端通过调用FileSystem对象的open()来读取希望打开的文件。
2、 Client向NameNode发起RPC请求,来确定请求文件block所在的位置;
3、 NameNode会视情况返回文件的部分或者全部block列表,对于每个block,NameNode 都会返回含有该 block 副本的 DataNode 地址; 这些返回的 DN 地址,会按照集群拓扑结构得出 DataNode 与客户端的距离,然后进行排序,排序两个规则:网络拓扑结构中距离 Client 近的排靠前;心跳机制中超时汇报的 DN 状态为 STALE,这样的排靠后;
4、 Client 选取排序靠前的 DataNode 来读取 block,如果客户端本身就是DataNode,那么将从本地直接获取数据(短路读取特性);
5、 底层上本质是建立 Socket Stream(FSDataOutputStream),重复的调用父类 DataInputStream 的 read 方法,直到这个块上的数据读取完毕;
6、并行读取,若失败重新读取
7、 当读完列表的 block 后,若文件读取还没有结束,客户端会继续向NameNode 获取下一批的 block 列表;
8、返回后续block列表
9、 最终关闭读流,并将读取来所有的 block 会合并成一个完整的最终文件。
说明:
1、读取完一个 block 都会进行 checksum 验证,如果读取 DataNode 时出现错误,客户端会通知 NameNode,然后再从下一个拥有该 block 副本的DataNode 继续读。
2、read 方法是并行的读取 block 信息,不是一块一块的读取;NameNode 只是返回Client请求包含块的DataNode地址,并不是返回请求块的数据;
数据写入完毕以后进行校验和
数据读取之前进行校验和
对比判断是否有数据丢失
NameNode会周期性的通过DataNode汇报的心跳信息中获取block块的校验和进行检查数据完整性,如果发现校验和不一致,会从其他副本节点复制数据进行恢复,从而保证数据的完整性
1、海量数据存储
2、大文件存储
3.高容错性
a.数据自动保存多个副本;通过增加副本的形式,提高容错性
b.某一个副本丢失以后,可以自动恢复,这是由 HDFS 内部机制实现的
1.不擅长低延时数据访问
由于hadoop针对高数据吞吐量做了优化,牺牲了获取数据的延迟,所以对于低延迟访问数据的业务需求不适合HDFS。
2.不擅长大量小文件存储
存储大量小文件的话,它会占用 NameNode大量的内存来存储文件、目录和块信息。这样是不可取的,因为NameNode的内存总是有限的。
3.不支持多用户并发写入一个文本
同一时间内,只能有一个用户执行写操作
4.不支持文件随机修改(多次写入,一次读取)
仅支持数据末尾 append(追加),不支持文件的随机修改。
在集群重启(二次启动)的时候
人为进入
安全模式中只能读取数据,不能修改数据(增、删、改)
在安全模式下集群在进行恢复元数据,即在合并fsimage和edits log,并且接受datanode的心跳信息,
恢复block的位置信息,将集群恢复到上次关机前的状态
进入:hdfs dfsadmin -safemode enter
退出:hdfs dfsadmin -safemode leave
fsimage存储的是系统最近一次关机前的集群镜像,
edits是客户端对HDFS文件系统的所有操作日志
恢复集群到上次关机前的状态
1.在集群二次启动时,会使用fsimage和edits合并进行恢复元数据
2.SecondayNameNode周期性的拉取fsimage和edits进行合并生成新的fsimage
NameNode创建一个Edits.new
SNN从NameNode节点拷贝Fsimage和Edits文件到SNN---->SNN将两个文件导入内存进行合并操作生成一个新的Fsimage.ckpt文件--->
SNN将新的Fsimage.ckpt发送到NameNode节点----->重命名为Fsimage替换原先的Fsimage---------->原先的Edits生成Edits.new文件--->将Edits替换为新的Edits.new
一:进行Fsimage和Edits的合并操作,减少edits日志大小,加快集群的启动速度
二:将Fsimage与Edits进行备份,防止丢失
1.时间维度,默认一小时触发一次 dfs.namenode.checkpoint.period :3600
2.次数维度,默认100万次触发一次 dfs.namenode.checkpoint.txns : 1000000
3、六十秒判断一次是否达到100W
进入到SNN的数据存储文件夹----->将最新版本的Fsimage以及Edits拷贝至nameNode节点,放在NN节点相应的配置目录下----->重启集群
1.配置JDK
2.配置SSH免密钥
3.关闭防火墙
4.关闭selinux
5.修改主机名
6.修改hosts
* 在配置文件目录添加dfs.hosts白名单文件,文件中加入包括新增节点在内的所有节点
* 在hdfs.site.xml中配置白名单文件生效
dfs.hosts
/export/install/hadoop-2.6.0-cdh5.14.0/etc/hadoop/dfs.hosts
* 配置slaves文件,将新增节点加入
* 刷新hdfs和yarn
hdfs dfsadmin -refreshNodes
yarn rmadmin -refreshNodes
* 新节点开启相应服务
浏览WEB界面
HDFS -> local :hadoop fs -getmerge 小文件目录 下载的目录
local -> HDFS : 遍历所有的已有小文件追加到一个文件中,再上传(文件不在HDFS)
dfs.permissions
//实例Configuration
Configuration configuration = new Configuration();
//实例文件系统
FileSystem fileSystem = FileSystem.get(new URI("hdfs://192.168.100.88:8082"),configuration);
//使用文件系统对象调用mkdirs(相应的API )
boolean mkdirs = fileSystem.mkdirs(new Path("目录路径"));
属性 | 含义 |
---|---|
Overview | 集群的概述 |
Started | 表示集群启动的时间 |
Version | 表示我们使用的Hadoop的版本 |
Compiled | 表示Hadoop的安装包(hadoop-2.7.5.tar.gz)编译打包的时间,以及编译的作者等信息 |
Cluster ID | 表示当前HDFS集群的唯一ID |
Block Pool ID | 块池的 ID (表示当前HDFS的当前的NameNode的ID,我们知道通过HDFS Federation (联盟)的配置,我们可以为一个HDFS集群配置多个NameNode,每一个NameNode都会分配一个Block Pool ID) |
属性 | 含义 |
---|---|
Security is off/on | 表示当前的HDFS集群是否启动安全机制 |
Safemode is off | 表示当前的HDFS集群不在安全模式,如果显示的是Safemode is on的话,则表示集群处于安全模式,那么这个时候的HDFS集群是不能用的 |
17 files and directories, 2 blocks = 19 total filesystem object(s).
表示当前HDFS集群包含了 17个文件或者目录,以及2个数据块,那么在NameNode的内存中肯定有17+ 2 = 19个文件系统的对象存在
Heap Memory used 51.3 MB of 60.05 MB Heap Memory. Max Heap Memory is 966.69 MB.
表示NameNode的堆内存(Heap Memory)是60.05MB,已经使用了51.3MB,堆内存最大为966.69MB,
Non Heap Memory used 62.89 MB of 64 MB Commited Non Heap Memory. Max Non Heap Memory is .
表示NameNode的非堆内存的使用情况,有效的非堆内存是64MB,已经使用了62.89MB。没有限制最大的非堆内存,但是非堆内存加上堆内存不能大于虚拟机申请的最大内存(默认是1000M)
属性 | 含义 |
---|---|
Configured Capacity | 表示当前HDFS集群的磁盘总容量。 |
DFS Used | 表示HDFS已经使用的磁盘容量 ,说白了就是HDFS文件系统上文件的总大小(包含了每一个数据块的副本的大小) |
Non DFS Used | 表示在任何DataNodes节点上,不在配置的dfs.datanode.data.dir里面的数据所占的磁盘容量。 |
DFS Remaining = Configured Capacity - DFS Used - Non DFS Used。
这是HDFS上实际可以使用的总容量
属性 | 含义 |
---|---|
Block Pool Used | 表示当前的Block Pool使用的磁盘容量 |
DataNodes usages%(Min/Median/Max/stdDev) | 表示所有的DataNode的磁盘使用情况(最小/平均/最大/方差) |
Live Nodes | 表示存活的DataNode节点的数量。 |
Dead Nodes | 表示死的DateNode节点的数量 |
Decommissioning Nodes | 表示退役的DataNode节点的数量 |
Entering Maintenance Nodes | 进入维护的DataNode节点 |
Total Datanode Volume Failures | 数据节点卷失败的总数 |
Number of Under-Replicated Blocks | 复制不足的块数 |
Number of Blocks Pending Deletion | 挂起删除的块数 |
Block Deletion Start Time | 块删除的开始时间 |
Last Checkpoint Time | 上次检查点时间 |
集群启动时加载的fsimage和edits
启动时加载的fsimage: fsimage_0000000000000000537
启动时加载的edits:edits_0000000000000000538-0000000000000000538
Snapshot Summary:快照摘要
Snapshottable directories : 快照目录列表:2
Snapshotted directories: 已创建的快照目录:4
Datanode usage histogram: 数据节点使用率柱状图
最后:能力有限,如果有什么不对的地方欢迎给我留言指正.