Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1080854
  • 博文数量: 83
  • 博客积分: 159
  • 博客等级: 上尉
  • 技术积分: 2221
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-15 17:08
个人简介

……致我那曾经苦逼的岁月……

文章分类
文章存档

2018年(1)

2017年(7)

2016年(13)

2014年(1)

2013年(12)

2012年(27)

2011年(22)

分类: 服务器与存储

2012-06-26 09:35:35

首先确定hdfs分布式文件系统目前很多大公司都在用,例如百度、腾讯、淘宝等。相信网上也有很多关于这方面的文档,我写这篇文章只是为了自己更加深刻的学习和理解,或者帮助一些不会搭建的童鞋们!以前我搭建的是hadoop-0.20.2、hbase-0.90.4、hbase自带的zookeeper,但是经过与开发测试后,用了hadoop-1.0.3、hbase-0.92.1和独立部署的zookeeper-3.3.5版本替代上述版本。下面开始配置分布式集群。
前期准备工作,大致分为以下几步:
1)安装jdk并检查是否正常。
2)每台几点上实现无密码认证及检查是否正常。
3)安装hadoop并配置,检查是否正常。
本次环境一共用了四台服务器,操作系统均使用RedHat4.8版本、JAVA使用的是版本是jdk1.6.0_14,当然你可以找适合自己的版本,但是务必是1.6以上。
主机名          IP地址            用途
hadoop1       192.168.3.65        namenode、jobtracker
hadoop2       192.168.3.66        datanode、tasktracker
hadoop3       192.168.3.67        datanode、tasktracker
hadoop4       192.168.3.64        secondarynamenode、tasktracker、datanode
对于hadoop来说,在hdfs看来节点分为namenode、datanode。namenode只有一个,datanode可以是很多;在mapreduce看来节点分为jobtracker、tasktracker,jobtracker只有一个,tasktracker有多个。我这里是将namenode和jobtracker部署在同一节点上,datanode和tasktracker部署在其它节点上,另外hadoop4上面还部署了secondarynamenode。当然你可以全部部署在一台机器上,但是这样根本无法测试hdfs分布式文件系统的性能。所以根据个人的情况而定。
以本实验为例,四台机器的hosts文件分别如下,(注意把127.0.0.1那一行直接删除掉,避免一些客观因素的影响),写完后四台机器分别使用PING每个节点的主机名测试一下连通性即可!下面红色字体则是输入命令。

[root@hadoop1 ~] # more /etc/hosts

# Do not remove the following line, or various programs
# that require network functionality will fail.
192.168.3.65    hadoop1
192.168.3.66    hadoop2
192.168.3.67    hadoop3
192.168.3.64    hadoop4
1、下面开始安装jdk,上传到/root目录下,我只在一台机器上示范安装,其余的节点也请自行完成安装。
[root@hadoop1 ~] # chmod a+x jdk-6u14-linux-x64.bin
[root@hadoop1 ~] # ./jdk-6u14-linux-x64.bin(一路空格,提示输入yes和no的时候输入yes即可)
将安装目录移动到/usr/java目录下(java目录自行创建)

[root@hadoop1 ~] # mkdir /usr/java

[root@hadoop1 ~] # mv jdk1.6.0_14 /usr/java

配置java的环境变量

[root@hadoop1 ~] # vi .bash_profile

添加如下内容:

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

export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar

export PATH=$JAVA_HOME/bin:$PATH

让添加的环境变量生效执行如下命令:

[root@hadoop1 ~] # source .bash_profile

验证安装是否成功?如果出来以下信息则说明安装没有任何问题。

[root@hadoop1 ~]#  java -version
java version "1.6.0_14"
Java(TM) SE Runtime Environment (build 1.6.0_14-b08)
Java HotSpot(TM) 64-Bit Server VM (build 14.0-b16, mixed mode)

同样在hadoop2、hadoop3、hadoop4上面安装jdk。

