初学hadoop,记录一下在CentOS7下搭建单机版hadoop伪分布式环境的过程,备忘。
多节点完全分布式环境的搭建请参考这篇文章。
下载版本
目前hadoop有三个大版本,版本三还是阿尔法版,因此选择版本二里最新的2.7.3版本。下载链接在此,请选择官方推荐的镜像地址进行下载。
wget http://apache.fayea.com/hadoop/common/hadoop-2.7.3/hadoop-2.7.3.tar.gz
tar zxvf hadoop-2.7.3.tar.gz
设置JAVA_HOME环境变量
hadoop要求JAVA7以上版本,CentOS7的JAVA安装在/usr/lib/jvm
目录下,通过编辑hadoop-env.sh
配置文件中的JAVA_HOME选项来设定该环境变量。
cd hadoop-2.7.3/
vim etc/hadoop/hadoop-env.sh
打开文件后,找到这一行:
export JAVA_HOME=${JAVA_HOME}
可见默认使用的是系统的JAVA_HOME
环境变量,如果尚未设置,则要在这里修改为JAVA的根目录,以我使用的环境为例:
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.102-4.b14.el7.x86_64/jre
设置完成后,使用如下命令:
bin/hadoop
如果出现usage文档,则说明配置成功了。
伪分布式环境的配置
接着就可以在本机配置并启动伪分布式环境,用来运行hadoop的示例程序了。
- 配置hdfs
hadoop使用hdfs作为其分布式文件系统,首先要对hdfs做相关配置。hadoop使用xml作为其配置文件的格式。
首先在etc/hadoop/core-site.xml
这个文件里作如下配置:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
接着在etc/hadoop/hdfs-site.xml
文件里作如下配置:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
这两个配置说明了hdfs的根信息以及冗余备份的数量。
- 配置SSH免key登陆
hadoop是一个分布式系统,节点间通过ssh通信,为了避免在连接过程中人工输入密码,需要进行ssh免key登陆的配置,由于本例是在单机上模拟分布式过程,因此需要针对本机(localhost)进行免key登陆的配置。
依此输入如下命令进行配置:
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys
完成后尝试用SSH连接本机,如果不需要输入密码就能登陆,说明配置成功:
ssh localhost
运行示例程序
至此,所有配置都已完成,可以运行示例程序来进行验证了。
- 格式化文件系统
示例程序将在hdfs文件系统中运行,因此首先需要对该文件系统进行格式化:
bin/hdfs namenode -format
接着启动该文件系统:
sbin/start-dfs.sh
此外,可以在hadoop提供的web界面http://localhost:50070/查看该文件系统的相关信息,如下图所示(如果看不到,请尝试使用systemctl stop firewalld
命令暂时关闭防火墙)
namenode-info.png
- 将示例程序所需要的输入文件上传到文件系统中
需要在hdfs中创建目录,用来存放示例程序的输入文件:
bin/hdfs dfs -mkdir /user
bin/hdfs dfs -mkdir /user/test
bin/hdfs dfs -put etc/hadoop /user/test
上述命令创建了一个user
目录,并在该目录下创建了一个test
用户目录。我们将本地etc/hadoop
这个文件夹里的内容作为输入数据,上传到hdfs文件系统的/user/test
目录中。
- 用YARN来监控任务
到此为止,所有准备任务已经完成了,但为了可以更直观的观察任务的执行状态,可以启用YARN来监控任务的运行,具体如下:
首先对etc/hadoop/mapred-site.xml
文件作如下配置:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration
接着对etc/hadoop/yarn-site.xml
文件作如下配置:
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
配置完成,执行启动脚本启动YARN服务:
sbin/start-yarn.sh
用浏览器打开http://localhost:8088/这个地址,便可以看到资源和节点管理的相关信息了。下一步执行任务时,也可以从这个页面获取任务的执行情况。
res-node-manager.png
- 运行示例程序
接下来就可以运行示例程序了,hadoop提供的示例程序做了这件事:用正则表达式dfs[a-z.]+
来搜索所有的输入文件,并汇总和统计搜索到的结果。简单来说,map过程就是对每个文件分别进行处理,reduce过程就是将这些结果进行汇总。
使用如下命令,开始这个过程:
bin/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://localhost:8088/这个页面,来获取任务执行情况。
任务执行成功后,执行如下命令查看结果:
[root@localhost hadoop-2.7.3]# bin/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
可以看到该程序的输出,就是对所有输入文件被正则表达式匹配到的内容及其匹配到的次数的检索结果。
一些注意点和坑
- 按规则创建文件夹
请务必先在hdfs文件系统中,先创建/user
目录,并在该目录中创建用户名子目录(例如/user/test
目录),再将输入文档上传到该子目录中。 - hostname的问题
如果在执行示例程序的时候,发现程序不停地尝试Connecting to ResourceManager at /0.0.0.0:8032
,可能是因为你的hostname被做了修改,不再是localhost
,导致了程序执行失败。这时首先可以检查一下你的提示符,是不是变成了类似于[root@promote hadoop-2.7.3]
这样的,那么可能是主机名被本地DNS代理设置成了promote.cache-dns.local
。
请通过hostnamectl status
命令查看自己的hostname,是不是变成了这样:
[root@promote ~]# hostnamectl status
Static hostname: promote.cache-dns.local
Transient hostname: promote.cache-dns.local
Icon name: computer-vm
Chassis: vm
Machine ID: 3a8577e9fd4c49768d827b8d5a4cc419
Boot ID: 5d2cca56687642e098f9899e176d2300
Virtualization: kvm
Operating System: CentOS Linux 7 (Core)
CPE OS Name: cpe:/o:centos:centos:7
Kernel: Linux 3.10.0-514.el7.x86_64
Architecture: x86-64
那我们需要把主机名改回localhost
。通过如下命令:
hostnamectl set-hostname localhost
关于CentOS7的hostname详细设置,可以参考这篇文章。
- 清除缓存文件
当你有哪个步骤操作失误,想重新尝试时,请先终止正在运行的服务,并删除/tmp
下的相关文件夹,并从格式化文件系统那个步骤重新开始。
sbin/stop-dfs.sh
sbin/stop-yarn.sh
rm -rf /tmp/hadoop-root