
一、准备虚拟机本文不讲原理,只记录一下快速搭建hadoop集群的过程。参考:https://www.bilibili.com/video/BV1Qp4y1n7EN
系统:CentOS7.7
hadoop版本:3.3.2
jdk版本:1.8.0_321
1、安装三台虚拟机,安装过程可参考 超详细的CentOS7.4下载与图文安装_运维_浅末年华的博客
2、安装完毕后,修改三台虚拟机的hostname分别为hadoop-node1、hadoop-node2、hadoop-node3,并在三台虚拟机的hosts中将其他虚拟机的ip加进去,原先的localhost可以删除,保留也不影响。修改后结果如下
[root@hadoop-node1 ~]# cat /etc/hostname hadoop-node1 [root@hadoop-node1 ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.133.21 hadoop-node1 192.168.133.22 hadoop-node2 192.168.133.23 hadoop-node3二、配置ssh免密登录
1、在三台机器上分别执行下面的命令来生成密钥对
# 如果文件夹不存在,则手动创建一下 mkdir ~/.ssh cd ~/.ssh # 输入下面的命令,连续敲三次回车,生成秘钥 ssh-keygen -t rsa
2、分别在三台机器上个执行下面的命令,将公钥复制到需要免登录的目标机器上,这一步需要输目标机器的密码
ssh-copy-id hadoop-node1 ssh-copy-id hadoop-node2 ssh-copy-id hadoop-node3
3、执行完成后就可以测试免密登录是否OK了
# 测试免密登录到node2 ssh hadoop-node2三、编写文件同步脚本
1、编写同步脚本
cd ~ vim xsync
将下面的内容完整粘贴进去,根据对应机器的host进行修改
#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2. 遍历集群所有机器
for host in hadoop-node1 hadoop-node2 hadoop-node3
do
echo ------ 正在同步文件,目标主机:$host
#3. 遍历所有目录,挨个发送
for file in $@
do
#4. 判断文件是否存在
if [ -e $file ]
then
#5. 获取父目录
pdir=$(cd -P $(dirname $file); pwd)
#6. 获取当前文件的名称
fname=$(basename $file)
ssh $host "mkdir -p $pdir"
rsync -av $pdir/$fname $host:$pdir
else
echo $file does not exists!
fi
done
done
2、修改文件权限
chmod +x xsync
3、将文件移动到/bin目录下
mv ~/xsync /bin/
4、将脚本同步到其他机器上
xsync /bin/xsync四、安装jdk和hadoop
1、卸载openjdk
rpm -qa | grep -i java | xargs -n1 rpm -e --nodeps
2、到官网下载jdk和hadoop的tar包,下载完成后上传到所有服务器上,路径为/opt/software,同时创建再创建一个目录用于存放解压后的应用
mkdir -p /opt/software /opt/module
3、解压jdk和hadoop
tar -zxvf jdk-8u321-linux-x64.tar.gz -C /opt/module/ tar -zxvf hadoop-3.3.2.tar.gz -C /opt/module/
4、配置环境变量
新建并编辑文件,文件名无所谓,只要是sh就行,至于为啥会这样,可以查看/etc/profile文件最后的那个for循环就可以知道了
vim /etc/profile.d/my_env.sh
将下面内容添加到文件中
#JAVA_HOME export JAVA_HOME=/opt/module/jdk1.8.0_321 export PATH=$PATH:$JAVA_HOME/bin #HADOOP_HOME export HADOOP_HOME=/opt/module/hadoop-3.3.2 export PATH=$PATH:$HADOOP_HOME/bin export PATH=$PATH:$HADOOP_HOME/sbin export HDFS_NAMENODE_USER=root export HDFS_DATANODE_USER=root export HDFS_SECONDARYNAMENODE_USER=root export YARN_RESOURCEMANAGER_USER=root export YARN_NODEMANAGER_USER=root
上面的环境变量中,最后的5行,如果不是使用root用户启动,不用加,估计官方也不建议使用root用户启动吧。毕竟是自己搭建了玩的,所以就简单粗暴,直接使用root用户。
上述的环境变量配置好了之后,需要执行一下source命令来让环境变量生效(所有虚拟机上都需要执行)
source /etc/profile
五、hadoop集群配置上面的操作中,前三步由于文件较大,所以不建议使用xsync脚本进行同步,还是挨个上传手动解压。至于第四步,则可以通过xsync脚本将my_env.sh同步到所有主机,然后在所有虚拟机上挨个执行source命令即可。
1、考虑到资源的合理运用,所以三台虚拟机的应用部署如下
| hadoop-node1 | hadoop-node2 | hadoop-node3 | |
|---|---|---|---|
| HDFS | NameNode DataNode | DataNode | SecondaryNameNode DataNode |
| YARN | NodeManager | ResourceManager NodeManager | NodeManager |
2、修改配置文件
下面的命令都是在hadoop安装目录下执行,即/opt/module/hadoop-3.3.2目录,修改的时候仅需要修改其中一台机器上的就行,修改完成后,直接通过xsync同步到其他所有节点上
(1)core-site.xml
vim etc/hadoop/core-site.xml
将下面的内容完整复制到configuration标签内
fs.defaultFS hdfs://hadoop-node1:8020 hadoop.tmp.dir /opt/module/hadoop-3.3.2/data hadoop.http.staticuser.user root
(2)hdfs-site.xml
vim etc/hadoop/hdfs-site.xml
将下面的内容完整复制到configuration标签内
dfs.namenode.http-address hadoop-node1:9870 dfs.namenode.secondary.http-address hadoop-node3:9868
(3)yarn-site.xml
vim etc/hadoop/yarn-site.xml
将下面的内容完整复制到configuration标签内
yarn.nodemanager.aux-services mapreduce_shuffle yarn.resourcemanager.hostname hadoop-node2 yarn.log-aggregation-enable true yarn.log.server.url http://hadoop-node1:19888/jobhistory/logs yarn.log-aggregation.retain-seconds 604800
(4)mapred-site.xml
vim etc/hadoop/mapred-site.xml
将下面的内容完整复制到configuration标签内
mapreduce.framework.name yarn yarn.app.mapreduce.am.env HADOOP_MAPRED_HOME=/opt/module/hadoop-3.3.2 mapreduce.map.env HADOOP_MAPRED_HOME=/opt/module/hadoop-3.3.2 mapreduce.reduce.env HADOOP_MAPRED_HOME=/opt/module/hadoop-3.3.2 mapreduce.jobhistory.address hadoop-node1:10020 mapreduce.jobhistory.webapp.address hadoop-node1:19888
(5)workers
vim etc/hadoop/workers
将所有的工作节点配置到里面,里面最初是有一个localhost,要去掉,需要注意的是,前后不能有空格,也不能有空行,文件内容如下
hadoop-node1 hadoop-node2 hadoop-node3
最后将上述修改的配置文件同步到所有机器
xsync etc/hadoop六、启动集群
下面的命令若无特殊说明,都默认是在hadoop安装目录执行
1、初始化NameNode,在hadoop-node1上执行
hdfs namenode -format
2、启动hdfs,在hadoop-node1上执行
sbin/start-dfs.sh
3、启动yarn,注意,这一步是在hadoop-node2上执行
sbin/start-yarn.sh
4、启动历史服务器,又回到hadoop-node1上执行
mapred --daemon start historyserver
5、执行完上述的命令之后,应用的启动情况如下
[root@hadoop-node1 hadoop-3.3.2]# jps 6241 Jps 4050 NodeManager 4198 JobHistoryServer 3545 NameNode 3724 DataNode [root@hadoop-node2 hadoop-3.3.2]# jps 3184 DataNode 3553 NodeManager 59767 Jps 3401 ResourceManager [root@hadoop-node3 hadoop-3.3.2]# jps 3203 DataNode 3315 SecondaryNameNode 4964 Jps 3420 NodeManager
一切ok,打开浏览器依次查看下面的页面是否正常
(1)NameNode页面:http://hadoop-node1:9870
(2)SecondaryNameNode页面:http://hadoop-node3:9868
(3)ResourceManager页面:http://hadoop-node2:8088
(4)JobHistoryServer页面:http://hadoop-node1:19888
6、如果要关闭集群,则步骤与启动集群时刚好相反,其中的start换为stop
# node1 mapred --daemon stop historyserver # node2 sbin/stop-yarn.sh # node1 sbin/stop-dfs.sh