您的位置:首页 > 编程语言

怎样搭建hadoop环境及调试hadoop代码

2012-04-19 14:41 609 查看
关于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方式查看当
4000
前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,则配置该值,端口是我们在设置运行选项时配的值);

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息