Hadoop集群搭建实践全记录

参考:http://www.open-open.com/lib/view/1328536842327

         http://hadoop.apache.org/common/docs/r0.19.2/cn/cluster_setup.html

         http://www.michael-noll.com/tutorials/running-hadoop-on-ubuntu-linux-single-node-cluster/

转载请标明出处SpringsSpace: http://springsfeng.iteye.com

        安装Hadoop集群通常要将安装软件解压到集群内的所有机器上。通常,集群里的一台机器被指定为

NameNode ,另一台不同的机器被指定为JobTracker ;这两台机器是masters 。而余下的机器即作

为DataNode 作为TaskTracker ,这些机器是slaves 。下面安装配置过程中使用HADOOP_HOME 指

代安装的根路径,一般情况下,集群里的所有机器的HADOOP_HOME 路径应该是的相同的。

1. 先决条件
    确保集群中的每个节点上都安装了所有必需软件:SUN-JDK(jdk-6u33-linux-i586.bin) ,ssh,Hadoop

    (hadoop-1.0.3.tar.gz):
    其总JDK必须安装,ssh 必须安装并且保证sshd一直运行,以便用Hadoop脚本管理远端Hadoop守护进程。
2 实验环境搭建
   2.1  准备工作
     操作系统:Ubuntu10.10,虚拟机:Vmvare8.X:可在vmvare安装好一台Ubuntu虚拟机后,可以导出或

     者克隆出另外两台虚拟机。
     准备机器:一台master,2台slave,配置每台机器的/etc/hosts保证各台机器之间通过机器名可以互访,例

     如:

     192.168.1.102 HADOOP-MASTER(master)
     192.168.1.103 HADOOP-SLAVE1 (slave1)
     192.168.1.104 HADOOP-SLAVE2(slave2)

     主机信息:
     机器名                              IP地址                                        作用
     HADOOP-MASTER       192.168.1.102                         NameNode、JobTracker

     HADOOP-SLAVE1         192.168.1.103                         DataNode、TaskTracker

     HADOOP-SLAVE2         192.168.1.104                         DataNode、TaskTracker   

   2.2 安装JDK 
     (1) 安装方式1:

     右键选择jdk-6u33-linux-i586.bin中的权限Tab页,选中“允许以程序执行文件”;进入jdk-6u33-linux-i586.bin

     所在目录,执行:./jdk-6u33-linux-i586.bin

     (2) 安装方式2:

     $ sudo apt-get install sun-java6-jdk 
     这个安装,java执行文件自动添加到/usr/bin/目录。
     验证 shell命令 :java -version 看是否与你的版本号一致。

     配置环境变量,请参考本博客Ubuntu下的Java开发环境搭建文章。
   2.3 创建目录
     在所有的机器上都建立相同的目录:

     sudo mkdir /usr/program/

     sudo chown hadoop:hadoop program/

     以该目录作为JDK,HADOOP的安装目录。    
   2.4 安装ssh和配置

     参考:Linux上安装使用SSH(ubuntu&&redhat) :

     http://blog.csdn.net/zxs9999/article/details/6930736
     1) 安装:sudo apt-get install ssh
     2) 配置:
     在Hadoop启动以后,Namenode是通过SSH(Secure Shell)来启动和停止各个Datanode上的各种守护

进程的,这就需要在节点之间执行指令的时候是不须要输入密码的形式,故我们需要配置SSH运用无密码公

钥认证的形式。以本文中的三台机器为例,现在HADOOP-MASTER是主节点,他须要连接HADOOP-

SLAVE1和HADOOP-SLAVE2。需要确定每台机器上都安装了ssh,并且Datanode机器上sshd服务已经启动。

    ( 说明:hadoop@Ubuntu~]$ssh-keygen  -t  rsa
    这个命令将为Ubuntu上的用户hadoop生成其密钥对,询问其保存路径时直接回车采用默认路径,当提示要

为生成的密钥输入passphrase的时候,直接回车,也就是将其设定为空密码。生成的密钥对id_rsa,

id_rsa.pub ,默认存储在/home/hadoop/.ssh 目录下然后将 id_rsa.pub的内容复制到每个机器(也包括本机)的

/home/hadoop/.ssh/authorized_keys 文件中,如果机器上已经有 authorized_keys这个文件了,就在文件末

