Hadoop系统分布式集群搭建方法


        记得以前学习hadoop时,互联网上有不少有关Hadoop环境搭建的方法,但很多语焉不详,步骤不清晰。下面是本人亲自搭建hadoop完全分布式系统环境的笔记,沉落硬盘已久,闲来无事,现整理后发到博客上,和博友共勉,希望对hadoop初学者有所帮助,欣喜不已!

1. linux操作系统安装

在每个节点上安装Linux操作系统(Centos6.3),安装时为各机器分别命名为 Master,slave1、slave2…。令主机名为Master的作为主节点,主机名为slave1、slave2…作为从节点。

如果是在已经安装好系统的集群中配置hadoop环境,且各机器的主机名命名无规律,这时最好按照下述方法修改主机名。

1.1编辑各个机器的主机名:(将主从节点的主机名分别命名为Master,slave1、slave2…)

 [root@Centos ~]# vi /etc/hostname

 [root@Centos ~]# vi /etc/sysconfig/network

注:如有必要,主从节点都需要修改,这样改的目的是容易规划集群中的机器。


1.2为所有主从节点设置静态IP(为所有机器配置好静态IP)

1.2.1修改网卡配置,编辑:vi /etc/sysconfig/network-scripts/ifcfg-eth0

1.2.2修改网关配置,编辑:vi /etc/sysconfig/network

1.2.3修改DNS 配置,编辑:vi /etc/resolv.conf

1.2.4重启网络服务,  执行命令:service network restart


2.安装SSH并配置免密码SSH访问机制(重要)

如果安装RHELS 6.0 ,确保软件安装时把SSH选上;如果安装Linux时没有安装SSH,则需要另行安装SSH。

 

hadoop分布集群 hadoop集群完全分布式搭建_完全分布式

配置为可以免密码登录主节点和从节点:

首先查看在“当前用户”文件夹下是否存在.ssh文件夹(注意ssh前面有“.”,这是一个隐藏文件夹)。输入命令查看此文件夹是否存在。一般来说,安装SSH时会自动在当前用户下创建这个隐藏文件夹,如果没有,可以手创建一个。)

下面的配置我是在主节点Masterhadoop用户下进行的:

[hadoop@Master ~]# ls –a

发现.ssh文件夹已经存在。

接下来输入命令(注意下面命令中不是双引号,是两个单引号):

执行: [hadoop @Master ~]# ssh-keygen -t  rsa

Generating public/private rsa key pair.
Enter file in which to save the key (/home/hadoop/.ssh/id_rsa): & 按回车默认路径 &
Created directory '/home/ hadoop /.ssh'.  &创建/ hadoop /.ssh目录&
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in/home / hadoop /.ssh/id_rsa.
Your public key has been saved in/home / hadoop /.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

通过以上命令将在/home/ hadoop /.ssh/目录下生成id_rsa私钥和id_rsa.pub公钥

进入/ hadoop /.ssh目录在namenode节点下做如下配置:

[hadoop @Master.ssh]# cat id_rsa.pub > authorized_keys

至此,主节点配置完毕,可通过ssh本机IP 测试是否需要密码登录。

操作如图所示:说明配置无密码登录成功!

hadoop分布集群 hadoop集群完全分布式搭建_集群_02


然后配置从节点,将authorized_keys文件复制到所有从节点上:

[hadoop@Master.ssh]$ scp authorized_keys  [从节点主机名或IP]:/home/hadoop/.ssh

至此免密码登录各节点已配置完毕,可通过ssh各节点IP 测试是否需要密码登录。

 