2、由于hadoop要求所有机器上hadoop的部署目录结构要求相同,并且都有一个相同的用户名的账户。参考各种文档上说的是三台机器都建立一个hadoop用户,使用这个账户来实现无密码认证。但是我用了这个hadoop这个账户做好信任关系之后还是需要密码登录,后来才知道是authorized_keys这个文件的权限的关系。这里我就用root用户做。个人建议下载hadoop稳定版本,因为后面还需要配置hbase的,如果选择的版本不匹配,那么出现的问题将会让你找不到头绪。这里提醒大家多看官方文档。下载地址:

下载文件后上传到/root目录下并将其解压:(所有的操作均在hadoop1上操作,除去在数据节点上操作的我会特殊说明,为了实验方便就放root用户下,如果是真实环境建议放别的目录下面)

[root@hadoop1 ~] # tar -zxvf  hadoop-1.0.3.tar.gz

将解压完后的目录备份一份并且重命名为hadoop即可!(方便以后有问题好恢复)

[root@hadoop1 ~] # cp -r hadoop-1.0.3 hadoop

这样一来,所有的配置文件都在/root/hadoop/conf/目录中,所有执行程序都在/root/hadoop/bin目录中。

Hadoop启动以后,Namenode是通过SSH(Secure Shell)来启动和停止各个节点上的各种守护进程的,这就需要在节点之间执行指令的时候是不需要输入密码的方式,故我们需要配置SSH使用无密码公钥认证的方式。

首先要保证每台机器上都装了SSH服务器,且都正常启动。实际中我们用的都是,这是SSH协议的一个免费开源实现。

以本文中的4台机器为例,现在hadoop1是主节点,它需要主动发起SSH连接到hadoop2,对于SSH服务来说,hadoop1就是SSH客户端,而hadoop2, hadoop3,hadoop4则是SSH服务端,因此在hadoop2hadoop3,hadoop4上需要确定sshd服务已经启动。简单的说,在hadoop1上需要生成一个密钥对,即一个私钥,一个公钥。将公钥拷贝到hadoop2上,这样,比如当hadoop1hadoop2发起ssh连接的时候,hadoop2上就会生成一个随机数并用hadoop1的公钥对这个随机数进行加密,并发送给hadoop1hadoop1收到这个加密的数以后用私钥进行解密,并将解密后的数发送回hadoop2hadoop2确认解密的数无误后就允许hadoop1进行连接了。这就完成了一次公钥认证过程。

对于本文中的4台机器,首先在hadoop1上生成密钥对:

[root@hadoop1 ~]# ssh-keygen -t rsa(直接一路回车键即可)

这个命令将为hadoop1上的用户root生成其密钥对。生成的密钥对id_rsaid_rsa.pub,在/root/.ssh目录下。

然后将id_rsa.pub文件传到其它两台数据节点的/root/.ssh目录下。先在其它两台数据节点上建立隐藏目录.ssh

[root@hadoop2 ~]# mkdir /root/.ssh(在hadoop2上操作)

[root@hadoop3 ~]# mkdir /root/.ssh(在hadoop3上操作)

[root@hadoop4 ~]# mkdir /root/.ssh(在hadoop4上操作)

[root@hadoop1 ~]# scp /root/.ssh/id_rsa.pub 192.168.3.66:/root/.ssh

[root@hadoop1 ~]# scp /root/.ssh/id_rsa.pub 192.168.3.67:/root/.ssh

[root@hadoop1 ~]# scp /root/.ssh/id_rsa.pub 192.168.3.64:/root/.ssh

验证这3台数据节点上分别查看是否拷贝过去了?并且重新命名为authorized_keys文件

[root@hadoop2 ~]# mv /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys(在hadoop2上操作)

[root@hadoop3 ~]# mv /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys(在hadoop3上操作)

[root@hadoop4 ~]# mv /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys(在hadoop4上操作)

现在可以验证从hadoop1登录hadoop2、hadoop3、hadoop4上是否还需要输入密码了?如果不需要那么说明则可以了。(如下图)

