我有一个关于HDFS读/写过程的问题:
假设我们有一个客户端(为了示例,让我们说客户端是HADOOP映射进程)请求从HDFS读取文件和/或将文件写入HDFS,实际对HDFS进行读/写操作的过程是什么?
我知道Namenode有一个进程,每个Datanode都有一个进程,一般来说它们对系统的责任是什么,但在这种情况下我很困惑。
它是客户端的进程本身还是HDFS中有另一个进程,创建并专用于此特定客户端,以便访问和读取/写入HDFS
最后,如果第二个答案为真,那么这个过程是否有可能暂停一段时间?
我做了一些研究,我发现最重要的解决方案是hadoop API的Oozie和JobControl类。
但是,因为我不确定上述工作流程,所以我不确定使用这些工具暂停和恢复的流程。
是客户端的流程还是在HDFS中运行以满足客户请求的流程?
答案 0 :(得分:1)
查看这些SE帖子,了解HDFS写入的工作原理:
Hadoop 2.0 data write operation acknowledgement
Hadoop: HDFS File Writes & Reads
除了文件/块写入之外,上面的问题解释了有关数据节点失败的情况。
为良好的数据节点上的当前块提供一个新的标识,该标识将传递给namenode,以便在以后发生故障的datanode恢复时,将删除失败的datanode上的部分块。从管道中删除失败的datanode,并从两个良好的数据节点构建一个新的管道。
datanode中的一个失败会触发框架的纠正操作。
关于你的第二个问题:
您有两种类型的调度程序:
在暂停和恢复时查看此article
在多应用程序群集环境中,在 Hadoop YARN 内运行的作业的优先级可能低于在 Hadoop YARN 之外运行的作业(如HBase)。为了让位于Hadoop内的其他更高优先级的作业,用户或某些集群级资源调度 服务应该能够暂停和/或恢复Hadoop YARN中的某些特定作业
当Hadoop中的目标作业被暂停时,那些已经分配并运行任务容器的作业将继续运行,直到完成或通过其他方式激活抢占 。但是不会再为目标工作分配新的容器。
相反,当暂停的作业进入恢复模式时,它们将继续从先前的作业进度运行并分配新的任务容器以完成其余的作业。
答案 1 :(得分:0)
据我所知,Datanode从客户端进程接收数据的过程(谁请求在HDFS中存储一些数据)并存储它。然后,此Datanode将完全相同的数据转发到另一个Datanode(以实现复制),依此类推。复制完成后,确认将返回到Namenode,后者将最终通知客户端写入请求的完成情况。
基于上述流程,为了服务第二个客户端的写请求(让我们假设第二个客户端具有更高的优先级),暂停HDFS写操作是不可能的,因为如果我们暂停Datanode本身它将对想要在其上写入的每个人保持暂停状态,因此HDFS的这部分将保持被阻止。最后,如果我从JobController类函数暂停一个作业,我实际上暂停了客户端的进程(如果我真的设法在他的请求完成之前捕获它)。如果我错了,请纠正我。