关于Hadoop的基本概念,体系架构,以及运行流程,网上已经有很多人都介绍过,这里给大家推荐一下这个博客http://www.cnblogs.com/forfuture1978/category/300670.html,对HDFS,MapR的基本原理以及执行过程解析都有比较详细的介绍。当然还有很多其他优秀的原理介绍文章,我就不一一列举了,大家可以上网搜索;
这篇文档先大概介绍一下Hadoop环境搭建,远程调试方法,然后详细分析MapR的关键代码流程。
有XXX的地方因涉及到公司及项目,因此隐去了名称
一:环境搭建及调试方法
Hadoop的搭建需要配置HDFS以及MapR的一些参数,由一个Master以及若干个Slaves组成,在这些主机上创建相同的用户,并将Hadoop放置到相同的目录下,
假设现在每个主机创建的用户名为XXX,hadoop的放置目录为/home/XXX/hadoop
需要做的工作:
假设待配置Master的IP地址是10.10.1.16,主机名为XXX-work;
待配置Slaves的IP地址是10.10.0.146(XXXCRAWLDEV),10.10.0.147(XXXINDEXDEV),10.10.0.154(XXXanal1)
1,在Master上建立起Master主机名和MasterIP地址之间的映射,建立起所有Slaves主机名和Slaves IP之间的映射关系
方法:sudo vim /etc/hosts 添加以下内容:
10.10.0.146 XXXCRAWLDEV
10.10.1.16 XXX-work
10.10.0.147 XXXINDEXDEV
10.10.0.154 XXXanal1
2,在每个Slave上建立起该Slave主机名和IP地址之间的映射,建立起Master主机名和MasterIP地址之间的映射,如在10.10.0.146的/etc/hosts里添加如下内容:
10.10.0.146 XXXCRAWLDEV
10.10.1.16 XXX-work
其他的Slave也要做类似的映射;
注意:配置主机名到IP地址的映射时,有时候需要将127.0.0.1这一项去掉!
3,配置SSH
Master是通过无密码方式登录到各个Slave主机启动相应的Slave脚本的(该脚本启动该Slave上的datanode进程和tasktracker进程),因此Master上必须安装SSH客户端,
各个Slave上必须安装SSH服务器,安装方式很简单:
sudo apt-get install openssh-server
sudo apt-get install openssh-client
之后是配置SSH的无密码登录:
在master上生成密钥对,即在XXX-work上做以下操作:
转到/home/XXX目录下, 执行 ssh-keygen -t dsa
Enter file in which to save the key(/home/XXX/.ssh/id_dsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/XXX/.ssh/id_dsa.
Your public key has been saved in /home/XXX/.ssh/id_dsa.pub.
The key fingerprint is:
b9:d2:68:32:5a:8c:40:de:7e:00:d8:23:f2:85:62:ac XXX@XXXcrawl002
The key's randomart image is:
+--[ DSA 1024]----+
| |
|o. . |
|==+ . |
|*+oo . |
|E..o S |
| ..o. o . |
| ..=.+ o |
| o.+ . |
| . |
+-----------------+
出现要输入路径或passphrase时,直接回车,之后我们会发现在/home/XXX下生成一个.ssh目录,里面生成了id_dsa id_dsa.pub known_hosts这几个文件,
在每个slave的/home/XXX下创建目录.ssh,然后将master上的id_dsa.pub拷贝到所有slave的.ssh目录下并命名为authorized_keys,
之后修改每个slave上的authorized_keys文件的访问权限: chmod 766 authorized_keys
测试:在master上ssh该slave,例如:在master上 ssh XXXCRAWLDEV
则不用输密码可直接登录主机XXXCRAWLDEV
如果某个slave之前已经存在authorized_keys,则将master上的id_dsa.pub附加到该文件后面即可:cat id_dsa.pub >> authorized_keys
4,Hadoop目录介绍:
前面提到过,将hadoop安装在所有master/slaves上的同样的目录之下,先假设安装在/home/XXX下,在hadoop的目录为/home/XXX/hadoop
该目录下有Hadoop核心jar包hadoop-0.20.2-core.jar,hadoop自带的例子hadoop-0.20.2-examples.jar,hadoop源码目录以及其他目录文件,下面介绍两个重要的目录文件:
a,bin目录:
启动及停止hadoop的脚本位于该目录之下,如:执行start-all.sh,可启动master上的namenode,secondary-namnode(可以在单独的主机上运行),jobtracker,以及slave上的datanode,tasktracker;
hadoop的所有操作通过该目录下的hadoop脚本来发起,如拷贝一个文件到hdfs系统: ./hadoop fs -ls copyFromLocal /local /hdfs_remote
b,conf目录:保存了master/slave配置文件,hdfs/mapR运行配置文件,以及log配置文件,下面一一来介绍:
masters文件:在该文件里配置master,只需将master的主机名写入即可,如:
XXX-work
slaves文件:在该文件里配置slaves,只需将slaves的主机名写入即可,如:
XXXCRAWLDEV
XXXINDEXDEV
XXXanal1
log4j.properties文件:log4j的配置文件,具体配置方式请参考log4j相关文档(网上一搜一大把);
hadoop-env.sh:Hadoop环境变量文件,在这里可以配置一些全局的Hadoop环境变量,如HADOOP_HOME,HADOOP_SSH_OPTS等;
xxx-default.xml: hadoop运行参数配置文件,默认的参数配置,最好不要对这些文件做修改;
xxx-site.xml:hadoop运行参数配置文件,用户可以在这些配置文件里设置自己想要的参数值,覆盖default文件里的参数值;
下面来介绍xxx-site.xml里需要配置的几个比较重要的参数:
core-site.xml:
hadoop.tmp.dir 定义的hadoop tmp路径,缺省情况下,hadoop系统的hdfs,mapreduce的数据都放在tmp目录下
fs.default.name hdfs系统描述,例如: hdfs://XXX-work:54310
map-site.xml: 这里面主要是与mapR相关的一些参数
mapred.job.tracker jobtracker的地址,如XXX-work:9001
mapred.tasktracker.map/reduce.tasks.maximum tasktracker上map/reduce任务总槽数
mapred.job.reuse.jvm.num.tasks 每个Child进程可最多运行几个任务
mapred.child.java.opts 启动Child进程的运行参数(远程调试Child进程用,如:-Xmx200m -Xdebug -Xrunjdwp:transport=dt_socket,address=20000,server=y,suspend=y)
hdfs-site.xml: 设置hdfs相关的一些参数,如 备份因子,等
5,开始使用hadoop
假设上面的配置都正常,下面开始启动hadoop,进入/home/XXXhadoop/bin目录:
使用hdfs之前,对hdfs文件系统做格式化: ./hadoop namenode -format
然后使用 ./start-all.sh 启动所有master及slave
使用 ./hadoop dfsadmin -safemode get 查看是否离开安全模式,如果hdfs系统没有离开安全模式,则只能查看系统文件,不能写;
可以强制离开安全模式 ./hadoop dfsadmin -safemode leave
查看hdfs系统根目录下的文件 ./hadoop fs -ls /
拷贝本地一份文件到hdfs系统 ./hadoop fs -copyFromLocal ./input/homeXXX/input
使用./hadoop fs -ls /home/XXX看是否已经拷到hdfs系统,或使用http://XXX-work:50070 以web方式查看当前hdfs系统的namenode
现在开始运行hadoop例子里自带的wordcount:
./hadoop jar hadoop-0.20.2-examples.jar wordcount/home/XXX/input /home/XXX/output
可以看到在终端上显示mapR进度,也可以使用http://XXX-work:50030 以web方式查看mapR运行进度
6,调试程序
有时候我们希望可以看到master或slave或我们的业务逻辑代码的运行细节,通过设置远程调试参数来达到目的:
1,作业是通过jobclient提交到jobtracker的,如果我们想跟踪jobclient的运行流程,则在hadoop脚本文件里添加:
HADOOP_RUNJAR_OPTS="-Xdebug-Xrunjdwp:transport=dt_socket,address=19996,server=y,suspend=y"
然后在
elif [ "$COMMAND" = "jar" ] ; then
CLASS=org.apache.hadoop.util.RunJar
HADOOP_OPTS="$HADOOP_OPTS $HADOOP_RUNJAR_OPTS" //将这个选项添加上
2,我们想查看fs ,dfs, dfsadmin,...等命令的客户端提交代码,则在hadoop脚本文件里添加:
HADOOP_CLIENT_OPTS="-Xdebug-Xrunjdwp:transport=dt_socket,address=19995,server=y,suspend=y"
然后在
elif [ "$COMMAND" = "fs" ] ; then
CLASS=org.apache.hadoop.fs.FsShell
HADOOP_OPTS="$HADOOP_OPTS $HADOOP_CLIENT_OPTS"
等命令里将该选项加上
3,如果我们想查看jobtracker的运行细节,则在hadoop脚本文件里添加:
HADOOP_JOBTRACKER_OPTS="-Xdebug-Xrunjdwp:transport=dt_socket,address=19993,server=y,suspend=y"
然后在
elif [ "$COMMAND" = "jobtracker" ] ; then
CLASS=org.apache.hadoop.mapred.JobTracker
HADOOP_OPTS="$HADOOP_OPTS $HADOOP_JOBTRACKER_OPTS"
将该选项加上
4,同理:secondary-namenode, namenode 的调试,需添加选项:
HADOOP_NAMENODE_OPTS="-Xdebug-Xrunjdwp:transport=dt_socket,address=19990,server=y,suspend=y"
HADOOP_SECONDARYNAMENODE_OPTS="-Xdebug-Xrunjdwp:transport=dt_socket,address=19991,server=y,suspend=y"
然后将这些选项添加到对应的HADOOP_OPTS里
5,如果想跟踪tasktracker的运行细节,则需要在各个slave的/home/XXX/hadoop/bin/hadoop脚本文件里添加:
HADOOP_TASKTRACKER_OPTS="-Xdebug-Xrunjdwp:transport=dt_socket,address=19994,server=y,suspend=y"
然后在
elif [ "$COMMAND" = "tasktracker" ] ; then
CLASS=org.apache.hadoop.mapred.TaskTracker
HADOOP_OPTS="$HADOOP_OPTS $HADOOP_TASKTRACKER_OPTS"
加上该选项
6,datanode的远程调试与tasktracker类似,定义不同的调试端口即可;
7,如果想跟踪任务子进程及具体业务逻辑代码,则需要远程调试Child进程,则conf下的map-site.xml里修改配置参数
mapred.child.java.opts的值为
-Xmx200m -Xdebug-Xrunjdwp:transport=dt_socket,address=20000,server=y,suspend=y即可
注意:1,2,3,4,7是修改master上的文件内容,5,6是修改slave上的文件内容;
address的值是远程调试端口,随便你自己设置,suspend的值标示启动调试后是停止在main函数等待,还是直接运行下去(当然碰到其他地方的断点会停下来)
下面以jobtracker为例来介绍远程调试中eclipse的设置:
假设现在运行选项已经设置好,并且运行了./start-all.sh,由于设置了suspend=y,因此jobtracker会在main函数开头停下来,等待用户启动调试,
假设我们新建了一个hadoop工程
这时候,用户选中jobtracker 进入Debug As-->DebugConfigruation进入调试配置窗口,选中Remote Java Application,新建一个远程调试实例,
在Connection properites里配置好host和端口号即可(jobtracker运行在10.10.1.16,则配置该值,端口是我们在设置运行选项时配的值);