hadoop伪分布式搭建

1. 环境搭建 
      搭建测试环境所需的软件包括:jdk1.6.0_20、hadoop-1.0.4.tar.gz。测试服务器操作系统Linux Cent OS 5.5。 
网上说使用专门的用户hadoop操作,但是这里我是全使 用的root,方便而已。 

总体体的流程如下: 
    1、实现linux的ssh无密码验证配置. 
    2、在linux下安装jdk,并配好环境变量 
    3、修改linux的机器名,并配置 /e c/hosts 
    4、在windo tws下下载 hadoop-1.0.4.tar.gz ,并修改hadoop-env.sh,core-site.xml,hdfs-site.xml,mapred-site.xml,masters,slaves文件的配置 
    5、把修改好的hadoop整个文件夹传到linux下 
    6、把hadoop的bin加入到环境变量 
    7、格式化hadoop,启动hadoop 
    8、验证是否启动,并执行wordcount  

具体如下: 
1.  SSH无密码验证配置 
     Hadoop 需要使用SSH 协议,namenode 将使用SSH 协议启动 namenode和datanode 进程,伪分布式模式数据节点和名称节点均是本身,必须配置 SSH localhost无密码验证。 
    用root用户登录,在家目录下执行如下命令:ssh-keygen -t rsa 
[root@master ~]# ssh-keygen -t  rsa 
Generating public/private rsa key pair. 
Enter file in which to save the key (/root/.ssh/id_rsa):  & 按回车默认路径 & 
Created directory '/root/.ssh'.  &创建/root/.ssh目录 继续按回车& 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa. 
Your public key has been saved in /root/.ssh/id_rsa.pub. 
The key fingerprint is: 
c6:7e:57:59:0a:2d:85:49:23:cc:c4:58:ff:db:5b:38 root@master (出现key)
     通过以上命令将在进入/root/.ssh/ 目录下生成id_rsa私钥和id_rsa.pub公钥。进入/root/.ssh目录在namenode节点下做如下配置:
 
[root@master .ssh]# cat id_rsa.pub > authorized_keys 

配置完毕,可通过ssh 本机IP 测试是否需要密码登录。
[root@master ~]# ssh localhost    



原理: 
     Hadoop需要使用SSH协议,namenode将使用SSH协议启动namenode和datanode进程,(datanode向namenode传递心跳信息可能也是使用SSH协议,这是我认为的,还没有做深入了解)。许多教程上介绍Hadoop集群配置时只说明了namenode上SSH无密码登录所有datanode,我在配置时发现必须使datanode上也能SSH无密码登录到namenode,Hadoop集群才能正常启动(也许这不是必须的) 
以namenode到datanode为例子:Namenode作为客户端,要实现无密码公钥认证,连接到服务端datanode上时,需要在namenode上生成一个密钥对,包括一个公钥和一个私钥,而后将公钥复制到datanode上。当namenode通过ssh连接datanode时,datanode就会生成一个随机数并用namenode的公钥对随机数进行加密,并发送给namenode。namenode收到加密数之后再用私钥进行解密,并将解密数回传给datanode,datanode确认解密数无误之后就允许namenode进行连接了。这就是一个公钥认证过程,其间不需要用户手工输入密码。重要过程是将客户端namenode公钥复制到datanode上  

2. JDK安装及Java环境变量的配置 
2.1 JDK安装 
     root 用户登陆,新建文件夹 /home/jdk ,下载 JDK 安装包 
jdk-6u13-linux-i586.bin,复制到目录/ home / jdk下,在命令行进入该目录,执行命令“./ jdk-6u20-linux-i586.bin”,命令运行完毕,将在目录下生成文件夹jdk1.6.0_20,安装完毕。
 
2.2 java环境变量配置 
        root 用户登陆,命令行中执行命令“vi /etc/profile”,并加入以下内容,配置环境变量(注意/etc/profile 这个文件很重要,后面 Hadoop 的配置还会用到)。 
# set java environment 
   export JAVA_HOME=/home/jdk1.6.0_20 
   export HADOOP_HOME=/home/ hadoop/ hadoop-1.0.4(这是hadoop的安装路径)
   export PATH=$JAVA_HOME/bin:$ HADOOP_HOME/bin: $PATH 
