Hadoop源码学习笔记(2)--Hdfs的启动流程分析

Hdfs 的基础架构

Hdfs基础架构

如上图所示。 默认情况下,Hdfs 由一个 Namenode 和多个 DataNode 组成。

hdfs作为一个分布式文件存储系统,他的文件路径和文件内容是相互隔离的。 文件路径信息保存在 NameNode 中,文件内容则分布式的保存在 DataNode中。

也就是说对于一个大文件,它可能被根据其文件大小切割成多个小文件进行存储,同时这些小文件可能被分布式的存储在不同的DataNode中。

当Client希望获取这个文件时,则需要先根据文件路径从 NameNode 中获取他对应的区块在不同的 DataNode 中的信息,然后才能够从 DataNode 中取出数据,还原成一个大文件。

具体的代码逻辑会在之后的读写操作中介绍,这里我们先看看 hdfs 集群的启动流程。

Hdfs 集群启动流程

默认情况下,我们通过 ${HADOOP_HOME}/sbin/start-dfs.sh 启动整个 Hdfs 集群。

hdfs namenode "${HADOOP_HDFS_HOME}/bin/hdfs" --workers --config "${HADOOP_CONF_DIR}" --hostnames "${NAMENODES}" --daemon start namenode ${nameStartOpt}

hdfs datanode "${HADOOP_HDFS_HOME}/bin/hdfs" --workers --config "${HADOOP_CONF_DIR}" --daemon start datanode ${dataStartOpt}

hdfs secondarynamenode "${HADOOP_HDFS_HOME}/bin/hdfs" --workers --config "${HADOOP_CONF_DIR}" --hostnames "${SECONDARY_NAMENODES}" --daemon start secondarynamenode

hdfs journalnode "${HADOOP_HDFS_HOME}/bin/hdfs" --workers --config "${HADOOP_CONF_DIR}" --hostnames "${JOURNAL_NODES}" --daemon start journalnode

hdfs zkfc "${HADOOP_HDFS_HOME}/bin/hdfs" --workers --config "${HADOOP_CONF_DIR}" --hostnames "${NAMENODES}" --daemon start zkfc

start-dfs.sh 文件中,我们看到shell文件通过执行hdfs命令先后启动 NameNodeDataNodeSecondaryNameNodeJournalNode

hdfs也是一个shell文件,通过文本应用打开后,我们看到在该文件的执行逻辑如下:

hdfs执行逻辑

节点类型和Java类的一一对应

hdfs文件中可以看到,传入的第一个参数对应着需要启动节点的类型,使用 hdfscmd_case 根据节点类型可以找到对应需要执行的Java类,节点对应表如下。

节点类型 Java类
namenode org.apache.hadoop.hdfs.server.namenode.NameNode
datanode org.apache.hadoop.hdfs.server.datanode.DataNode
secondarynamenode org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode
journalnode org.apache.hadoop.hdfs.qjournal.server.JournalNode

Tips:类似datanode根据是否是secure mode会有多个Java类对应,但这里只列出最常用的类

为远程机器启动hdfs

通过解析节点类型,hdfs找到了对应的Java类。接下来就应该是启动并执行这个Java类。

但是如果在启动命令中包含了 --worker 参数,就代表着需要链接到其他节点机器上执行命令。在处理传参的时候,发现--worker后,会将 ${HADOOP_WORKER_MODE} 设置为 true, 从而执行 hadoop_common_worker_mode_execute(对应的方法逻辑在 hadoop-functions.sh 文件中)。在 hadoop_common_worker_mode_execute 中,通过读取配置文件信息,获取到真实运行设备的hostname,通过ssh执行一个不带--worker选项的hdfs命令,使得hostname对应的节点机器能够启动hdfs节点。

注意:如果需要通过这种方法启动远程机器,需要将启动机器的.ssh公钥加入被启动机器的信任列表中: cat target/id_rsa.pub >> ~/.ssh/authorized_keys,否则无法直接链接上对应设备

本地启动hdfs

我们通过ssh让远程设备启动hdfs节点时,会传递过去一个不带--worker的可执行命令。

因此通过hdfs启动节点时,运行逻辑和之前保持一致,只是${HADOOP_WORKER_MODE}不为true。此时通过判断是否需要在后台执行命令,我们分别通过 hadoop_daemon_handler 或者 hadoop_java_exec 在前台或后台启动对应的Java任务。

这里需要留意的是,在通过 hdfscmd_case 解析节点指令时,或默认将 ${HADOOP_DAEMON_MODE} 设置为 true,使得各个节点默认在后台运行。

NameNode 启动逻辑

NameNode在整个hdfs中扮演着一个很重要的角色,他负责整个文件系统的路径和数据的管理工作,比较类似 Unix 系统中的 inode table。

Client 通过 NameNode 获取到指定路径的分布式文件的 metadata,找到存放在 DataNode 的数据位置,就像从 inode talbe中获取 inode 编号,然后才能去访问具体的分布式文件。

