VM环境下基于多台CentOS虚拟机的Hadoop分布式集群环境搭建

  作者:jiangchao

  完成时间:2013年12月1日

  版本:v1.0

  主机:CentOS 6.4

  VM版本:9.0.0 build-812388

  ubuntu虚拟机jdk版本:1.6.0_45

  ubuntu虚拟机hadoop版本:1.2.1

  关键词: VM  CentOS  hadoop分布式环境 

一、总体概述

      本篇主要介绍笔者使用虚拟机vm9.0在CentOS 6.4环境下搭架3台hadoop分布式环境的过程,hadoop版本使用最新的apache官网上稳定的版本1.2.1,笔者一理科男,准备以后把工作学习上的经历通过博客记录下来,文章有不足和欠缺之处,希望各位大神不吝赐教:)

1、CentOS 6.4 链接:http://mirrors.163.com/centos/6.4/isos/x86_64/

2、jdk  链接:http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase6-419409.html

3、VM9.0.0 链接:http://dl.pconline.com.cn/html_2/1/59/id=457&pn=0.html

4、hadoop1.2.1   链接:http://mirror.esocc.com/apache/hadoop/common/hadoop-1.2.1/    (具体版本:hadoop-1.2.1.tar.gz

二、详细步骤

  在上面准备好环境和相关软件之后,下面开始安装,首先安装jdk,因为各个节点要求jdk版本一致,可以先在一台机器上安装好jdk,准备好hadoop集群软件,然后通过VM自带的系统克隆(clone)功能来进行克隆整个系统,克隆两份系统,这样我们就有3分一模一样的CentOS6.4系统啦。

1、  CentOS安装jdk

  首先我们下载linux系统使用的jdk版本bin文件,我的版本是jdk1.6.0_45,我将下载的jdk1.6.0_45.bin文件置于/usr/lib/jvm/java中。

(1)然后再shell中执行

sudo chmod u+x /usr/lib/jvm/java/jdk1.6.0_45.bin

修改bin文件权限,使其具有可执行权限

(2)

sudo /usr/lib/jvm/java/jdk1.6.0_45.bin

安装jdk,安装完毕之后,在相同目录下得到文件夹jdk1.6.0_45,下面进行jdk配置工作

(3)

sudo vi /etc/environment

在/etc/environment文件中添加以下环境变量

PATH="......:/usr/lib/jvm/java/jdk1.6.0_45/bin"
CLASSPATH=.:/usr/lib/jvm/java/jdk1.6.0_45/lib
JAVA_HOME=/usr/lib/jvm/java/jdk1.6.0_45

(4)执行

sudo source /home/hadoop/.bashrc

此时,jdk环境变量设置成功。

(5)由于CentOS环境下可能有默认的jdk,如openjdk,所以为了使用我们默认的jdk需要进行以下工作

sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java/jdk1.6.0_45/bin/java 300
sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java/jdk1.6.0_45/bin/javac 300

通过这一步将我们的 jdk加入java选单中。

(6)然后执行

sudo update-alternatives --config java

通过这一步选择系统默认的jdk

(7)jdk安装测试

java -version

我们在shell中可以看到当前使用的默认jdk是“java version "1.6.0_45"”的字样,这样jdk安装完毕。

2、修改主机名

由于安装hadoop集群环境,每个节点都有自己功能,例如有的是namenode,有的是datanodeXX,以及secondnamenode等等,笔者搭建的分布式hadoop环境中,namenode及secondnamenode为一台主机,另外两台主机是datanode01及datanode02,为了方便识别各台主机,以及今后方便查看各个节点日志,我们将各个主机的主机名修改为hadoop

环境中各个节点的名称,例如我的分别为namenode,datanode01,datanode02。

(1)sudo hostname 主机名

[hdp@localhost hadoop]$ sudo hostname namenode

 但是这种方法只是暂时的,根本的修改主机名还需要修改network文件中的主机名。

(2)修改network文件:

 [hdp@localhost hadoop]$ sudo vi /etc/sysconfig/network

将里面的hostname改成你自己想要设置的。然后重启终端,主机名已经修改完成!对于集群中的其他主机修改办法相同。

3、设置集群中主机的别名

       为了便于操作,我们将每台主机设置一个别名,这样就可以避免敲ip的痛苦,例如我将虚拟机集群中的三台主机的别名分别设置为namenode,datanode01和

datanode02, 这个与相应的主机名一样,方便辨认和输入。下面介绍如何设置主机别名。以namenode为例:

修改/etc/hosts文件:

[hdp@namenode ~]$ sudo vi /etc/hosts

 打开hosts文件之后,清空里面的内容,写入以下内容:

