一、 前言
偶然间同学跟我谈到hadoop分布式集群,恰好同学也需要自己去搭建hadoop平台,因此我想自己何不也搭建个hadoop平台玩玩呢。故有了这篇搭建记录。
二、 Hadoop简介
Hadoop是Apache软件基金会所研发的开放源码并行运算编程工具和分布式文件系统,与MapReduce和Google档案系统的概念类似。
Hadoop is a top-level Apache project being built and used by a global community of contributors,using the Java programming language. Yahoo! has been the largest contributor to the project, and uses Hadoop extensively across its businesses.
Hadoop was created by Doug Cutting,who named it after his son's stuffed elephant. It was originally developed to support distribution for the Nutch search engine project.
三、 环境搭建
1、安装前的准备
·VMware Workstation ACE 6.02
·3台RHEL5.2虚拟机
·hadoop-0.20.2.tar.gz
·jdk-6u17-linux-i586.bin
2、安装JDK
JDK安装较为简单,不赘述。
Tip:
使用VMware Workstation 安装了3个RHEL 5.2系统。装好一个RHEL,并且安装好JDK,再利用VMware Workstation的克隆功能完成另外两个的安装。
3、 更改主机名、IP
l IP设置:
hadoop1:192.168.0.100 ( NameNode )
hadoop2:192.168.0.101 ( DataNode )
hadoop3:192.168.0.102 ( DataNode )
# vi /etc/sysconfig/network-script/ifcfg-eth0
修改此文件为:
# service network restart重启网络服务
Tip:
在做hadoop1、hadoop2的IP设置的时候也许会出现这个问题,原因是克隆虚拟机的时候MAC地址还是一样的。
在这里点击“探测”修改MAC地址:
l 更改主机名
修改/etc/sysconfig/network里面的hostname,这里改成你想改的主机名。再修改/ete/hosts文件,改成如下设置:
当然你也可以使用DNS来配置主机名与IP的映射,因为这里只是个局域网环境,所有就用修改hosts的方法来完成映射功能。
Tip:
1、关于这个hosts文件的配置,如果该台机器作Namenode用,则需要在hosts文件中加上集群中所有机器的IP地址及其对应的主机名;如果该台机器作Datanode用,则只需要在hosts文件中加上本机IP地址和Namenode机器的IP地址。
当然你也可以像我一样,三个hosts文件都一样。
2、对于Hadoop来说,在HDFS看来,节点分为Namenode和Datanode,其中Namenode只有一个,Datanode可以是很多;在MapReduce看来,节点又分为Jobtracker和Tasktracker,其中Jobtracker只有一个,Tasktracker可以是很多。我是将namenode和jobtracker部署在hadoop1上,hadoop2, hadoop3作为datanode和tasktracker。当然你也可以将namenode,datanode,jobtracker,tasktracker全部部署在一台机器上。
l SSH设置
·工作原理
在Hadoop启动以后,Namenode是通过SSH(Secure Shell)来启动和停止各个节点上的各种守护进程的,这就需要在节点之间执行指令的时候是不需要输入密码的方式,故我们需要配置SSH使用无密码公钥认证的方式。
首先要保证每台机器上都装了SSH服务器,且都正常启动。实际中我们用的都是OpenSSH,这是SSH协议的一个免费开源实现。现在的linux发行版一般都默认安装了SSH的,开机的时候你可以观察下是否有名字为sshd的守护程序启动,如果没有,则需要安装OpenSSH软件。
以本文中的3台机器为例,现在hadoop0是主节点,它需要主动发起SSH连接到hadoop1,对于SSH服务来说,hadoop0就是SSH客户端,而hadoop1, hadoop2则是SSH服务端,因此在hadoop1,hadoop2上需要确定sshd服务已经启动。简单的说,在hadoop0上需要生成一个密钥对,即一个私钥,一个公钥。将公钥拷贝到hadoop1上,这样,比如当hadoop0向hadoop1发起ssh连接的时候,hadoop1上就会生成一个随机数并用hadoop0的公钥对这个随机数进行加密,并发送给hadoop0,hadoop0收到这个加密的数以后用私钥进行解密,并将解密后的数发送回hadoop1,hadoop1确认解密的数无误后就允许hadoop0进行连接了。这就完成了一次公钥认证过程。
·配置SSH过程
需要关闭SELinux,关闭SELinux的方法:修改/etc/selinux/config文件中的SELINUX="" 为 disabled ,然后重启。如果不想重启系统,使用命令setenforce 0
注:setenforce 1 设置SELinux 成为enforcing模式
setenforce 0 设置SELinux 成为permissive模式
在lilo或者grub的启动参数中增加:selinux=0,也可以关闭selinux
以下是配置 SSH 的无密码公钥认证的过程。对于本文中的3台机器,首先在hadoop1上生成密钥对,如代码清单 1 所示:
[root@hadoop0 ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
a8:97:55:d3:95:d6:fe:f5:08:ca:4c:6e:24:62:b4:22 root@hadoop0
命令最后的rsa只是个代号,你可以取你自己喜欢的名字。这个命令将为 hadoop0 上的当前用户 root 生成其密钥对,密钥对的保存路径使用缺省的 /root/.ssh/id_rsa, 要求输入passphrase 的时候,直接回车。这样生成的证书以及公钥将存储在 /root/.ssh 目录,形成两个文件 id_rsa,id_rsa.pub。
然后将 id_rsa.pub文件的内容复制到每一台机器(包括hadoop0)的/root/.ssh/authorized_keys文件的尾部。
若机器上不存在这个/root/.ssh/authorized_keys文件,可以自行创建一个。请注意 id_rsa.pub 文件的内容是长长的一行,复制时需注意,不要遗漏字符或混入了多余换行符。
接下来可以做一下 SSH 连接测试,从 hadoop0 分别向 hadoop0, hadoop1, hadoop2,发起 SSH 连接请求,确保不需要输入密码就能 SSH 连接成功。注意第一次 SSH 连接时会出现如下提示信息:
The authenticity of host [homer06] can't be established. The key fingerprint is:
74:32:91:f2:9c:dc:2e:80:48:73:d4:53:ab:e4:d3:1a
Are you sure you want to continue connecting (yes/no)?
请输入 yes, 这样 OpenSSH 会把连接过来的这台主机的信息自动加到 /root/.ssh/know_hosts 文件中去,第二次再连接时,就不会有这样的提示信息了。
然后你会发现不需要输入密码就可以建立ssh连接了,恭喜你,配置成功了,不过,别忘了测试本机ssh hadoop1。
Tip:
这里提供我使用的一种可行的方式:
将id_rsa.pub的内容复制
/home/hadoop/.ssh/authorized_keys文件中。
[root @ hadoop0:.ssh]# cat /root/.ssh/id_dsa.pub >>/root/.ssh/authorized_keys
[root @ hapoop0:.ssh]# scp authorized_keys hapoop1:/root /.ssh/
[root @ hapoop0:.ssh]# scp authorized_keys hapoop2:/root/.ssh/
此处的scp就是通过ssh进行远程copy,此处需要输入远程主机的密码,即hadoop2,hadoop3机器上hadoop帐户的密码,当然,你也可以用其他方法将authorized_keys文件拷贝到其他机器上。
[root @hadoop1:.ssh]# chmod 640 authorized_keys
[root @hadoop2:.ssh]# chmod 640 authorized_keys
这一步非常关键,必须保证authorized_keys只对其所有者有读写权限,其他人不允许有写的权限,否则SSH是不会工作的。
l 安装部署Hadoop
首先在hadoop0上部署hadoop软件,解压到/usr/local/hadoop-0.20.2,更名为hadoop。
A ) 修改环境变量
在/usr/local/hadoop/conf目录下的hadoop-env.sh中设置hadoop需要的环境变量,其中JAVA_HOME是必须设定的变量。HADOOP_HOME变量可以设定也可以不设定,如果不设定,HADOOP_HOME默认的是bin目录的父目录。我的设置如下:
B ) 修改masters文件
打开masters文件,该文件用来指定NameNode,内容如下:
Hadoop0(IP)
C ) 修改slaves文件
如前所述,在hadoop1(NameNode)的hadoop-config/目录下,打开slaves文件,该文件用来指定所有的DataNode,一行指定一个主机名。即本文中的hadoop2、hadoop3,因此slaves文件看起来应该是这样的:
Hadoop1(IP)
Hadoop2(IP)
Tip:
配置conf/masters和conf/slaves来设置主从结点,注意最好使用主机名,并且保证机器之间通过主机名可以互相访问,每个主机名一行。
D ) 修改core-site.xml
在hadoop的安装目录下的src目录中分别找到
core-default.xml,hdfs-default.xml,
mapred-default.xml三文件,然后copy到hadoop-config/目录下,这三个文件包含Hadoop的所有配置项,然后把这个分别改名为core-site.xml,hdfs-site.xml,
mapred-site.xml,我们根据需要修改如下:(注意:下面的配置文件中不要有中文或中文的符号,否则报错)
修改core-site.xml为:
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/tmp</value>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://(master IP):9000</value>
</property>
Tip:
fs.default.name是NameNode的URI。hdfs://主机名:端口
E ) 修改hdfs-site.xml为
Tip:
dfs.replication是数据需要备份的数量,默认是3,如果此数大于集群的机器数会出错。
F ) 修改mapred-site.xml为
Tip:
mapred.job.tracker是JobTracker的主机(或者IP)和端口。主机:端口。
l 部署hadoop
配置结束,就要进行部署了。即把配置好的hadoop文件夹拷贝到其他集群的机器中,并且保证上面的配置对于其他机器而言正确,例如:如果其他机器的Java安装路径不一样,要修改conf/hadoop-env.sh。
[root@hadoop0:~]# scp -r /usr/local/hadoop hadoop1: /usr/local/
[root@hadoop0:~]# scp -r /usr/local/hadoop hadoop2: /usr/local/
至此,可以说hadoop已经在各个机器上部署完毕了,接着就可以启动hadoop了。
l 启动hadoop
启动之前,我们先要格式化namenode,先进入/usr/local/hadoop/bin目录,执行下面的命令:
[root@hadoop0 bin]# ./hadoop namenode –format
不出意外,应该会提示格式化成功。如果不成功,就去hadoop/logs/目录下去查看日志文件。
下面就该正式启动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 @ hadoop0:hadoop]# bin/start-all.sh
同样,如果要停止hadoop,则
[root @hadoop0:hadoop]# bin/stop-all.sh
查看状态:
Tip:
HDFS操作
运行bin/目录的hadoop命令,可以查看Haoop所有支持的操作及其用法,这里以几个简单的操作为例。建立目录:
[root @ hadoop0 hadoop]# bin/hadoop dfs -mkdir testdir
在HDFS中建立一个名为hdfstest.txt的目录,复制文件:
[root @ hadoop0 hadoop]$bin/hadoop dfs -put /home/hdfstest.txt testfile.txt
把本地文件hdfstest.txt拷贝到HDFS的根目录/user/root/下,文件名为testfile.txt,查看现有文件:
[root@hadoop0 hadoop]# bin/hadoop dfs -ls
到此,本文档结束。
此次安装比较顺利,基本没有什么错误。在安装的时候特别是修改配置文件的时候请一定要仔细和细心。
最后感谢开源工作者们。
Reference:
http://www.cnblogs.com/wayne1017/archive/2007/03/20/678724.html
http://blogold.chinaunix.net/u2/61975/showart_2191335.html