从上一小节的表格中,我们看到 NameNode 对应的启动类是 org.apache.hadoop.hdfs.server.namenode.NameNode,接下来我们通过走读NameNode::main 具体查看节点的启动流程。

由于 NameNode 的启动参数很多,类似 FORMAT,CLUSTERID,IMPORT等等启动参数并不会被用来启动 NameNode。为了简单起见,这里只针对默认启动逻辑 REGULAR进行分析,启动流程如下:

NameNode

如图所示,对于REGULAR模式而言,NameNode节点主要启动了下面三个组件:

NameNode

NameNodeHttpServer

startHttpServer 会启动一个 NameNodeHttpServer

NameNodeHttpServer 是一个基于 jetty 服务器的简单封装,提供给使用人员一个简单的节点状态查询页面,默认的绑定端口是 :9870,静态页面代码路径是 webapps/namenode,这一部分由于不涉及到核心逻辑,不做介绍。

FSNamesystem

loadNamesystem 会构建一个 FSNamesystem 对象,FSNamesystemNameNode 中最核心的一个模块,负责处理维护整个分布式文件系统。详细的处理逻辑会在后续的章节做仔细介绍。

RPC.Server

createRPCServer 会启动一个 RPC.Server 线程。

RPC.Server 负责处理 hdfs 集群中的内部通信,在 RPC.Server 中绑定了一个 socket 端口,利用protobuf的序列化框架进行数据传输,关于 RPC.Server 的交互逻辑会在下一章中做详细介绍,这里可以简单理解为一个使用socket通信的rpc访问框架。

if (serviceRpcAddr != null) {
    serviceRpcServer = new RPC.Builder(conf).build();
}

if (lifelineRpcAddr != null) {
    lifelineRpcServer = new RPC.Builder(conf).build();
}

clientRpcServer = new RPC.Builder(conf).build()

NameNodeRpcServer的构造方法中可能会构造 serviceRpcServer , lifelineRpcServerclientRpcServer 三种 RPC.Server

DataNode 启动逻辑

DataNode 在整个hdfs框架中负责具体的文件存储。

我们知道DataNode的启动类是org.apache.hadoop.hdfs.server.datanode.DataNode

DataNode启动逻辑

他的启动逻辑如上图所示。和NameNode类似,在DataNode中同样启动了一个基于 jetty Server的 HTTP 服务器,负责向使用人员展示节点状态;同样还有一个基于 RPC.Server 的 socket 链接负责 hdfs集群 的内部通信。

DataNode

DataXceiverServer

initDataXceiver 会启动一个 DataXceiverServer 类。

DataXceiverServer 负责接收通过TCP协议传输过来的文件数据,会在下一章介绍 hdfs 的文件传输的时候做介绍,这里先略过

DatanodeHttpServer

DatanodeHttpServerNameNodeHttpServer 一样,也是一个基于 jetty 服务器的封装,负责向使用人员提供当前Datanode的节点状态信息,默认的启动端口是 :9864,静态页面代码路径 webapps/datanode,同样这一部分不设计核心逻辑,不做介绍

RPC.Server

DataNode中也存在一个RPC.Server对象,负责维持节点间通信,在下一篇文章中会做详细介绍。

BlockPoolManager

由于在hdfs中文件路径和文件内容是相互隔离的,在DataNode负责存放分布式的文件内容,但是对于DataNode自身并不知道自己的文件名,只有一个唯一的 blockId 用以定位文件信息。

BlockPoolManager 中,DataNode会定期上报当前节点的 blockId 列表,以便告知NameNode节点中拥有的文件内容。具体的逻辑会在 hdfs的文件传输的时候做介绍。

总结

在本文中,没有过多的对源码进行分析,只简单的介绍了 NameNodeDataNode 两个节点的启动逻辑。

原因很简单,每个子组件的内容都需要结合 NameNodeDataNode 甚至还需要 Client 三者结合来讲解。而且每个子组件的逻辑也会比较复杂,已经无法放在一个小节里进行讲述。

所以,本文中只有 start-dfs.sh 的启动逻辑和 NameNodeDataNode 的关键组件构成。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容

  • Hadoop部署方式 本地模式 伪分布模式(在一台机器中模拟,让所有进程在一台机器上运行) 集群模式 服务器只是一...
    陈半仙儿阅读 1,609评论 0 9
  • 首先,我们在使用前先看看HDFS是什麽?这将有助于我们是以后的运维使用和故障排除思路的获得。 HDFS采用mast...
    W_Bousquet阅读 4,194评论 0 2
  • HDFS的设计目标 通过上一篇文章的介绍我们已经了解到HDFS到底是怎样的东西,以及它是怎样通过多副本机制来提供高...
    陌上疏影凉阅读 1,446评论 0 3
  • 什么是symbolicatecrash symbolicatecrash是Xcode自带的一个分析工具,可以通过机...
    Zz7777777阅读 951评论 0 0
  • 我想给你写首诗, 写尽你所有的样子。 写你春风旖旎时奋斗的样子, 写你夏日炎炎时爱我的样子, 写你秋高气爽时恋家的...
    若谷SS阅读 479评论 20 21