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 阅读(582) 评论(0) 编辑 收藏 举报