127.0.0.1 localhost localhost.localdomain localhost
192.168.1.111 namenode namenode.localdomain namenode
192.168.1.112 datanode01
192.168.1.113 datanode02

类似可以修改其他主机datanode01和datanode02。所以hosts文件中的内容,对于datanode01,就是第二行“192.168.1.111 namenode”后面没有内容,第三行修改为

192.168.1.112 datanode01 datanode01.localdomain datanode01

三、ssh无密码通信

1、将各主机之间密钥进行交换

     例如在namenode主机中执行:

 $scp ~/.ssh/id_rsa.pub hdp@datanode01:/home/hdp/.ssh/id_rsa.pub.namenode
 $scp ~/.ssh/id_rsa.pub hdp@datanode01:/home/hdp/.ssh/id_rsa.pub.namenode

     从而将namenode的密钥交给了datanode01和datanode02,对于datanode01和datanode02需要做同样的处理。在处理完成之后,.ssh文件下会有三个密钥,根据后缀名可以分辩,然后将所有密钥,包括自己的密钥加入到授权密钥authorized_keys中。下面以namenode为例:

 $cat id_isa.pub >> authorized_keys;
 $cat id_isa.pub.datanode01 >> authorized_keys;
 $cat id_isa.pub.datanode02 >> authorized_keys;

其他节点使用类似的方法进行操作。

备注:可能会出现的问题及解决方法:
错误:Agent admitted failure to sign using the key.
[hdp namenode]$ssh-add ~/.ssh/id_rsa

四、hadoop安装

1、将下载到的hadoop-1.2.1.tar.gz移动到个人目录/home/hdp/,执行安装操作

$tar -xzvf hadoop-1.2.1.tar.gz

2、会在当前路径生成hadoop文件夹,接着修改文件夹所有者

$sudo chown hdp:hdp hadoop-1.2.1

3、随后把hadoop的环境变量加入到/etc/profile中,添加如下内容

export HADOOP_INSTALL=/home/hdp/hadoop-1.2.1
export PATH=$HADOOP_INSTALL/bin:$PATH

4、接下来需要修改hadoop/conf/目录下的配置文件,共有6个文件需要修改,分别是masters、slaves、core-site.xml、mapred-site.xml、hdfs-site.xml、          hadoop-env.sh,修改如下:

[masters]
    namenode
[slaves]
   datanode01
   datanode02
[core-site.xml]

<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/hadoop/tmp</value>
<description>As you like</description>
</property>

<!--file system properties-->
<property>
<name>fs.default.name</name>
<value>hdfs://namenode:54310</value>
</property>
</configuration>
[mapred-site.xml]

<configuration>
<property>
<name>mapred.job.tracker</name>
<value>namenode:54311</value>
</property>
</configuration>
[hdfs-site.xml]

<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
[hadoop-env.sh]
添加:
export JAVA_HOME=/usr/lib/jvm/java/jdk1.6.0_45

 5、这样所有配置完成之后,首先进行文件系统格式化:

$hadoop namenode -format

6、然后启动hadoop进程:

$start-all.sh

对各个主机进行简单的监控基本方法:

(1)使用jps命令查看各个主机相关进程的启动与否

(2)在web页面中输入namenode:50030查看mapreduce运行状态;输入namenode:50070查看hdfs运行状态。

(3)在client中输入hadoop dfsadmin -report来查看各个节点的运行状态和参数。

五、wordcount样例运行

(1)在适合的当前目录新建一个文件夹,例如为input

$mkdir input

(2)在file01和file02两个文件中分别写入以下内容

$echo "Hello World Hadoop World" > file01
$echo "Hello Hadoop Goodbye Bye World" >file02

(3)将input文件夹上传到HDFS(hadoop分布式文件系统)中

$hadoop fs -put ./input  /user/hadoop

(4)在HADOOP_INSTALL目录下执行以下命令,运行wordcount例程

$hadoop jar hadoop-examples-1.2.1.jar  wordcount input output
<-------笔者的运行过程------>
[hadoop@namenode hadoop-1.2.1]$ hadoop jar hadoop-examples-1.2.1.jar  wordcount input output 
13/12/14 15:58:24 INFO input.FileInputFormat: Total input paths to process : 2
13/12/14 15:58:24 INFO util.NativeCodeLoader: Loaded the native-hadoop library
13/12/14 15:58:24 WARN snappy.LoadSnappy: Snappy native library not loaded
13/12/14 15:58:25 INFO mapred.JobClient: Running job: job_201312031710_0049
13/12/14 15:58:26 INFO mapred.JobClient:  map 0% reduce 0%
13/12/14 15:58:37 INFO mapred.JobClient:  map 50% reduce 0%
13/12/14 15:58:38 INFO mapred.JobClient:  map 100% reduce 0%
13/12/14 15:58:45 INFO mapred.JobClient:  map 100% reduce 4%
13/12/14 15:58:46 INFO mapred.JobClient:  map 100% reduce 20%
13/12/14 15:58:47 INFO mapred.JobClient:  map 100% reduce 54%
13/12/14 15:58:48 INFO mapred.JobClient:  map 100% reduce 62%
13/12/14 15:58:49 INFO mapred.JobClient:  map 100% reduce 75%
13/12/14 15:58:53 INFO mapred.JobClient:  map 100% reduce 87%
13/12/14 15:58:59 INFO mapred.JobClient:  map 100% reduce 100%

