首先咱们统一一下定义,在这里所提到的Hadoop是指Hadoop Common,主要提供DFS(分布式文件存储)与Map/Reduce的核心功能。
Hadoop在windows下还未通过很好的测试,因此笔者推荐你们在linux(cent os 5.X)下安装使用。
准备安装Hadoop集群以前咱们得先检验系统是否安装了以下的必备软件:ssh、rsync和Jdk1.6(由于Hadoop须要使用到Jdk中的编译工具,因此通常不直接使用Jre)。可使用yum install rsync来安装rsync。通常来讲ssh是默认安装到系统中的。Jdk1.6的安装方法这里就很少介绍了。
确保以上准备工做完了以后咱们就开始安装Hadoop软件,假设咱们用三台机器作Hadoop集群,分别是:192.168.1.1十一、192.168.1.112和192.168.1.113(下文简称111,112和113),且都使用root用户。
下面是在linux平台下安装Hadoop的过程:node
[root@192.168.1.111] #这里将Hadoop安装到/opt/hadoop [root@192.168.1.111] mkdir /opt/hadoop [root@192.168.1.111] cd /opt/hadoop [root@192.168.1.111] #更改所属关系和权限(对于其它用户而言) [root@192.168.1.111] chown root ./; chmod 755 ./ [root@192.168.1.111] # 下载项目包(去官网(http://hadoop.apache.org/)下载Hadoop项目) [root@192.168.1.111] wget http://www.apache.org/dist/hadoop/core/hadoop-0.20.2/hadoop-0.20.2.tar.gz [root@192.168.1.111] # 解压 [root@192.168.1.111] tar xzvf hadoop-0.20.2.tar.gz [root@192.168.1.111] # 进入目录 [root@192.168.1.111] cd hadoop-0.20.2 [root@192.168.1.111] # 由于Hadoop子项目的须要,通常须要设置环境变量以下: [root@192.168.1.111] export HADOOP_HOME=`pwd` [root@192.168.1.111] # 也能够将环境变量设置到/etc/profile中
在全部服务器的同一路径下都进行这几步,就完成了集群Hadoop软件的安装,是否是很简单?没错安装是很简单的,下面就是比较困难的工做了。linux
根据Hadoop文档的描述“The Hadoop daemons are NameNode/DataNode and JobTracker/TaskTracker.”能够看出Hadoop核心守护程序就是由NameNode/DataNode 和JobTracker/TaskTracker这几个角色构成。
Hadoop的DFS须要确立NameNode与DataNode角色,通常NameNode会部署到一台单独的服务器上而不与DataNode共同同一机器。另外Map/Reduce服务也须要确立JobTracker和TaskTracker的角色,通常JobTracker与NameNode共用一台机器做为master,而TaskTracker与DataNode同属于slave。至于NameNode/DataNode和JobTracker/TaskTracker的概念这里就很少讲了,须要了解的能够参看相关文档。
在这里咱们使用111做为NameNode与JobTracker,其它两台机器做为DataNode和TaskTracker,具体的配置以下:sql
在$HADOOP_HOME/conf/hadoop-env.sh中定义了Hadoop启动时须要的环境变量设置,其中咱们至少须要配置JAVA_HOME(Jdk的路径)变量;另外咱们通常还须要更改HADOOP_LOG_DIR(Hadoop的日志路径)这个变量,默认的设置是“export HADOOP_LOG_DIR=${HADOOP_HOME}/logs”,通常须要将其配置到一个磁盘空间比较大的目录下。shell
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中的配置项。咱们通常在这个文件中增长以下配置:apache
Core-site.xml代码:windows
<configuration> <property> <!-- 用于dfs命令模块中指定默认的文件系统协议 --> <name>fs.default.name</name> <value>hdfs://192.168.1.111:9000</value> </property> </configuration>
$HADOOP_HOME/conf/hdfs-site.xml是HDFS的配置文件,对应并覆盖hdfs-default.xml中的配置项。咱们通常在这个文件中增长以下配置:服务器
hdfs-site.xml代码:ssh
<configuration> <property> <!-- DFS中存储文件命名空间信息的目录 --> <name>dfs.name.dir</name> <value>/opt/hadoop/data/dfs.name.dir</value> </property> <property> <!-- DFS中存储文件数据的目录 --> <name>dfs.data.dir</name> <value>/opt/hadoop/data/dfs.data.dir</value> </property> <property> <!-- 是否对DFS中的文件进行权限控制(测试中通常用false)--> <name>dfs.permissions</name> <value>false</value> </property> </configuration>
$HADOOP_HOME/conf/mapred-site.xml是Map/Reduce的配置文件,对应并覆盖mapred-default.xml中的配置项。咱们通常在这个文件中增长以下配置:分布式
Mapred-site.xml代码:工具
<configuration> <property> <!-- 用来做JobTracker的节点的(通常与NameNode保持一致) --> <name>mapred.job.tracker</name> <value>192.168.1.111:9001</value> </property> <property> <!-- map/reduce的系统目录(使用的HDFS的路径) --> <name>mapred.system.dir</name> <value>/system/mapred.system.dir</value> </property> <property> <!-- map/reduce的临时目录(可以使用“,”隔开,设置多重路径来分摊磁盘IO) --> <name>mapred.local.dir</name> <value>/opt/hadoop/data/mapred.local.dir</value> </property> </configuration>
在$HADOOP_HOME/conf目录中存在masters和slaves这两个文件,用来作Hadoop的主从配置。上面已经提到了Hadoop主要由NameNode/DataNode 和JobTracker/TaskTracker构成,在主从配置里咱们通常将NameNode和JobTracker列为主机,其它的共为从机,因而对于此处的配置应该是:
masters代码:
192.168.1.111
slaves代码:
192.168.1.112 192.168.1.113
若是你对以上介绍的配置项作了正确的配置,那么你的Hadoop集群只差启动和初体念了,固然,在$HADOOP_HOME/conf目录下还包括其它的一些配置文件,但那些都不是必须设置的,若是有兴趣你能够本身去了解了解。
值得注意的是Hadoop集群的全部机器的配置应该保持一致,通常咱们在配置完master后,使用scp将配置文件同步到集群的其它服务器上。
通过以上两个步骤,Hadoop的安装和配置已经OK了,那么下面咱们就来启动Hadoop集群。启动前咱们须要作一些准备,由于集群的启动是从NameNode开始的,因而DataNode的运行须要NameNode的远程调用,Hadoop使用ssh命令远程运行DataNode节点,这就是为何Hadoop须要ssh的支持。咱们能够想象一下,若是集群里有100台机器,那么咱们就须要输入100遍主机的访问密码,但若是配置SSH使用无密码公钥认证的方式,就解决了此问题。
简单的说,在111上须要生成一个密钥对,即一个私钥和一个公钥。将公钥拷贝到112和113上,如此一来,当111向112发起ssh链接的时候,112上就会生成一个随机数并用111的公钥对这个随机数进行加密,而且发送给111,111收到这个加密的数之后用私钥进行解密,并将解密后的数返回112,112确认解密的数无误后就容许111进行链接了。这就完成了一次公钥认证过程。
公钥生成的步骤以下:
[root@192.168.1.111] ssh-keygen -t rsa [root@192.168.1.111] #如下是生成一个为id_rsa/id_rsa.pub的无密码的公/私钥对 Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: [root@192.168.1.111] ls -l ~/.ssh [root@192.168.1.111] #这样咱们会看到以下所示的结果集: -rw------- 1 root root 1675 Jul 5 14:01 id_rsa -rw-r--r-- 1 root root 394 Jul 5 14:01 id_rsa.pub
而后将id_rsa.pub的内容复制到每一个机器(也包括本机)的~/.ssh/authorized_keys文件中。若是authorized_keys不存在,则使用touch ~/.ssh/authorized_keys生成一个;若是该文件已经存在,则追加内容进去就OK了,这里咱们推荐使用以下命令:
[root@192.168.1.111] cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys [root@192.168.1.111] #由于ssh服务对文件的权限有着很是严格的限制(authorized_keys只能拥有指定用户的写权限)因而须要进行以下处理 [root@192.168.1.111] chmod 644 ~/.ssh/authorized_keys
通过以上步骤,咱们的无密码访问就配置好了,能够经过以下命令进行验证:
[root@192.168.1.111] ssh 192.168.1.112 [root@192.168.1.112] exit [root@192.168.1.111] ssh 192.168.1.113 [root@192.168.1.113] exit
通过以上步骤,咱们的无密码访问就配置好了,能够经过以下命令进行验证:
[root@192.168.1.111] ssh 192.168.1.112 [root@192.168.1.112] exit [root@192.168.1.111] ssh 192.168.1.113 [root@192.168.1.113] exit
如此一来,就能够正常启动Hadoop集群了。启动方式以下:
[root@192.168.1.111] cd $HADOOP_HOME/bin [root@192.168.1.111] #查看一下目录下的文件 [root@192.168.1.111] ls -l -rwxr-xr-x 1 root root 9998 Feb 19 15:55 hadoop -rwxr-xr-x 1 root root 1966 Feb 19 15:55 hadoop-config.sh -rwxr-xr-x 1 root root 3690 Feb 19 15:55 hadoop-daemon.sh -rwxr-xr-x 1 root root 1227 Feb 19 15:55 hadoop-daemons.sh -rwxr-xr-x 1 root root 2710 Feb 19 15:55 rcc -rwxr-xr-x 1 root root 2043 Feb 19 15:55 slaves.sh -rwxr-xr-x 1 root root 1066 Feb 19 15:55 start-all.sh -rwxr-xr-x 1 root root 965 Feb 19 15:55 start-balancer.sh -rwxr-xr-x 1 root root 1645 Feb 19 15:55 start-dfs.sh -rwxr-xr-x 1 root root 1159 Feb 19 15:55 start-mapred.sh -rwxr-xr-x 1 root root 1019 Feb 19 15:55 stop-all.sh -rwxr-xr-x 1 root root 1016 Feb 19 15:55 stop-balancer.sh -rwxr-xr-x 1 root root 1146 Feb 19 15:55 stop-dfs.sh -rwxr-xr-x 1 root root 1068 Feb 19 15:55 stop-mapred.sh [root@192.168.1.111] #启动服务以前,咱们须要作一件事情,很是重要,那就是格式化命名空间 [root@192.168.1.111] ./hadoop namenode -format [root@192.168.1.111] #启动dfs和map/reduce服务 [root@192.168.1.111] ./start-all.sh
咱们用以下命令验证一下是否启动成功:
[root@192.168.1.111] $HADOOP_HOME/bin/hadoop dfs -ls
若是没有错误提示或者出现文件列表,那么恭喜你,Hadoop成功启动了,另外,咱们能够经过访问http://192.168.1.111:50070来查看hdfs的状态,访问http://192.168.1.111:50030来查看map/reduce的状态。
若是出现错误,或Hadoop集群未启动,能够查看$HADOOP_HOME/logs/下的日志文件。