[root@hadoop1 ~]# ssh hadoop2
Last login: Mon Jun 25 09:38:22 2012 from zengzhunzhun.ninetowns.cn
[root@hadoop1 ~]# ssh hadoop3
Last login: Mon Jun 25 13:52:12 2012 from zengzhunzhun.ninetowns.cn

[root@hadoop1 ~]# ssh hadoop4
Last login: Mon Jun 25 10:41:01 2012 from 172.16.7.65

拷贝hadoop1上的root用户的公钥id_rsa.pub重命名为authorized_keys文件

[root@hadoop1 ~]# cp /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys

验证本机登录是否需要密码?

[root@hadoop1 ~]# ssh hadoop1
Last login: Tue Jun 26 13:38:28 2012 from zengzhunzhun.ninetowns.cn
上述条件我们只测试了hadoop1登录hadoop2、hadoop3、hadoop4和它自己不需要密码,但是hadoop2登录hadoop3、hadoop1、hadoop4还是需要密码的,我们的目的就是让其中任意两台机器都能登录另外不需要输入密码。

hadoop1上的私钥id_rsa分别上传到hadoop2、hadoop3、hadoop4机器的/root/.ssh/下,不需要重命名。

[root@hadoop1:~]# scp /root/.ssh/id_rsa 192.168.3.66:/root/.ssh

[root@hadoop1:~]# scp /root/.ssh/id_rsa 192.168.3.67:/root/.ssh

[root@hadoop1:~]# scp /root/.ssh/id_rsa 192.168.3.64:/root/.ssh

验证文件是否传过去,如果过去就可以测试了。随便找一台机器登录其它两台,如果可以,那么我们接着往下一步(这里不做任何阐述)

3、/root/hadoop/conf目录下的hadoop-env.sh中设置Hadoop需要的环境变量,其中JAVA_HOME是必须设定的变量。如下图所示:

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

修改slaves文件

如前所述,在hadoop1(NameNode)hadoop/conf目录下,打开slaves文件,该文件用来指定所有的DataNode,一行指定一个主机名。即本文中的hadoop2hadoop3、hadoop4。因此slaves文件看起来应该是这样的:

hadoop2
hadoop3
hadoop4

修改masters文件

打开masters文件,该文件用来指定备份节点Secondarynamenode,生产上环境部署不会将namenodeSecondarynamenode同时部署在一台服务器上,内容如下:

hadoop4

修改core-site.xml文件
core-site.xmlhadoop核心的配置文件,这里配置的是hdfs的地址和端口

core-site.xml的添加如下内容:


   
          fs.default.name
          hdfs://hadoop1:9000
   

修改hdfs-site.xml文件

将默认的/root/hadoop/src/hdfs/hdfs-default.xml文件拷贝一份到/root/hadoop/conf目录下并且重命名为hdfs-site.xml,执行如下命令拷贝:

[root@hadoop1:~]# cp /root/hadoop/src/hdfs/hdfs-default.xml  /root/hadoop/conf/hdfs-site.xml

修改dfs.name.dir的目录,因为默认是在/tmp目录下,linux系统重启时可能会造成临时目录的文件丢失。

 

改为

修改dfs.data.dir的目录,原理同上:

改为

还有一处需要注意的是dfs.replication的值,hadoop默认设置为3(文件块备份份数),正好我也有3个数据节点,所有不用修改。

修改mapred-site.xml文件

mapred-site.xmlmapreduce的配置文件,配置的是jobtracker的地址和端口


     
            mapred.job.tracker
            hadoop1:9001
     

文件基本修改完成了。下面开始部署hadoop了。

现在需要将hadoop部署到其他的机器上,保证目录结构一致。

[root@hadoop1 ~]# scp -r /root/hadoop hadoop2:/root

[root@hadoop1 ~]# scp -r /root/hadoop hadoop3:/root

[root@hadoop1 ~]# scp -r /root/hadoop hadoop4:/root

至此,可以说,Hadoop已经在各个机器上部署完毕了,下面就让我们开始启动Hadoop吧。