13/12/14 15:59:04 INFO mapred.JobClient: Job complete: job_201312031710_0049
13/12/14 15:59:04 INFO mapred.JobClient: Counters: 30
13/12/14 15:59:04 INFO mapred.JobClient:   Job Counters 
13/12/14 15:59:04 INFO mapred.JobClient:     Launched reduce tasks=8
13/12/14 15:59:04 INFO mapred.JobClient:     SLOTS_MILLIS_MAPS=23409
13/12/14 15:59:04 INFO mapred.JobClient:     Total time spent by all reduces waiting after reserving slots (ms)=0
13/12/14 15:59:04 INFO mapred.JobClient:     Total time spent by all maps waiting after reserving slots (ms)=0
13/12/14 15:59:04 INFO mapred.JobClient:     Rack-local map tasks=1
13/12/14 15:59:04 INFO mapred.JobClient:     Launched map tasks=2
13/12/14 15:59:04 INFO mapred.JobClient:     Data-local map tasks=1
13/12/14 15:59:04 INFO mapred.JobClient:     SLOTS_MILLIS_REDUCES=88164
13/12/14 15:59:04 INFO mapred.JobClient:   File Output Format Counters 
13/12/14 15:59:04 INFO mapred.JobClient:     Bytes Written=41
13/12/14 15:59:04 INFO mapred.JobClient:   FileSystemCounters
13/12/14 15:59:04 INFO mapred.JobClient:     FILE_BYTES_READ=241
13/12/14 15:59:04 INFO mapred.JobClient:     HDFS_BYTES_READ=278
13/12/14 15:59:04 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=574934
13/12/14 15:59:04 INFO mapred.JobClient:     HDFS_BYTES_WRITTEN=41
13/12/14 15:59:04 INFO mapred.JobClient:   File Input Format Counters 
13/12/14 15:59:04 INFO mapred.JobClient:     Bytes Read=56
13/12/14 15:59:04 INFO mapred.JobClient:   Map-Reduce Framework
13/12/14 15:59:04 INFO mapred.JobClient:     Map output materialized bytes=319
13/12/14 15:59:04 INFO mapred.JobClient:     Map input records=2
13/12/14 15:59:04 INFO mapred.JobClient:     Reduce shuffle bytes=319
13/12/14 15:59:04 INFO mapred.JobClient:     Spilled Records=16
13/12/14 15:59:04 INFO mapred.JobClient:     Map output bytes=92
13/12/14 15:59:04 INFO mapred.JobClient:     CPU time spent (ms)=37540
13/12/14 15:59:04 INFO mapred.JobClient:     Total committed heap usage (bytes)=6923026432
13/12/14 15:59:04 INFO mapred.JobClient:     Combine input records=9
13/12/14 15:59:04 INFO mapred.JobClient:     SPLIT_RAW_BYTES=222
13/12/14 15:59:04 INFO mapred.JobClient:     Reduce input records=8
13/12/14 15:59:04 INFO mapred.JobClient:     Reduce input groups=5
13/12/14 15:59:04 INFO mapred.JobClient:     Combine output records=8
13/12/14 15:59:04 INFO mapred.JobClient:     Physical memory (bytes) snapshot=5602529280
13/12/14 15:59:04 INFO mapred.JobClient:     Reduce output records=5
13/12/14 15:59:04 INFO mapred.JobClient:     Virtual memory (bytes) snapshot=48544591872
13/12/14 15:59:04 INFO mapred.JobClient:     Map output records=9

(5)查看运行结果

$hadoop fs -cat /user/hadoop/output/*
<-----结果输出------>
Goodbye 1
Hello 2
World 3
Bye 1
Hadoop 2

 至此,整个hadoop分布式环境搭建完成,开始自己的hadoop之旅吧!!

 

 

 

 

 

 

 

 

 

 

 

 

posted on 2013-12-14 16:26  Peter Jiang  阅读(573)  评论(0编辑  收藏  举报

导航