在vi编辑器增加以上内容后保存退出,并执行以下命令使配置生效 
    chmod +x  /etc/profile ;增加执行权限 
    source  /etc/profile ; 
配置完毕后,在命令行中输入java -version,如出现下列信息说明java环境安装成功。 
java version "1.6.0_20" 
Java(TM) SE Runtime Environment (build 1.6.0_20-b02) 
Java HotSpot(TM) Server VM (build 16.3-b01, mixed mode) 



2. Hadoop配置 
   下载   hadoop-1.0.4.tar.gz ,将其解压到/home/hadoop 目录下,解压后目录形式是/home/hadoop/ hadoop-1.0.4 。使用如下命令: 
  tar zxvf    hadoop-1.0.4.tar.gz   进行hadoop压缩文件解压。 
2.1   进入/home/hadoop/ hadoop-1.0.4 /conf, 配置Hadoop配置文件 
2.1.1 配置hadoop-env.sh文件 
添加 # set java environment 
             export JAVA_HOME=/home/jdk/jdk1.6.0_20 
编辑后保存退出。 
2.1.2 配置core-site.xml 
Java代码  
  1. [root@master  conf]# vi core-site.xml  
  2. <?xml version="1.0"?>  
  3. <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>  
  4. <!-- Put site-specific property overrides in this file. -->  
  5. <configuration>  
  6.    <property>  
  7.      <name>fs.default.name</name>  
  8.      <value>hdfs://自己机器的IP:9000/</value>  
  9.      默认的namenode的端口为8020  
  10.    </property>  
  11.    <property>  
  12.      <name>hadoop.tmp.dir</name>  
  13.      <value>/home/hadoop/hadooptmp</value>  
  14.    </property>  
  15. </configuration>  


2.1.3 配置hdfs-site.xml 
Java代码  
  1. [root@master conf]# vi  hdfs-site.xml  
  2. <?xml version="1.0"?>  
  3. <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>  
  4. <!-- Put site-specific property overrides in this file. -->  
  5. <configuration>  
  6.   <property>  
  7.      <name>dfs.name.dir</name>  
  8.      <value>/home/hadoop/hdfs/name</value>  
  9.   </property>  
  10.   <property>  
  11.      <name>dfs.data.dir</name>  
  12.      <value>/home/hadoop/hdfs/data</value>  
  13.   </property>  
  14.   <property>  
  15.      <name>dfs.replication</name>  
  16.      <value>1</value>  
  17.   </property>  
  18. </configuration>  

    
2.1.4 配置mapred-site.xml 
Java代码  
  1. [root@master conf]# vi mapred-site.xml  
  2. <?xml version="1.0"?>  
  3. <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>  
  4. <!-- Put site-specific property overrides in this file. -->  
  5. <configuration>  
  6.   <property>  
  7.      <name>mapred.job.tracker</name>  
  8.      <value>自己机器IP:9001</value>  
  9.   </property>  
  10.   <property>  
  11.      <name>mapred.local.dir</name>  
  12.      <value>/home/hadoop/mapred/local</value>  
  13.   </property>  
  14.   <property>  
  15.      <name>mapred.system.dir</name>  
  16.      <value>/home/hadoop/mapred/system</value>  
  17.   </property>  
  18. </configuration>  

1、其实core-site.xml 对应有一个core-default.xml, hdfs-site.xml对应有一个hdfs-default.xml, 