3.安装Java(首先使用[root@ Master ~]#arch命令查看机器属于32位还是64位机)

 (1)查看系统默认安装的JDK,命令:java -version

 (2)下载和安装自己的Jdk,将jdk安装在/usr/java目录下。

root用户登陆,新建目录mkdir  /usr/java,然后将 JDK 安装包jdk-6u13-linux-i586.bin复制到目录/usr/java下,进入该目录,执行安装命令“./ jdk-6u13-linux-i586.bin”,安装完成后将在目录下生成jdk的安装文件夹/jdk1.6.0_13

 (3)删除默认安装的jdk

      查看jdk的版本号:rpm -qa|grep  jdk    卸载:yum -y remove


4.创建专门的hadoop用户(令hadoop集群中的所有机器都是在hadoop用户下工作!)

创建用户组:hadoop,然后在此用户组下创建hadoop用户。可在安装系统的时候创建,也可以在安装好之后用如下命令创建:

[root@ Master ~]# groupadd  hadoop

[root@ Master ~]# useradd -g hadoop  -d /home/hadoop  hadoop

“hadoop”是所创建的用户名, -d指明“ hadoop”用户的home目录是/home/hadoop)

[root@ Master ~]# passwd hadoop [给用户hadoop设置口令]

1). 在真实集群分布模式下,要求集群中所有节点使用相同的用户名,这是hadoop的基本要求。比如,可以使用“hadoop”作为所有节点上统一的用户名。

2). 并且要求在所有节点上安装的hadoop系统具有完全一致的目录结构。

 

5.在主节点上解压安装Hadoop

—  到Hadoop官网下载hadoop-1.0.1.tar.gz(本人使用的是此版本!)

—  建立安装目录

    [hadoop@ Master ~] $mkdir ~/hadoop_installs

—  把hadoop-1.0.1.tar.gz放在这里,然后解压:

[hadoop@ Master hadoop_installs]$ tar –zxvf hadoop-1.0.1.tar.gz

解压安装完毕,可得hadoop的安装根目录为:/home/hadoop/hadoop_installs/hadoop-1.0.1

注:这个过程仅需在主节点上完成,然后安装好的Hadoop系统在完成后续配置后可被复制到所有从节点。

6.配置环境变量(每个节点都必须做)

—  进入到“hadoop用户下[root@Master ~]# su –hadoop [注意中间的”-”不要丢]

   [hadoop@ Master ~]$vi  ~/.bash_profile (此修改方式仅对hadoop用户生效)

  注: [root@ Master ~]#vi  /etc/profile这种修改方式是对本机所有用户生效!

设置如下环境变量:

 

export  JAVA_HOME=/usr/java/jdk1.6.0_13
  export  JRE_HOME=/usr/java /jdk1.6.0_13/jre
   export  CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
   export  PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export  HADOOP_HOME=/home/hadoop/hadoop_installs/hadoop-1.0.1
   export  PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin

在vi编辑器增加以上内容后保存退出,并执行以下命令使配置生效!

#chmod  +x  /etc/profile;增加执行权限

#source  /etc/profile;使配置生效!

配置完毕后,在命令行中输入:java -version,如出现下列信息说明java环境安装成功。

java version "1.6.0_13"

Java(TM) SE Runtime Environment (build 1.6.0_13-b03)

Java HotSpot(TM) Server VM (build 16.3-b01, mixed mode)


7.在主节点上修改hadoop配置文件

  Hadoop的配置文件存放在hadoop安装目录下的conf目录中,主要有以下几个配置文件要修改:

—  conf/hadoop-env.sh:Hadoop环境变量设置

—  conf/core-site.xml:主要完成NameNode的IP和端口设置

—  conf/hdfs-site.xml:主要完成HDFS的数据块副本等参数设置

—  conf/mapred-site.xml:主要完成JobTracker IP和端口设置

—  conf/masters:完成master节点IP设置

 进入/home/hadoop/hadoop_install/hadoop-1.0.1/conf,配置Hadoop配置文件

7.1配置hadoop-env.sh文件

打开文件命令:vi hadoop-env.sh

添加 # set java environment

             export JAVA_HOME=/usr/java/jdk1.6.0_13

编辑后保存退出。

7.2配置core-site.xml

[hadoop@Master conf]$ vi core-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
   <property>
     <name>fs.default.name</name>
     <value>hdfs://Master:9000/</value>
//注:Master为主节点主机名,9000后面的“/”不能少
   </property>
    <property> 
      <name>hadoop.tmp.dir</name> 
<value>/tmp</value> 
</property>
</configuration>

