这是我的分析,当然查阅书籍和网络。如有什么不对的,请各位批评指正。以下的类有的并不完全,只列出重要的方法。
如要转载,请注上作者以及出处。
一、源码阅读环境
需要安装jdk1.7.0版本及其以上版本,还需要安装Eclipse阅读hadoop源码。
Eclipse安装教程参见我的博客。
Hadoop源码官网下载。我下载的是2.7.3版本的。其中source是源代码工程,需要你编译才能执行。而binary是编译好的克执行文件。
如果你要搭建Hadoop集群,则下载binary的。如果阅读源代码,下载source的。
这里我们需要分析源代码,下载source,解压后文件名是hadoop-2.7.3-src。
把Hadoop导入Eclipse:
1.打开Eclipse,点击File->New->Java Project,会弹出如下图1所示:
图 1
我们就把Hadoop源码导入了Eclipse,但会报很多错误,具体解决方案参见我的博客 Eclipse中导入Hadoop源代码工程 。不过不影响我们看源码。
2.如果你想看某个类,但你不知道在哪?先定位到hadoop-2.7.3-src
以Job.java为例子,
在Windows中:你可以在文件资源管理器的搜索栏里输入想要搜索的类名,如下图2所示:
图 2
然后右键该文件,选择打开文件所在的位置。这个位置和Eclipse中hadoop-2.7.3-src项目的目录结构相对应。
比如我们搜到的Job.java在hadoop-2.7.3-src\hadoop-mapreduce-project\hadoop-mapreduce-client\hadoop-mapreduce-client-core\src\main\java\org\apache\hadoop\mapreduce中。
在Linux中,需要在终端通过find命令查找。
find . -name "Job.java" 第一个参数是路径,其中.表示当前目录,/表示根目录。如下图3所示:
图 3
我们就可以在Eclipse中hadoop-2.7.3-src项目中找到,如下图4所示:
图 4
二、分析前须知:
我们运行装好的集群时,要想启动集群,通常在主节点Master的hadoop-2.7.3/sbin/,目录下运行(命令行)./start-all.sh脚本,直接全部启动。如下代码所示:
"${HADOOP_HDFS_HOME}"/sbin/start-dfs.sh --config $HADOOP_CONF_DIR 它会启动start-dfs.sh脚本
"${HADOOP_YARN_HOME}"/sbin/start-yarn.sh --config $HADOOP_CONF_DIR 它会启动start-yarn.sh脚本
1 #Add other possible options 2 nameStartOpt="$nameStartOpt $@" 3 4 #--------------------------------------------------------- 5 # namenodes 6 7 NAMENODES=$($HADOOP_PREFIX/bin/hdfs getconf -namenodes) 8 9 echo "Starting namenodes on [$NAMENODES]" 10 11 "$HADOOP_PREFIX/sbin/hadoop-daemons.sh" \ 12 --config "$HADOOP_CONF_DIR" \ 13 --hostnames "$NAMENODES" \ 14 --script "$bin/hdfs" start namenode $nameStartOpt 15 16 #--------------------------------------------------------- 17 # datanodes (using default slaves file) 18 19 if [ -n "$HADOOP_SECURE_DN_USER" ]; then 20 echo \ 21 "Attempting to start secure cluster, skipping datanodes. " \ 22 "Run start-secure-dns.sh as root to complete startup." 23 else 24 "$HADOOP_PREFIX/sbin/hadoop-daemons.sh" \ 25 --config "$HADOOP_CONF_DIR" \ 26 --script "$bin/hdfs" start datanode $dataStartOpt 27 fi 28 29 #--------------------------------------------------------- 30 # secondary namenodes (if any) 31 32 SECONDARY_NAMENODES=$($HADOOP_PREFIX/bin/hdfs getconf -secondarynamenodes 2>/dev/null) 33 34 if [ -n "$SECONDARY_NAMENODES" ]; then 35 echo "Starting secondary namenodes [$SECONDARY_NAMENODES]" 36 37 "$HADOOP_PREFIX/sbin/hadoop-daemons.sh" \ 38 --config "$HADOOP_CONF_DIR" \ 39 --hostnames "$SECONDARY_NAMENODES" \ 40 --script "$bin/hdfs" start secondarynamenode 41 fi 42 43 #--------------------------------------------------------- 44 # quorumjournal nodes (if any) 45 46 SHARED_EDITS_DIR=$($HADOOP_PREFIX/bin/hdfs getconf -confKey dfs.namenode.shared.edits.dir 2>&-) 47 48 case "$SHARED_EDITS_DIR" in 49 qjournal://*) 50 JOURNAL_NODES=$(echo "$SHARED_EDITS_DIR" | sed 's,qjournal://\([^/]*\)/.*,\1,g; s/;/ /g; s/:[0-9]*//g') 51 echo "Starting journal nodes [$JOURNAL_NODES]" 52 "$HADOOP_PREFIX/sbin/hadoop-daemons.sh" \ 53 --config "$HADOOP_CONF_DIR" \ 54 --hostnames "$JOURNAL_NODES" \ 55 --script "$bin/hdfs" start journalnode ;; 56 esac 57 58 #--------------------------------------------------------- 59 # ZK Failover controllers, if auto-HA is enabled 60 AUTOHA_ENABLED=$($HADOOP_PREFIX/bin/hdfs getconf -confKey dfs.ha.automatic-failover.enabled) 61 if [ "$(echo "$AUTOHA_ENABLED" | tr A-Z a-z)" = "true" ]; then 62 echo "Starting ZK Failover Controllers on NN hosts [$NAMENODES]" 63 "$HADOOP_PREFIX/sbin/hadoop-daemons.sh" \ 64 --config "$HADOOP_CONF_DIR" \ 65 --hostnames "$NAMENODES" \ 66 --script "$bin/hdfs" start zkfc 67 fi 68 69 # eof