链表合并算法和 HDFS 工作流程
链表合并算法和HDFS工作流程
链表合并算法
题目
有两个单项链表(链表长度分别为m,n),这两个链表可能在某个元素合并,如下图,也可能不合并。现在给出这两个链表的头指针,在不修改链表的情况快速判断两个链表是否合并,如果合并找出合并元素,并给出实现算法的时间复杂度和空间复杂度。
题目分析
合并的部分肯定是链表的尾节点到某个节点之间组成的一个子链表。
分别从两个链表的那个节点开始合并需要从头遍历,但是基于上面的分析可知,应该从尾部开始遍历。
由上面两点可知如果链表倒置的话解题就比较容易了,但是题中要求不改变链表,因此需要从头分别遍历两个链表,然后再从两个链表的尾部开始进行对比,因此需要一个后进先出的数据结构存在遍历后的链表结点
从尾部开始比较遇到第一个不相同的元素则终止合并判断
解题流程
转栈实现方法
现实一个单向链表 Linked.java
单向链表合并判断类 Merge.java
测试
输出结果如下
跳跃指针解法
长链表长度为m,短链表长度为n,将长链表的指定跳跃到m-n的位置,然后两个链表开始进行比较,找到相同的Node或者到链表尾部为止。
本方法需要Linked.java重写equals方法
验证测试
输出结果:
合并链表比较法
链表a和链表b同时遍历,当链表a到尾部时接上链表b继续;当链表b到尾部的时候接上链表a继续,直到遇到两个遍历Node相同或者都再次到尾部为止
本方法需要Linked.java重写equals方法
验证测试
输出结果:
HDFS工作流程
HDFS简介
HDFS,是Hadoop Distributed File System的简称,是Hadoop抽象文件系统的一种实现。Hadoop抽象文件系统可以与本地系统、Amazon S3等集成,甚至可以通过Web协议(webhsfs)来操作。HDFS的文件分布在集群机器上,同时提供副本进行容错及可靠性保证。
HDFS设计原则
设计目标
存储非常大的文件。通常HDFS文件量级是几百M、G、或者TB级别,实际上已经达到了PB级别
采用流式的数据访问方式。流式读取最小化了硬盘的寻址开销,只需要寻址一次,然后就一直连续读取数据
运行于商业硬件上。HDFS运行在普通廉价的普通服务器上
不适用范围
低延时的数据访问。HDFS是为高吞吐数据传输设计的,因此可能牺牲延时,因此对延时要求在毫秒级别的应用不适用。
大量小文件。文件的元数据保存在NameNode的内存中, 整个文件系统的文件数量会受限于NameNode的内存大小,如果存储大量小文件会占据大量内存。
多方读写,需要任意的文件修改 。HDFS采用追加(append-only)的方式写入数据。不支持文件任意offset的修改。不支持多个写入器(writer)。
核心概念
整个HDFS集群由Namenode和Datanode构成master-worker(主从)模式。Namenode负责构建命名空间,管理文件的元数据等,而Datanode负责实际存储数据,负责读写工作。
Namenode
Namenode存放文件系统树及所有文件、目录的元数据。元数据持久化为2种形式:
namespcae image
edit log
Datanode
数据节点负责存储和提取Block,读写请求可能来自namenode,也可能直接来自客户端。数据节点周期性向Namenode汇报自己节点上所存储的Block相关信息。
工作流程
注册流程
DataNode启动后会向NameNode节点发出注册请求,NameNode会将注册结果信息返回给DataNode节点
正常工作流程
注册成功之后DataNode节点周期性(1小时)的向NameNode节点上报所有文件块信息
与此同时DataNode节点还定时(3秒)向NameNode节点发送心跳请求,NameNode节点收到心跳请求之后会给DataNode节点返回指令(负责文件块到其它节点或者删除文件块等)
DataNode故障流程
如果超过10分钟没有收到某个Datanode的心跳,则认为该节点不可用,这个时候NameNode节点会向其它节点发送命令,将故障节点的文件块内容复制到其它节点上,保证每个文件块都是1主2备,等复制完成之后NameNode上的信息更新成功,故障节点的内容就恢复了
整体流程时序图如下:
版权声明: 本文为 InfoQ 作者【拈香(曾德政)】的原创文章。
原文链接:【http://xie.infoq.cn/article/f18ffbb08ac18020bb328d9b1】。文章转载请联系作者。
评论