说明:hadoop分布式文件系统的两个重要的目录结构,一个是namenode上名字空间的存放地方,一个是datanode数据块的存放地方,还有一些其他的文件存放地方,这些存放地方都是基于hadoop.tmp.dir目录的,比如namenode的名字空间存放地方就是 ${hadoop.tmp.dir}/dfs/name, datanode数据块的存放地方就是 ${hadoop.tmp.dir}/dfs/data,所以设置好hadoop.tmp.dir目录后,其他的重要目录都是在这个目录下面,这是一个根目录。在此设置的是 /tmp,当然这个目录必须是存在的。

7.3配置hdfs-site.xml

[hadoop@Master conf]$ vi  hdfs-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
  <property>
     <name>dfs.replication</name>
     <value>3</value>
  </property>
</configuration>

7.4配置mapred-site.xml

[hadoop@Master conf]$ vi mapred-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
  <property>
     <name>mapred.job.tracker</name>
     <value>Master:9001</value>
  </property>
</configuration>

7.5配置masters文件和slaves文件

[hadoop@Master conf]$ vi masters   修改为主节点的主机名

[hadoop@Master conf]$ vi slaves   列出所有从节点的主机名

注:这个过程仅需在主节点上进行,然后将随着主机上安装好的Hadoop目录一起复制到所有从节点


8.复制Hadoop系统到所有从节点

将在主节点安装好的Hadoop系统目录复制到每一个从节点上:

[hadoop@ Master ~]$ scp -r /home/hadoop/hadoop-installs [从节点主机名或IP]:/home/hadoop/

这样可以避免对每一个从节点重复进行Hadoop系统安装。


9.在NameNode和DataNode节点上分别进行“主机名和IP解析”配置

修改每台机器的/etc/hosts设置:

—  若为NameNode,则需要在hosts文件中添加集群中所有节点的IP地址机器对应的主机名。示例:

hadoop分布集群 hadoop集群完全分布式搭建_搭建方法_03

—  若为DataNode,则只需要在文件中添加本机和NameNode的IP地址及对应的主机名。

10.格式化NameNode

—  执行Hadoop的bin文件夹中的格式化命令:

    [hadoop@ Master ~]$ hadoop namenode -format

   

    如果格式化成功,会返回一堆有关NameNode的启动信息,其中会有一句“…. has been successfully formatted.”

 

11.启动HDFS和MapReduce

—  执行以下命令启动HDFS和MapReduce

     [hadoop@ Master ~]$ start-all.sh

—  用JPS命令检查一下是否正常启动:

     [hadoop@ Master ~]$ jps

显示以下各进程信息则说明HDFS和MapReduce都已正常启动:

4706 JobTracker

4582 SecondaryNameNode

4278 NameNode

4413 DataNode

4853 TaskTracker

4889 Jps

12 查看集群状态

命令方式: [hadoop@Master bin]$ hadoop dfsadmin –report

浏览器方式:在WEB页面下查看Hadoop工作情况

输入部署Hadoop服务器的IPhttp://IP:50070http://IP:50030.

 

 

13.运行测试

—  在Linux文件系统下(如/home/hadoop /test)创建两个文本数据文件:

file1.txt:hello hadoop hello world
          file2.txt:goodbye hadoop

—  在hdfs分布式文件系统创建目录input:

[hadoop@ Master ~]$ hadoop fs -mkdir input

—  离开hodoop的安全模式:

[hadoop@Master ~]$ hadoop dfsadmin –safemode leave

—  将文件复制到HDFS文件系统中的input文件夹下:(下面命令二选一使用)

 

[hadoop@Master ~]$ hadoop  dfs  –copyFromLocal   ~/test/*   input
       [hadoop@Master ~]$hadoop  fs  –put  ~/test/*  input

—  运行hadoop安装包中自带的WorldCount程序进行测试:

[hadoop@Master ~]$hadoop jar hadoop-1.0.1-examples.jar  wordcount  input  output

注:其中output只能由程序创建,HDFS文件系统中不能事先存在.

—  在查看执行结果:

[hadoop@Master ~] hadoop dfs -cat output/*


14.停止HDFS和MapReduce

—  执行以下命令启动HDFS和MapReduce

     [hadoop@ Master ~]$ stop-all.sh