首先确定hdfs分布式文件系统目前很多大公司都在用,例如百度、腾讯、淘宝等。相信网上也有很多关于这方面的文档,我写这篇文章只是为了自己更加深刻的学习和理解,或者帮助一些不会搭建的童鞋们!有问题请加群234086986讨论!以前我搭建的是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每个节点的主机名测试一下连通性即可!下面红色字体则是输入命令。
一定不要用IP地址代理host,我就是被这个问题浪费了三天时间
[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的,如果选择的版本不匹配,那么出现的问题将会让你找不到头绪。这里提醒大家多看官方文档。下载地址:http://labs.renren.com/apache-mirror/hadoop/core/
下载文件后上传到/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服务器,且都正常启动。实际中我们用的都是OpenSSH,这是SSH协议的一个免费开源实现。
以本文中的4台机器为例,现在hadoop1是主节点,它需要主动发起SSH连接到hadoop2,对于SSH服务来说,hadoop1就是SSH客户端,而hadoop2, hadoop3,hadoop4则是SSH服务端,因此在hadoop2,hadoop3,hadoop4上需要确定sshd服务已经启动。简单的说,在hadoop1上需要生成一个密钥对,即一个私钥,一个公钥。将公钥拷贝到hadoop2上,这样,比如当hadoop1向hadoop2发起ssh连接的时候,hadoop2上就会生成一个随机数并用hadoop1的公钥对这个随机数进行加密,并发送给hadoop1,hadoop1收到这个加密的数以后用私钥进行解密,并将解密后的数发送回hadoop2,hadoop2确认解密的数无误后就允许hadoop1进行连接了。这就完成了一次公钥认证过程。
对于本文中的4台机器,首先在hadoop1上生成密钥对:
[root@hadoop1 ~]# ssh-keygen -t rsa(直接一路回车键即可)
这个命令将为hadoop1上的用户root生成其密钥对。生成的密钥对id_rsa,id_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台数据节点上分别查看是否拷贝过去了?并且重新命名为authized_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,一行指定一个主机名。即本文中的hadoop2、hadoop3、hadoop4。因此slaves文件看起来应该是这样的:
hadoop2
hadoop3
hadoop4
修改masters文件
打开masters文件,该文件用来指定备份节点Secondarynamenode,生产上环境部署不会将namenode和Secondarynamenode同时部署在一台服务器上,内容如下:
hadoop4
修改core-site.xml文件
core-site.xml是hadoop核心的配置文件,这里配置的是hdfs的地址和端口
core-site.xml的添加如下内容:
<configuration>
    <property>
          <name>fs.default.name</name>
          <value>hdfs://hadoop1:9000</value>
    </property>
</configuration>
修改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.xml是mapreduce的配置文件,配置的是jobtracker的地址和端口
<configuration>
      <property>
            <name>mapred.job.tracker</name>
            <value>hadoop1:9001</value>
      </property>
</configuration>
文件基本修改完成了。下面开始部署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守护。包括Jobtracker和Tasktrack
* stop-mapred.sh 停止Map/Reduce守护
* start-dfs.sh 启动Hadoop DFS守护.Namenode和Datanode
* stop-dfs.sh 停止DFS守护
在这里,简单启动所有守护:
[root@hadoop1 hadoop]# bin/start-all.sh
启动的时候hadoop1上会有2个java进程,用jps命令查看进程,分别是NameNode,JobTracker。
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
还可以查看http://192.168.3.65:50030或者http://192.168.3.65:50070通过网页查看集群的状态。这里就不说了!
同样,如果要停止hadoop,则执行如下命令:
[root@hadoop1 hadoop]# bin/stop-all.sh
还有一些hdfs文件系统使用的方法我就不多介绍了。网上很多文档,大家去google吧!
 
转载自:http://blog.chinaunix.net/uid-23916356-id-3254578.html