尾加上id_rsa.pub中的内容,如果没有authorized_keys这个文件,直接复制过去就行.)


     3) 首先设置Namenode的ssh为无需密码的、自动登录
     hadoop@HADOOP-MASTER :~$ ssh-keygen -t rsa 然后一直按回车
     完成后,在home跟目录下会产生隐藏文件夹.ssh
     hadoop@HADOOP-MASTER :~$ cd .ssh
     hadoop@HADOOP-MASTER :~/.ssh$ ll
     hadoop@HADOOP-MASTER :~/.ssh$ cat authorized_keys
     测试:
     ssh localhost 发现链接成功,并且无需密码。
     4 ) 复制到HADOOP-SLAVE1 和HADOOP-SLAVE2上
     hadoop@HADOOP-MASTER:~/.ssh$ scp authorized_keys HADOOP-SLAVE1:/home/hadoop/.ssh/
     hadoop@HADOOP-MASTER:~/.ssh$ scp authorized_keys HADOOP-SLAVE2:/home/hadoop/.ssh/

     输入 yes 来继续。这会把该服务器添加到你的已知主机的列表中
     The authenticity of host 'hadoop-slave1 (192.168.1.103)' can't be established.
     ECDSA key fingerprint is 77:9a:8a:91:bd:de:6b:0a:d3:3d:62:c2:de:13:4a:b4.
     Are you sure you want to continue connecting (yes/no)? yes
     Warning: Permanently added 'hadoop-slave1,192.168.1.103' (ECDSA) to the list of known hosts.
     hadoop@hadoop-slave1's password:
     这里会提示输入密码,输入hadoop账号密码就可以了。

     改动你的 authorized_keys 文件的许可权限:
     hadoop@HADOOP-MASTER:~/.ssh$ chmod 644 authorized_keys

     hadoop@HADOOP-SLAVE1:~/.ssh$ chmod 644 authorized_keys

     hadoop@HADOOP-SLAVE2:~/.ssh$ chmod 644 authorized_keys

     检查下能不能配置成功,从hadoop机器上ssh到AHDOOP-SLAVE1和HADOOP-SLAVE2,如果不需要输

     入密码则配置成功,如果还须要检查上面的配置能不能正确。例如:

     hadoop@HADOOP-MASTER:~$ ssh HADOOP-SLAVE1

     hadoop@HADOOP-MASTER:~$ ssh HADOOP-SLAVE2

   2.5 安装Hadoop
     下载安装包后,直接解压安装即可:
     $ tar -zxvf hadoop-1.0.3.tar.gz

     1) 安装Hadoop集群通常要将安装软件解压到集群内的所有机器上。并且安装路径要一致,如果用HADOOP

     _HOME =/usr/program/hadoop-1.0.3, 指代安装的根路径,通常,集群里的所有机器的HADOOP_HOME路

     径相同。

     2) 如果集群内机器的环境完全一样,可以在一台机器上配置好,然后把配置好的软件即hadoop-1.0.3整个文

     件夹拷贝到其他机器的相同位置即可。

     3) 可以将Master上的Hadoop通过scp拷贝到每一个Slave相同的目录下,同时根据每一个Slave的Java_

     HOME 的不同修改其hadoop-env.sh 。
     4) 为了方便,使用hadoop命令或者start-all.sh等命令。

     修改Master和Slave上的/etc/profile :新增以下内容:
     JAVA_HOME=/usr/program/jdk1.6.0_33
    HADOOP_HOME=/usr/program/hadoop-1.0.3
    PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin
    CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    export JAVA_HOME HADOOP_HOME PATH CLASSPATH
     修改完毕后,执行source /etc/profile 来使其生效。

     5) 配置conf/hadoop-env.sh文件
     配置conf/hadoop-env.sh 文件
     #添加
     export JAVA_HOME= /usr/program/jdk1.6.0_33
     #这里修改为你的jdk的安装位置。
     测试hadoop安装:

     hadoop@HADOOP-MASTER:/usr/program/hadoop-1.0.3$ bin/hadoop jar hadoop-examples-1.0.3.jar  wordcount conf/  /tmp/out

