首先我们统一一下定义,在这里所提到的Hadoop是指Hadoop Common,主要提供DFS(分布式文件存储)与Map/Reduce的核心功能。
Hadoop在windows下还未经过很好的测试,所以推荐大家在linux(cent os 6.X)下安装使用。
准备安装Hadoop集群之前我们得先检验系统是否安装了如下的必备软件:ssh和Jdk1.6(因为Hadoop需要使用到Jdk中的编译工具,所以一般不直接使用Jre)。可以使用yum install rsync来安装rsync。一般来说ssh是默认安装到系统中的。
Jdk1.6的安装方法
下载linux版本的java,
#mkdir /usr/java
#cd /usr/java
#chmod a+x jdk-6u27-linux-i586.bin
#./jdk-6u27-linux-i586.bin
安装完成后,设置环境变量:在etc/profile中设置
#export JAVA_HOME=/usr/java/jdk1.6.0_27
#export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
#export PATH=$PATH:$JAVA_HOME/bin
设置完成后,使用reboot或者source /etc/profile
确保以上准备工作完了之后我们就开始安装Hadoop软件,假设我们用三台机器做Hadoop集群,分别是:192.168.1.141、192.168.1.142和192.168.1.143(下文简称141,142和143),且都使用root用户。
这里有一点需要强调的就是,务必要确保每台机器的主机名和IP地址之间能正确解析。
Host配置
一个很简单的测试办法就是ping一下主机名,比如在ww-1上ping ww-2,如果能ping通就OK!若不能正确解析,可以修改/etc/hosts文件,如果该台机器作Namenode用,则需要在hosts文件中加上集群中所有机器的IP地址及其对应的主机名;如果该台机器作Datanode用,则只需要在hosts文件中加上本机IP地址和Namenode机器的IP地址。
以本文为例,dbrg-1中的/etc/hosts文件看起来就应该是这样的:
127.0.0.1 localhost localhost
192.168.0.141 ww-1 ww-1
192.168.0.142 ww-2 ww-2
192.168.0.143 ww-3 ww-3
ww-2中的/etc/hosts文件看起来就应该是这样的:
127.0.0.0 localhost localhost
192.168.0.141 ww-1 ww-1
192.168.0.143 ww-3 ww-3
下面是在centos6平台下安装Hadoop的过程:
在usr下建立hadoop文件夹,将hadoop下载文件解压。
在etc/profile文件中设置环境变量:
export HADOOP_HOME=/home/ww/hadoop.020.204.0/hadoop
解压至hadoop.020.204.0中,为了方便以后升级,建议建立一个链接指向要使用的hadoop版本,不妨设为hadoop
[ww@ww-1: hadoop.020.204.0]$ln -s hadoop.020.204.0 hadoop
这样一来,所有的配置文件都在/hadoop.020.204.0/conf/目录中,所有执行程序都在/ hadoop.020.204.0/bin目录中。
但是由于上述目录中hadoop.020.204.0的配置文件和hadoop.020.204.0的安装目录是放在一起的,这样一旦日后升级hadoop版本的时候所有的配置文件都会被覆盖,因此建议将配置文件与安装目录分离,一种比较好的方法就是建立一个存放配置文件的目录,/home/ww/ hadoop.020.204.0/hadoop-config/,然后将/hadoop.020.204.0/conf/目录中的hadoop_site.xml,slaves,hadoop_env.sh三个文件拷贝到hadoop-config/目录中(这个问题很奇怪,在官网上的Getting Started With Hadoop中说是只需要拷贝这个三个文件到自己创建的目录就可以了,但我在实际配置的时候发现还必须把masters这个文件也拷贝到hadoop-conf/目录中才行,不然启动Hadoop的时候就会报错说找不到masters这个文件),并指定环境变量$HADOOP_CONF_DIR指向该目录。环境变量在/home/dbrg/.bashrc和/etc/profile中设定。
综上所述,为了方便以后升级版本,我们需要做到配置文件与安装目录分离,并通过设定一个指向我们要使用的版本的hadoop的链接,这样可以减少我们对配置文件的维护。(不是必要)
集群配置在这里我们使用141作为NameNode与JobTracker,其它两台机器作为DataNode和TaskTracker,具体的配置如下:
环境的配置在$HADOOP_HOME/conf/hadoop-env.sh中定义了Hadoop启动时需要的环境变量设置,其中我们至少需要配置JAVA_HOME(Jdk的路径)变量;另外我们一般还需要更改HADOOP_LOG_DIR(Hadoop的日志路径)这个变量,默认的设置是“export HADOOP_LOG_DIR=${HADOOP_HOME}/logs”,一般需要将其配置到一个磁盘空间比较大的目录下。(不是必要)
Hadoop核心程序配置Hadoop 包括一组默认配置文件($HADOOP_HOME/src目录下的core/core-default.xml, hdfs/hdfs-default.xml 和mapred/mapred-default.xml)。虽然默认配置文件能让Hadoop核心程序顺利启动,一般需要自己来设置一些常规配置以满足开发和业务的需求,所以我们需要对默认配置文件的值进行覆盖,具体方法如下。
$HADOOP_HOME/conf/core-site.xml是Hadoop的核心配置文件,对应并覆盖core-default.xml中的配置项。我们一般在这个文件中增加如下配置:
Core-site.xml代码
$HADOOP_HOME/conf/hdfs-site.xml是HDFS的配置文件,对应并覆盖hdfs-default.xml中的配置项。我们一般在这个文件中增加如下配置:
(不添加)
$HADOOP_HOME/conf/mapred-site.xml是Map/Reduce的配置文件,对应并覆盖mapred-default.xml中的配置项。我们一般在这个文件中增加如下配置:
(不添加)
主从配置 在$HADOOP_HOME/conf目录中存在masters和slaves这两个文件,用来做Hadoop的主从配置。上面已经提到了Hadoop主要由NameNode/DataNode 和JobTracker/TaskTracker构成,在主从配置里我们一般将NameNode和JobTracker列为主机,其它的共为从机,于是对于此处的配置应该是:
Masters代码
192.168.1.141
Slaves代码
192.168.1.142
192.168.1.143
如果你对以上介绍的配置项做了正确的配置,那么你的Hadoop集群只差启动和初体念了,当然,在$HADOOP_HOME/conf目录下还包括其它的一些配置文件,但那些都不是必须设置的,如果有兴趣你可以自己去了解了解。
值得注意的是Hadoop集群的所有机器的配置应该保持一致,一般我们在配置完master后,使用scp将配置文件同步到集群的其它服务器上。
SSH配置
经过以上两个步骤,Hadoop的安装和配置已经OK了,那么下面我们就来启动Hadoop集群。启动前我们需要做一些准备,因为集群的启动是从NameNode开始的,于是DataNode的运行需要NameNode的远程调用,Hadoop使用ssh命令远程运行DataNode节点,这就是为什么Hadoop需要ssh的支持。我们可以想象一下,如果集群里有100台机器,那么我们就需要输入100遍主机的访问密码,但如果配置SSH使用无密码公钥认证的方式,就解决了此问题。
简单的说,在141上需要生成一个密钥对,即一个私钥和一个公钥。将公钥拷贝到142和143上,如此一来,当141向142发起ssh连接的时候,142上就会生成一个随机数并用141的公钥对这个随机数进行加密,并且发送给141,141收到这个加密的数以后用私钥进行解密,并将解密后的数返回142,142确认解密的数无误后就允许141进行连接了。这就完成了一次公钥认证过程。
公钥生成的步骤如下:
在每台电脑的用户文件夹下面建立.ssh文件夹
命令为:#mkdir .ssh
然后生成密钥:命令为:
# ssh-keygen -t rsa
之后三次回车,完成之后,会在ssh文件夹下面建立id_rsa.pub,id_rsa两个文件。所有计算机都生成完密钥后。
将主机生成的id_rsa.pub的内容复制到authorized_keys文件中。如果authorized_keys不存在,则使用touch ~/.ssh/authorized_keys生成一个;如果该文件已经存在,则追加内容进去就OK了。
最后将生成主机的.ssh文件夹拷贝到其它计算机中。
这里我们推荐使用如下命令:
本机:touch ~/.ssh/authorized_keys
#cp id_rsa.pub authorized_keys
#chmod go-rwx authorized_keys 644权限 所有计算机上都要进行,必须保证authorized_keys只对其所有者有读写权限,其他人不允许有写的权限,否则SSH是不会工作的。
在往远程计算机copy文件之前,要先对本机取得ssh权限
即在本机:#ssh 192.168.0.141按提示进行。
远程:scp –r /home/ww/.ssh 192.168.0.142:/home/ww
scp –r /home/ww/.ssh 192.168.0.143:/home/ww
测试是否成功命令:ssh 192.168.0.142
经过以上步骤,我们的无密码访问就配置好了。
部署远程计算机
前面讲的这么多Hadoop的环境变量和配置文件都是在ww-1这台机器上的,现在需要将hadoop部署到其他的机器上,保证目录结构一致。
[ww@ww-1:~]$scp -r /home/ww/Hadoop0.20.204.0 ww-2:/home/ww/
[ww@ww-1:~]$scp -r /home/ww/ Hadoop0.20.204.0 ww-3:/home/ww/
至此,可以说,Hadoop已经在各个机器上部署完毕了下面就让我们开始启动Hadoop吧。
启动
启动方式如下:
启动服务之前,我们需要做一件事情,非常重要,那就是格式化命名空间
#bin/hadoop namenode –format
启动dfs和map/reduce服务
bin/start-all.sh
我们用如下命令验证一下是否启动成功:
bin/hadoop dfs -ls
如果没有错误提示或者出现文件列表,那么恭喜你,Hadoop成功启动了,另外,我们可以通过访问http://192.168.1.141:50070来查看hdfs的状态,访问http://192.168.1.141:50030来查看map/reduce的状态。
如果出现错误,或Hadoop集群未启动,可以查看$HADOOP_HOME/logs/下的日志文件。
HDFS操作
运行bin/目录的hadoop命令,可以查看Hadoop所有支持的操作及其用法,这里以几个简单的操作为例。
建立目录
[ww@ww-1:hadoop]$bin/hadoop dfs –mkdir testdir
在HDFS中建立一个名为testdir的目录
复制文件
[ww@ww-1:hadoop]$bin/hadoop dfs –put /home/ww/large.zip testfile.zip
把本地文件large.zip拷贝到HDFS的根目录/user/ww/下,文件名为testfile.zip
查看现有文件
[ww@ww-1:hadoop]$bin/hadoop dfs -ls