mapred-site.xml对应有一个mapred-default.xml。这三个defalult文件里面都有一些默认配置,现在我们修改这三个site文件,目的就覆盖default里面的一些配置, 
2、hadoop分布式文件系统的两个重要的目录结构,一个是namenode上名字空间的存放地方,一个是datanode数据块的存放地方,还有一些其他的文件存放地方,这些存放地方都是基于hadoop.tmp.dir目录的,比如namenode的名字空间存放地方就是 ${hadoop.tmp.dir}/dfs/name, datanode数据块的存放地方就是 ${hadoop.tmp.dir}/dfs/data,所以设置好hadoop.tmp.dir目录后,其他的重要目录都是在这个目录下面,这是一个根目录。我设置的是 /home/hadoop/hadooptmp,当然这个目录必须是存在的。 
3、fs.default.name,这个是设置namenode位于哪个机器上,端口号是什么hdfs://192.168.133.128:9000,格式一定要这样写,网上很多资料说ip地址写localhost也行,笔者建议最好写ip,因为后期讲到windows下 eclipse连接hadoop 的时候,如果写localhost,就会连接不到。 
4、mapred.job.tracker,这个是设置jobtracker位于哪个机器上,端口号是什么,192.168.133.128:9001,格式和上一个不一样,这个也必须这样写,同样localhost和ip的分别和上述一样 
5、dfs.replication,这个是设置数据块的复制次数,默认是3,因为笔者这里就一台机器,所以只能存在一份,就改成了1  

2.1.5 配置masters文件和slaves文件 
[root@master conf]# vi masters 
自己机器IP (10.1.1.245) 
[root@master conf]# vi slaves 
自己机器IP (10.1.1.245) 
注:因为在伪分布模式下,作为master的namenode与作为slave的datanode是同一台服务器,所以配置文件中的ip是一样的。 

2.1.6 编辑主机名 
[root@master ~]# vi /etc/hosts 
# Do not remove the following line, or various programs 
that require network functionality will fail. 
127.0.0.1             localhost 
10.1.1.245           master 
10.1.1.245            slave 
注:因为是在伪分布模式下,所以master与slave是一台机 

2.2 Hadoop启动 
2.2.1 进入 /home/hadoop/hadoop-1.0.4/bin目录下,格式化namenode 
[root@master bin]# hadoop namenode -format 
10/07/19 10:46:41 INFO namenode.NameNode: STARTUP_MSG: 
/************************************************************ 
STARTUP_MSG: Starting NameNode 
STARTUP_MSG:   host = master/202.173.253.36 
STARTUP_MSG:   args = [-format] 
STARTUP_MSG:   version = 1.0.4 
STARTUP_MSG:   build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-0.20 -r 911707; compiled by 'chrisdo' on 
************************************************************/ 
Re-format filesystem in /homel/hadoop/hdfs/name ? (Y or N) Y (输入Y)
10/07/19 10:46:43 INFO namenode.FSNamesystem: fsOwner=root,root,bin,daemon,sys,adm,disk,wheel 
10/07/19 10:46:43 INFO namenode.FSNamesystem: supergroup=supergroup 
10/07/19 10:46:43 INFO namenode.FSNamesystem: isPermissionEnabled=true 
10/07/19 10:46:43 INFO common.Storage: Image file of size 94 saved in 0 seconds. 
10/07/19 10:46:43 INFO common.Storage: Storage directory /home/hadoop/hdfs/name has been successfully formatted. 
10/07/19 10:46:43 INFO namenode.NameNode: SHUTDOWN_MSG: 
/************************************************************ 
SHUTDOWN_MSG: Shutting down NameNode at master/10.1.1.245
************************************************************/ 
2.2.2 启动hadoop所有进程 
在/home/hadoop/hadoop-1.0.4/bin 目录下,执行start-all.sh命令 
启动完成后,可用jps命令查看hadoop进程是否启动完全。正常情况下应该有如下进程: 
[root@master bin]# jps
10910 NameNode 
11431 Jps 
11176 SecondaryNameNode 
11053 DataNode 
11254 JobTracker 
11378 TaskTracker  
启动之后,在/home/hadoop/hadooptmp 下的dfs文件夹里会生成 data目录,这里面存放的是datanode上的数据块数据,因为笔者用的是单机,所以name 和 data 都在一个机器上,如果是集群的话,namenode所在的机器上只会有name文件夹,而datanode上只会有data文件夹。  
搭建过程中,在此环节出现的问题最多,经常出现启动进程不完整的情况,要不是datanode无法正常启动,就是namenode或是TaskTracker启动异常。当然有时候重启一下虚拟机在启动一下hadoop就能全部看见了。

 

你可能感兴趣的:(hadoop伪分布式搭建)