Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算。Hadoop的运行模式分为三种:单机模式、伪分布式模式、完全分布式模式。
Hadoop的安装有三种运行模式:
- 单机模式(Local (Standalone) Model):Hadoop的默认模式,0配置。Hadoop运行在一个Java进程中,使用本地文件系统,不使用HDFS,一般用于开发调试MapReduce程序的应用逻辑。
- 伪分布式模式(Pseudo-Distributed Model):需简单配置,相当于只有一个节点的集群,Hadoop的所有守护进程运行在同一台机器上。该模式在单机模式之上增加了代码调试功能,允许你检查内存使用情况,HDFS输入输出,以及其他的守护进程交互。
- 完全分布式模式(Fully-Distributed Model):根据需要进行配置。多节点,一般用于生产环境,可认为是由伪分布式模式的一个节点变为多个节点。
1 准备工作
准备工作就是搭建Hadoop环境需要的生态环境及工具:Linux系统环境、JDK安装及其环境变量、ssh及ssh的免密码登录、Hadoop安装包、环境变量的配置。
1.1 支持的平台
支持Linux和Windows,但是个人觉得既然大部分生产环境都是Linux集群,索性就只关注Linux的部署即可,需要时再查就行,有兴趣可以看在Windows上安装Hadoop。
1.2 需要的软件
- Java,因为Hadoop就是Java开发的,所以无论哪种模式,JDK都是必须安装的,且版本不能低于1.6。可以查看Ubuntu 14.04 安装 JDK 8或RedHat 6.1中安装JDK。
- ssh必须安装,且sshd必须是运行状态,因为Hadoop调用远程进程使用sshd(在单机模式中这个不是必须的)。另外,需要实现master节点向slave节点的无密码登录,可以查看实现ssh的无密码登录。
1.3 下载Hadoop
当前Hadoop有三个分支:
- 1.2.X - current stable version, 1.2 release
- 2.5.X - current stable 2.x version
- 0.23.X - similar to 2.X.X but missing NN HA.
上面是当前官网提供的信息,我使用的版本是2.4.1,略低于当前的2.5.1。
1.4 环境变量
环境变量JAVA_HOME是必需的,通常在安装JDK的时候就已经配置了。如果没有配置JAVA_HOME,则需要在$HADOOP_HOME/etc/hadoop/目录中的hadoop-env.sh
、mapred-env.sh
、yarn-env.sh
中增加JAVA_HOME目录地址。
环境变量HADOOP_HOME或HADOOP_PREFIX指向Hadoop的安装目录,我在这里使用的是HADOOP_HOME。
另外,为了方便运行一些Hadoop提供的命令,可以将$JAVA_HOME/bin、$HADOOP_HOME/bin和$HADOOP_HOME/sbin加入到PATH变量中。
具体为:
export JAVA_HOME=~/jdk1.8.0_05
export JRE_HOME=$JAVA_HOME/jre
export HADOOP_HOME=~/hadoop/hadoop-2.4.1
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
2 安装Hadoop
直接将下载到的压缩包解压即可,并在环境变量中添加HADOOP_HOME或HADOOP_PREFIX。
Apache官网提供的Hadoop是32位的,如果系统是64位的,会报错:
WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable
需要重新编译,并替换掉$HADOOP_HOME/lib/native下的库文件,可以从这里下载。
然后验证是否成功:
$ hadoop version
如果出现下面的信息,说明Hadoop安装成功。
Hadoop 2.4.1
Subversion http://svn.apache.org/repos/asf/hadoop/common -r 1604318
Compiled by jenkins on 2014-06-21T05:43Z
Compiled with protoc 2.5.0
From source with checksum bb7ac0a3c73dc131f4844b873c74b630
This command was run using /home/lxh/hadoop/hadoop-2.4.1/share/hadoop/common/hadoop-common-2.4.1.jar
3 单机模式
在所有准备工作完成后,单机模式部署已经完成,下面就实验一下。
$ mkdir ~/input
$ echo "This is test." >> ~/input/test
$ hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.1.jar wordcount ~/input ~/output
$ cat ~/output/*
上面就是Hadoop版的Hello World,如果成功打印下面信息:
This 1
is 1
test. 1
说明所有环境已经准备好,可以调试程序或者进行Hadoop伪分布式模式部署了。
4 伪分布式模式
伪分布式模式的准备工作与单机模式相同,唯一需要做的改变是要修改Hadoop的部分配置文件:core-site.xml、hdfs-site.xml。
4.1 环境搭建
4.1.1 修改core-site.xml
修改$HADOOP_HOME/etc/hadoop/core-site.xml
文件。在默认情况下,这个文件为空,没有任何配置,这里需要指定NameNode
的ip和端口(默认端口是8020)。
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://192.168.1.134:9000</value>
</property>
</configuration>
192.168.1.134是我的本机地址,可以写localhost或127.0.0.1。但是如果需要Eclipse远程调用Hadoop的时候,需要些具体的ip地址,否则调不通。
4.1.2 修改hdfs-site.xml
HDFS是分布式文件系统,为了安全性考虑,会将上传至HDFS的文件的每个分块拷贝到N个节点上,即复制N次(这里的N成为复制因子)。这里将复制因子改为1。
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
4.2 启动最小Hadoop伪分布式模式
经过上面的最小配置后,Hadoop已经可以启动伪分布式模式了。
4.2.1 格式化文件系统
第一次运行Hadoop的时候需要格式化其文件系统:
$ bin/hdfs namenode -format
如果成功,会打印:
。。。
14/10/14 19:09:05 INFO common.Storage: Storage directory /tmp/hadoop-lxh/dfs/name has been successfully formatted.
。。。
4.2.2 启动NameNode守护进程和DataNode守护进程
直接通过Hadoop提供的脚本start-dfs.sh
即可:
$ sbin/start-dfs.sh
启动日志保存在$HADOOP_LOG_DIR目录中(默认是$HADOOP_HOME/logs)。
4.2.3 查看启动的进程
可以通过jps
查看已经启动的进程:
31536 SecondaryNameNode
31381 DataNode
31254 NameNode
31643 Jps
说明DataNode
、NameNode
、SecondaryNameNode
已经启动成功。
4.2.4 查看NameNode的web接口
通过默认的NameNode的web接口http://localhost:50070/,可以查看NameNode收集的信息,相当于关于Hadoop提供的一个信息查询系统。
4.2.5 Hello World
执行官网提供的验证程序。
$ hdfs dfs -mkdir /input
$ hdfs dfs -put $HADOOP_HOME/etc/hadoop/* /input
$ hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.1.jar grep /input /output 'dfs[a-z.]+'
$ hdfs dfs -cat /output/*
最后一条命令是显示最后的执行结果:
6 dfs.audit.logger
4 dfs.class
3 dfs.server.namenode.
2 dfs.period
2 dfs.audit.log.maxfilesize
2 dfs.audit.log.maxbackupindex
1 dfsmetrics.log
1 dfsadmin
1 dfs.servers
1 dfs.replication
1 dfs.file
4.2.6 停止进程
伪分布式模式中的第一个Hello World执行成功后,可以关闭进程了。
$ stop-dfs.sh
4.3 配置YARN
通过配置一些参数,并启动ResourceManager守护进程和NodeManager守护进程,可以在伪分布式模式中,在YARN
上运行MapReduce任务。
上面的最小配置不变。
4.3.1 修改mapred-site.xml
在默认的Hadoop安装包中,没有mapred-site.xml文件,可以复制mapred-site.xml.template,并修改,指定在YARN中运行MapReduce任务:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
4.3.2 修改yarn-site.xml
指明需要向MapReduce应用提供的Shuffle服务。
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
4.3.3 运行
可以通过start-yarn.sh
启动ResourceManager守护进程和NodeManager守护进程,通过stop-yarn.sh
停止。
4.4 补充配置
Hadoop默认将HDFS文件系统写在/tmp/hadoop-
4.4.1 修改core-site.xml
<property>
<name>hadoop.tmp.dir</name>
<value>file:/home/lxh/hadoop/tmp/hadoop</value>
</property>
4.4.2 修改hdfs-site.xml
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/lxh/hadoop/hdfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/lxh/hadoop/hdfs/data</value>
</property>
5 结束
至此,hadoop的单机模式、伪分布式模式部署方式介绍完毕,完全分布式模式与伪分布式模式类似,不再缀余。