3. 集群配置(所有节点相同)
    3.1配置文件:conf/core-site.xml
    <?xml version="1.0"?>
            <?xml-stylesheet type="text/xsl"href="configuration.xsl"?>
            <configuration>
                          <property>
                                    <name>fs.default.name</name>
                                    <value>hdfs://HADOOP-MASTER:49000</value>
                         </property>
                         <property>
                                    <name>hadoop.tmp.dir</name>
                                    <value>/home/hadoop/hadoop-workspace/var</value>
                         </property>
            </configuration>
       1) fs.default.name是NameNode的URI。hdfs://主机名:端口/
       2) hadoop.tmp.dir :Hadoop的默认临时路径,这个最好配置,如果在新增节点或者其他情况下莫名其妙的

       DataNode启动不了,就删除此文件中的tmp目录即可。不过如果删除了NameNode机器的此目录,那么就

       需要重新执行NameNode格式化的命令。
    3.2配置文件:conf/mapred-site.xml
    <?xmlversion="1.0"?>
          <?xml-stylesheettype="text/xsl" href="configuration.xsl"?>
               <configuration>
                    <property>
                          <name>mapred.job.tracker</name>
                          <value>HADOOP-MASTER:49001</value>
                    </property>
                    <property>
                          <name>mapred.local.dir</name>
                          <value>/home/hadoop/hadoop-workspace/var</value>
                    </property>
              </configuration>
         1) mapred.job.tracker是JobTracker的主机(或者IP)和端口。主机:端口。
      3.3配置文件:conf/hdfs-site.xml
      <?xmlversion="1.0"?>
            <?xml-stylesheettype="text/xsl" href="configuration.xsl"?>
                 <configuration>
                       <property>
                             <name>dfs.name.dir</name>
                             <value>/home/hadoop/name1, /home/hadoop/name2</value> #hadoop的name目录路径
                             <description>  </description>
                       </property>
                       <property>
                             <name>dfs.data.dir</name>
                             <value>/home/hadoop/data1, /home/hadoop/data2</value>
                             <description> </description>
                        </property>
                        <property>
                              <name>dfs.replication</name>
                              <!-- 我们的集群又两个结点,所以rep两份 -->
                              <value>2</value>
                        </property>
                   </configuration>
       1)  dfs.name.dir是NameNode持久存储名字空间及事务日志的本地文件系统路径。 当这个值是一个逗号分

       割的目录列表时,nametable数据将会被复制到所有目录中做冗余备份。
       2)  dfs.data.dir是DataNode存放块数据的本地文件系统路径,逗号分割的列表。 当这个值是逗号分割的目

       录列表时,数据将被存储在所有目录下,通常分布在不同设备上。
       3) dfs.replication是数据需要备份的数量,默认是3,如果此数大于集群的机器数会出错。

       注意: 此处的name1、name2、data1、data2目录不能预先创建,hadoop格式化时会自动创建,如果预先

      创建反而会有问题。
    3.4配置masters和slaves主从结点
      配置conf/masters和conf/slaves来设置主从结点,注意最好使用主机名,并且保证机器之间通过主机名可以

      互相访问,每个主机名一行。

       hadoop@HADOOP-MASTER:/usr/program/hadoop-1.0.3/conf$ gedit masters
       输入:
       HADOOP-MASTER     #注意输入的内容前后不要有空格
      hadoop@HADOOP-SLAVE1:/usr/program/hadoop-1.0.3/conf$ gedit masters

      hadoop@HADOOP-SLAVE1:/usr/program/hadoop-1.0.3/conf$ gedit slaves

      hadoop@HADOOP-SLAVE2:/usr/program/hadoop-1.0.3/conf$ gedit masters

      hadoop@HADOOP-SLAVE2:/usr/program/hadoop-1.0.3/conf$ gedit slaves
       输入:
       HADOOP-SLAVE1
       HADOOP-SLAVE2

       配置结束,把配置好的hadoop-1.0.3文件夹拷贝到其他集群的机器中,并且保证上面的配置对于其他机器而

       言正确,例如:如果其他机器的Java安装路径不一样,要修改conf/hadoop-env.sh

       $ scp -r /usr/program/hadoop-1.0.3 hadoop@HADOOP-SLAVE1: /usr/program/hadoop-1.0.3

