今天来看下hadoop dfs 的启动过程都做了些什么。
启动hdfs的时候,一般都是使用命令./start-dfs.sh,那就从这个sh文件入手:
"$bin"/hadoop-daemon.sh --config $HADOOP_CONF_DIR start namenode $nameStartOpt "$bin"/hadoop-daemons.sh --config $HADOOP_CONF_DIR start datanode $dataStartOpt "$bin"/hadoop-daemons.sh --config $HADOOP_CONF_DIR --hosts masters start secondarynamenode
在脚本的最后调用了这3命令,分别是启动namenode,datanode和secondarynamenode。
接着看hadoop-daemon.sh脚本:
case $startStop in (start) mkdir -p "$HADOOP_PID_DIR" if [ -f $pid ]; then if kill -0 `cat $pid` > /dev/null 2>&1; then echo $command running as process `cat $pid`. Stop it first. exit 1 fi fi if [ "$HADOOP_MASTER" != "" ]; then echo rsync from $HADOOP_MASTER rsync -a -e ssh --delete --exclude=.svn --exclude='logs/*' --exclude='contrib/hod/logs/*' $HADOOP_MASTER/ "$HADOOP_HOME" fi hadoop_rotate_log $log echo starting $command, logging to $log cd "$HADOOP_PREFIX" //关键的在这里,又去调用hadoop这个脚本 nohup nice -n $HADOOP_NICENESS "$HADOOP_PREFIX"/bin/hadoop --config $HADOOP_CONF_DIR $command "$@" > "$log" 2>&1 < /dev/null & echo $! > $pid sleep 1; head "$log" ;;
看到上面的代码,发现这里有执行了hadoop这个脚本,执行了命令hadoop --config configfile namenode,接着看hadoop的脚本吧:
elif [ "$COMMAND" = "namenode" ] ; then CLASS='org.apache.hadoop.hdfs.server.namenode.NameNode' HADOOP_OPTS="$HADOOP_OPTS $HADOOP_NAMENODE_OPTS"
终于找到了启动namenode所调用的类了,同样的流程,也可以找到datanode,secondarynamenode的启动类。
接着看NameNode类:
在注释中看到:
* The NameNode controls two critical tables:
* 1) filename->blocksequence (namespace)
* 2) block->machinelist ("inodes")
namenode维护了2个关键表,一个是文件和块序列的对应关系,一个是块和datanode对象关系,就是保存了一个文件对应了哪些块,一个块存储在哪些机器上。
首先通过main方法
public static void main(String argv[]) throws Exception { try { StringUtils.startupShutdownMessage(NameNode.class, argv, LOG); NameNode namenode = createNameNode(argv, null); if (namenode != null) namenode.join(); } catch (Throwable e) { LOG.error(StringUtils.stringifyException(e)); System.exit(-1); } }
调用createNameNode方法创建namenode,该方法中通过NameNode namenode = new NameNode(conf)来创建,再看看构造方法中调用了 initialize(conf),截取initialize方法中一些主要的内容:
............. this.namesystem = new FSNamesystem(this, conf); .............
FSNamesystem才是用来保存有节点信息的,包括:
1) valid fsname --> blocklist (kept on disk, logged)
* 2) Set of all valid blocks (inverted #1)
* 3) block --> machinelist (kept in memory, rebuilt dynamically from reports)
* 4) machine --> blocklist (inverted #2)
* 5) LRU cache of updated-heartbeat machines
加载fsimge,edits,启动监听进程接收datanode的信息,启动rpc底层通信服务,namenode的启动主要就是做的这些事情,可以看到主要工作在加载fsimage,和接收datanode的信息。如果fsimage比较大的话,那么启动过程会较慢,同样,如果集群比较大,那么接收datanode的block信息同样也是非常耗时的地方。
关于加载fsimge和datanode的rpc通信下一次在分析吧。
相关推荐
在学习hadoop启动脚本过程中记录的,有一定的参考价值,值得一看!
CDH hadoop-fuse-dfs的安装指导,是我在工作过程中安装步鄹的总结。
HadoopHA集群 批量启动脚本HadoopHA集群 批量启动脚本HadoopHA集群 批量启动脚本HadoopHA集群 批量启动脚本
hadoop安装过程,自己留着看,分享给大家,网络上弄的,仅供参考
jps判断hadoop启动是否成功;分别对master和slave进行了判断。jps不是hadoop的什么命令,是java的命令,所以直接执行就行了。
Hadoop2.2.0安装配置手册!完全分布式Hadoop集群搭建过程 按照文档中的操作步骤,一步步操作就可以完全实现hadoop2.2.0版本的完全分布式集群搭建过程
Hadoop datanode启动失败:Hadoop安装目录权限的问题
Hadoop Mapreduce过程shuffle过程全解析,Shuffle过程
Hadoop安装配置过程和注意事项
包括NameNode、 Secondary NameNode、DataNode、JobTracker、 TaskTrack start-dfs.sh 启动Hadoop HDFS守护进程NameNode、SecondaryNameNode和DataNode stop-dfs.sh 停⽌Hadoop HDFS守护进程NameNode、...
hadoop 高可用启动脚本,运行启动zookeeper集群和hadoop ha集群
hadoop启动日志
在windows下搭建hadoop环境,一般需要借助虚拟机或者cygwin来模拟一个linux的启动环境。但这样搭建一个环境太麻烦了,其实可以直接像linux上一样来配置变量,然后启动,他的启动命令就是上面jar包中的bin
3. 启动/停止 Namenode 和 Datanode:使用start-dfs.sh和stop-dfs.sh脚本启动或停止Namenode和Datanode 四、其他命令 1. 查看HDFS文件系统目录:使用dfs -ls命令查看HDFS文件系统目录,例如bin/hadoop dfs -ls / 2...
资源名称:vmware虚拟机下hadoop集群安装过程内容简介: Hadoop俗称分布式计算,最早作为一个开源项目,最初只是来源于谷歌的两份白皮书。然而正如十年前的Linux一样,虽然Hadoop最初十分简单,但随着近些年来...
HDFS 下的shell学习 基本指令的帮助文档
Linux运维-Hadoop集群之ambari实践-13hadoop集群启动.mp4
对于想学习 Spark 的人而言,如何构建 Spark 集群是其最大的难点之一, 为了解决大家构建 Spark 集群的一切困难,Spark 集群的构建分为了五个步骤,从 零起步,不需要任何前置知识,涵盖操作的每一个细节,构建完整...
自己写的脚本,一键启动hadoop、hbase、zookeeper(几个zookeepler同时启动)、hive。另有一键关闭集群和一键关机功能
停止集群麻烦,所以写的脚本。私我可以免费发给你。上传只为自己以后用,防止丢失。