启动之前,我们先要格式化namenode,先进入~/hadoop/目录,执行下面的命令:

[root@hadoop1 hadoop]# bin/hadoop namenode -format

不出意外,应该会提示格式化成功。如果不成功,就去hadoop/logs/目录下去查看日志文件。如果之前你格式化过了,再想格式化一次,必须删除/tmp/data目录下的文件才可以。

下面就该正式启动hadoop啦,在bin/下面有很多启动脚本,可以根据自己的需要来启动。

* start-all.sh 启动所有的Hadoop守护。包括namenode, datanode, jobtracker, tasktrack

* stop-all.sh 停止所有的Hadoop

* start-mapred.sh 启动Map/Reduce守护。包括JobtrackerTasktrack

* stop-mapred.sh 停止Map/Reduce守护

* start-dfs.sh 启动Hadoop DFS守护.NamenodeDatanode

* stop-dfs.sh 停止DFS守护

在这里,简单启动所有守护:

[root@hadoop1 hadoop]# bin/start-all.sh

启动的时候hadoop1上会有2java进程,用jps命令查看进程,分别是NameNodeJobTracker

hadoop2和hadoop3上面应该是datanode、tasktracker进程。而hadoop4上面是datanode、tasktracker、secondarynamenode三个进程。

查看集群的状态

[root@hadoop1 ~]# hadoop/bin/hadoop dfsadmin -report
Warning: $HADOOP_HOME is deprecated.

Configured Capacity: 3242369060864 (2.95 TB)
Present Capacity: 2914902978560 (2.65 TB)
DFS Remaining: 2890176589824 (2.63 TB)
DFS Used: 24726388736 (23.03 GB)
DFS Used%: 0.85%
Under replicated blocks: 4
Blocks with corrupt replicas: 0
Missing blocks: 0

-------------------------------------------------
Datanodes available: 3 (3 total, 0 dead)

Name: 192.168.3.64:50010
Decommission Status : Normal
Configured Capacity: 1960094191616 (1.78 TB)
DFS Used: 8242106368 (7.68 GB)
Non DFS Used: 156155813888 (145.43 GB)
DFS Remaining: 1795696271360(1.63 TB)
DFS Used%: 0.42%
DFS Remaining%: 91.61%
Last contact: Tue Jun 26 15:21:44 CST 2012


Name: 192.168.3.67:50010
Decommission Status : Normal
Configured Capacity: 713072295936 (664.1 GB)
DFS Used: 8242180096 (7.68 GB)
Non DFS Used: 53200564224 (49.55 GB)
DFS Remaining: 651629551616(606.88 GB)
DFS Used%: 1.16%
DFS Remaining%: 91.38%
Last contact: Tue Jun 26 15:21:44 CST 2012


Name: 192.168.3.66:50010
Decommission Status : Normal
Configured Capacity: 569202573312 (530.11 GB)
DFS Used: 8242102272 (7.68 GB)
Non DFS Used: 118109704192 (110 GB)
DFS Remaining: 442850766848(412.44 GB)
DFS Used%: 1.45%
DFS Remaining%: 77.8%
Last contact: Tue Jun 26 15:21:44 CST 2012

还可以查看或者通过网页查看集群的状态。这里就不说了!
同样,如果要停止hadoop,则执行如下命令:

[root@hadoop1 hadoop]# bin/stop-all.sh

还有一些hdfs文件系统使用的方法我就不多介绍了。网上很多文档,大家去google吧!


 

 



 

 


 

 

 

 
 
 
 
阅读(19232) | 评论(3) | 转发(8) |
给主人留下些什么吧!~~

zhuwanxiong2014-11-18 17:06:28

写得很细,和我看视频中讲的差不多。点赞一个

split_two2013-03-06 14:47:11

提示一下,博客中提到无密码认证时,只需要namenode登录datanode不需要密码即可!不需要双向的无密码认证!

split_two2012-07-04 10:45:27

这里说一下环境,我的操作系统是redhat 4.8,如果用ubuntu的朋友请参考别的连接哦!