4 hadoop启动
    4.1 格式化一个新的分布式文件系统
     先格式化一个新的分布式文件系统,在Master机器上执行:
     hadoop@HADOOP-MASTER:/usr/program/hadoop-1.0.3$ bin/hadoop namenode -format

     成功情况下系统输出:

12/06/29 02:50:31 INFO namenode.NameNode: STARTUP_MSG: 
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG:   host = HADOOP-MASTER/192.168.1.102
STARTUP_MSG:   args = [-format]
STARTUP_MSG:   version = 1.0.3
STARTUP_MSG:   build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.0 -r 1335192; compiled by 'hortonfo' on Tue May  8 20:31:25 UTC 2012
************************************************************/
12/06/29 02:50:32 INFO util.GSet: VM type       = 32-bit
12/06/29 02:50:32 INFO util.GSet: 2% max memory = 19.33375 MB
12/06/29 02:50:32 INFO util.GSet: capacity      = 2^22 = 4194304 entries
12/06/29 02:50:32 INFO util.GSet: recommended=4194304, actual=4194304
12/06/29 02:50:32 INFO namenode.FSNamesystem: fsOwner=hadoop
12/06/29 02:50:32 INFO namenode.FSNamesystem: supergroup=supergroup
12/06/29 02:50:32 INFO namenode.FSNamesystem: isPermissionEnabled=true
12/06/29 02:50:32 INFO namenode.FSNamesystem: dfs.block.invalidate.limit=100
12/06/29 02:50:32 INFO namenode.FSNamesystem: isAccessTokenEnabled=false accessKeyUpdateInterval=0 min(s), accessTokenLifetime=0 min(s)
12/06/29 02:50:32 INFO namenode.NameNode: Caching file names occuring more than 10 times 
12/06/29 02:50:32 INFO common.Storage: Image file of size 112 saved in 0 seconds.
12/06/29 02:50:32 INFO common.Storage: Storage directory /home/hadoop/name1 has been successfully formatted.
12/06/29 02:50:32 INFO common.Storage: Image file of size 112 saved in 0 seconds.
12/06/29 02:50:32 INFO common.Storage: Storage directory /home/hadoop/name2 has been successfully formatted.
12/06/29 02:50:32 INFO namenode.NameNode: SHUTDOWN_MSG: 
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at HADOOP-MASTER/192.168.1.102
************************************************************/
 

     查看输出保证分布式文件系统格式化成功。
     执行完后可以到Master机器上看到/home/hadoop//name1和/home/hadoop//name2两个目录。在主节点

     Master上面启动hadoop,主节点会启动所有从节点的hadoop。
   4.2 启动所有节点
     hadoop@HADOOP-MASTER:/usr/program/hadoop-1.0.3/bin$ ./start-all.sh

     运行正确输出:

starting namenode, logging to /usr/program/hadoop-1.0.3/libexec/../logs/hadoop-hadoop-namenode-HADOOP-MASTER.out
HADOOP-SLAVE1: starting datanode, logging to /usr/program/hadoop-1.0.3/libexec/../logs/hadoop-hadoop-datanode-HADOOP-SLAVE1.out
HADOOP-SLAVE2: starting datanode, logging to /usr/program/hadoop-1.0.3/libexec/../logs/hadoop-hadoop-datanode-HADOOP-SLAVE2.out
HADOOP-MASTER: starting secondarynamenode, logging to /usr/program/hadoop-1.0.3/libexec/../logs/hadoop-hadoop-secondarynamenode-HADOOP-MASTER.out
starting jobtracker, logging to /usr/program/hadoop-1.0.3/libexec/../logs/hadoop-hadoop-jobtracker-HADOOP-MASTER.out
HADOOP-SLAVE2: starting tasktracker, logging to /usr/program/hadoop-1.0.3/libexec/../logs/hadoop-hadoop-tasktracker-HADOOP-SLAVE2.out
HADOOP-SLAVE1: starting tasktracker, logging to /usr/program/hadoop-1.0.3/libexec/../logs/hadoop-hadoop-tasktracker-HADOOP-SLAVE1.out
     

     执行完后可以到Master(HADOOP-MASTER)和Slave(HADOOP-SLAVE1,HADOP-SLAVE2)机器上看到

     /home/hadoop/hadoopfs/data1和/home/hadoop/data2两个目录。
   4.3 关闭所有节点
     从主节点master关闭hadoop,主节点会关闭所有从节点的hadoop。
     hadoop@HADOOP-MASTER:/usr/program/hadoop-1.0.3/bin$ ./stop-all.sh

     运行正确输出:

stopping jobtracker
HADOOP-SLAVE2: stopping tasktracker
HADOOP-SLAVE1: stopping tasktracker
stopping namenode
HADOOP-SLAVE1: stopping datanode
HADOOP-SLAVE2: stopping datanode
HADOOP-MASTER: stopping secondarynamenode
      Hadoop守护进程的日志写入到 ${HADOOP_LOG_DIR} 目录 (默认是 ${HADOOP_HOME}/logs).

     ${HADOOP_HOME}就是安装路径.

5 .测试
    1) 浏览NameNode和JobTracker的网络接口,它们的地址默认为:
    NameNode - http://HADOOP-MASTER:50070/
    JobTracker - http://HADOOP-SLAVE1:50030/
    2) 使用netstat  –nat 查看端口49000和49001是否正在使用。
    3) 使用jps 查看进程。


    要想检查守护进程是否正在运行,可以使用 jps 命令(这是用于 JVM 进程的ps 实用程序)。这个命令列出

    5 个守护进程及其进程标识符。

   
    4) 将输入文件拷贝到分布式文件系统:
    $ bin/hadoop fs -mkdir input
    $ bin/hadoop fs -put conf/core-site.xml input

   
    运行发行版提供的示例程序:
    $ bin/ h adoop jar hadoop-examples-1.0.3.jar wordcount grep input output 'dfs[a-z.]+'

    具体可参考:http://springsfeng.iteye.com/admin/blogs/1379237

6.补充
    Q: bin/hadoop jar hadoop-examples-1.0.3.jar grep input output 'dfs[a-z.]+' 什么意思啊?
    A: bin/hadoop jar(使用hadoop运行jar包) hadoop-examples-1.0.3.jar(jar包的名字) grep (要使用的类,

    后边的是参数)input output 'dfs[a-z.]+' 
    整个就是运行hadoop示例程序中的grep,对应的hdfs上的输入目录为input、输出目录为output。
    Q: 什么是grep?
    A: A map/reduce program that counts the matches of a regex in the input.

    查看输出文件:
    将输出文件从分布式文件系统拷贝到本地文件系统查看:
    $ bin/hadoop fs -get output output
    $ cat output/*

    或者在分布式文件系统上查看输出文件:
    $ bin/hadoop fs -cat output/*

    统计结果:
    root@v-jiwan-ubuntu-0:~/hadoop/hadoop-0.20.2-bak/hadoop-0.20.2#bin/hadoop fs -cat output/part-00000
    3       dfs.class
    2       dfs.period
    1       dfs.file
    1      dfs.replication
    1       dfs.servers
    1       dfsadmin

7. HDFS常用操作
    hadoopdfs -ls 列出HDFS下的文件
    hadoop dfs -ls in 列出HDFS下某个文档中的文件
    hadoop dfs -put test1.txt test 上传文件到指定目录并且重新命名,只有所有的DataNode都接收完数据才

                                                        算成功
    hadoop dfs -get in getin 从HDFS获取文件并且重新命名为getin,同put一样可操作文件也可操作目录
    hadoop dfs -rmr out 删除指定文件从HDFS上
    hadoop dfs -cat in/* 查看HDFS上in目录的内容
    hadoop dfsadmin -report 查看HDFS的基本统计信息,结果如下
    hadoop dfsadmin -safemode leave 退出安全模式
    hadoop dfsadmin -safemode enter 进入安全模式


8.添加节点
    可扩展性是HDFS的一个重要特性,首先在新加的节点上安装hadoop,然后修改$HADOOP_HOME/conf

    /master文件,加入 NameNode主机名,然后在NameNode节点上修改$HADOOP_HOME/conf/slaves文

    件,加入新加节点主机名,再建立到新加节点无密码的SSH连接, 运行启动命令:
    start-all.sh
    然后可以通过http://(Masternode的主机名):50070查看新添加的DataNode


9. 负载均衡
    start-balancer.sh,可以使DataNode节点上选择策略重新平衡DataNode上的数据块的分布。

相关推荐