单机伪分布式环境的搭建请参考这篇文章。
1. 实验环境的相关信息
- 操作系统:
CentOS7.2.1511 - hadoop版本:
2.7.3 - 节点信息:
角色 | 地址 |
---|---|
Namenode | 192.168.1.231 |
Datanode | 192.138.1.232 |
Datanode | 192.168.1.233 |
2. 安装和配置JDK
这里我们选择安装JDK8。
- 下载
curl -LO -H "Cookie: oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u71-b15/jdk-8u71-linux-x64.rpm"
- 安装
rpm -Uvh jdk-8u71-linux-x64.rpm
- 配置环境变量
打开/etc/profile
,在文件最后面添加如下内容:
export JAVA_HOME=/usr/java/default
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
- 使环境变量生效
执行如下命令:
source /etc/profile
使环境变量及时生效。
- 选择正确的JDK版本
为防止系统里存在多个版本的JDK,需要使用alternatives
选择正确的版本:
alternatives --config java
请选择/usr/java/jdk1.8.0_71/jre/bin/java
对应的数字标号。
3. 设置hostname
为方便节点之间的互相访问,在每个节点的/etc/hosts
文件中添加如下内容:
192.168.1.231 hadoop-namenode
192.168.1.232 hadoop-datanode-1
192.168.1.233 hadoop-datanode-2
4. 创建hadoop用户
在每个节点上创建hadoop用户:
useradd -d /usr/hadoop hadoop #用户家目录设置为/usr/hadoop
chmod 755 /usr/hadoop
passwd hadoop #设置用户密码
5. 设置SSH免密钥登录
由于Namenode会执行一系列脚本去控制Datanode,因此需要设置SSH免密钥登录,省去输入密码的麻烦。
- 登录到Namenode节点,切换用户为hadoop
su hadoop
- 生成SSH KEY并将其拷贝到各个节点主机上
依次执行如下命令:
ssh-keygen
ssh-copy-id localhost #免密钥登录本机
ssh-copy-id hadoop-datanode-1
ssh-copy-id hadoop-datanode-2
设置完成后,尝试在Namenode节点上用SSH连接各个节点,如果无需输入密码即可登录,则表示设置成功:
ssh localhost
ssh hadoop-datanode-1
ssh hadoop-datanode-2
6. 安装hadoop
本步骤需要在每个节点下载和安装hadoop,并做简单的配置。
- 下载和安装,这里选择2.7.3版本
su hadoop #切换到hadoop用户
#下载2.7.3版本hadoop
curl -O http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.7.3/hadoop-2.7.3.tar.gz
#安装到/usr/hadoop目录
tar zxvf hadoop-2.7.3.tar.gz -C /usr/hadoop --strip-components 1
- 配置环境变量
以hadoop
用户的身份,打开~/.bashrc
文件,在文件末添加如下内容:
export HADOOP_HOME=/usr/hadoop
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_YARN_HOME=$HADOOP_HOME
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native"
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
- 使环境变量生效
执行如下命令:
source ~/.bashrc
使环境变量及时生效。
7. 配置hadoop
本节对hadoop集群进行具体的配置。首先请以hadoop
用户的身份登录Namenode节点。
- 创建Datanode文件目录
su hadoop
# Namenode兼做Datanode
mkdir ~/datanode
# 远程到Datanode节点创建对应的目录
ssh hadoop-datanode-1 "mkdir ~/datanode"
ssh hadoop-datanode-2 "mkdir ~/datanode"
- 配置hdfs
首先打开~/etc/hadoop/hdfs-site.xml
文件,在<configuration> - </configuration>
之间添加如下内容:
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///usr/hadoop/datanode</value>
</property>
接下来将配置文件同步到Datanode:
scp ~/etc/hadoop/hdfs-site.xml hadoop-datanode-1:~/etc/hadoop/
scp ~/etc/hadoop/hdfs-site.xml hadoop-datanode-2:~/etc/hadoop/
- 配置hadoop core
首先打开~/etc/hadoop/core-site.xml
文件,在<configuration> - </configuration>之间添加如下内容:
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop-namenode:9000/</value>
</property>
接下来将配置文件同步到Datanode:
scp ~/etc/hadoop/core-site.xml hadoop-datanode-1:~/etc/hadoop/
scp ~/etc/hadoop/core-site.xml hadoop-datanode-2:~/etc/hadoop/
- 在hadoop中设置
JAVA_HOME
环境变量
首先通过如下命令在本机修改hadoop-env.sh
文件中的环境变量:
sed -i -e 's/\${JAVA_HOME}/\/usr\/java\/default/' ~/etc/hadoop/hadoop-env.sh
接下来将配置文件同步到Datanode:
scp ~/etc/hadoop/hadoop-env.sh hadoop-datanode-1:~/etc/hadoop/
scp ~/etc/hadoop/hadoop-env.sh hadoop-datanode-2:~/etc/hadoop/
- 创建Namenode文件目录
本步骤只需在Namenode上操作。
首先创建目录:
mkdir ~/namenode
编辑~/etc/hadoop/hdfs-site.xml
文件,增加如下的配置项:
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///usr/hadoop/namenode</value>
</property>
- 配置map-reduce:
本步骤只需在Namenode上操作。
打开~/etc/hadoop/mapred-site.xml
文件,新增如下内容:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
- 配置yarn
首先打开~/etc/hadoop/yarn-site.xml文件,在<configuration> - </configuration>之间添加如下内容:
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop-namenode</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
接下来将配置文件同步到Datanode:
scp ~/etc/hadoop/yarn-site.xml hadoop-datanode-1:~/etc/hadoop/
scp ~/etc/hadoop/yarn-site.xml hadoop-datanode-2:~/etc/hadoop/
- 配置slave
打开etc/hadoop/slaves文件,添加如下内容:
hadoop-namenode
hadoop-datanode-1
hadoop-datanode-2
8. 运行示例进行验证
- 请暂时关闭防火墙:
systemctl stop firewalld
- 在Namenode上运行如下命令,分别启动hdfs和yarn服务:
start-dfs.sh
start-yarn.sh
在Namenode上运行jps
命令,应该会看到如下进程:
NameNode
SecondaryNameNode
NodeManager
DataNode
ResourceManager
Jps
在Datanode上运行jps
命令,应该会看到如下进程:
NodeManager
Jps
DataNode
- 通过web界面查看
访问http://192.168.1.231:50070,可以看到如下图所示的页面,用来了解文件系统信息:
访问http://192.168.1.231:8088/,可以看到如下图所示的页面,用来监控任务的执行情况: res-node-manager
- 运行示例程序
接下来就可以运行示例程序了,hadoop2.7.3提供的示例程序做了这件事:用正则表达式dfs[a-z.]+
来搜索所有的输入文件,并汇总和统计搜索到的结果。简单来说,map过程就是对每个文件分别进行处理,reduce过程就是将这些结果进行汇总。
在Namenode上使用如下命令,开始这个过程:
su hadoop
cd ~
hdfs dfs -mkdir /user
hdfs dfs -mkdir /user/test
hdfs dfs -put etc/hadoop /user/test
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar grep /user/test/hadoop /user/test/output 'dfs[a-z.]+'
在如上命令中,我们把文件系统中的/user/test/hadoop
文件夹下的文件作为示例程序的输入,并告知示例程序将结果存储到/user/test/hadoop
目录中。
执行命令时,可以刷新http://192.168.1.231:8088/这个页面,来获取任务执行情况。
任务执行成功后,执行如下命令查看结果:
$ hdfs dfs -cat /user/test/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
可以看到该程序的输出,就是所有输入文件中被正则表达式匹配到的内容以及这些内容被匹配到的次数的统计。
网友评论