快速搭建一个hadoop集群
本文不讲原理,只记录一下快速搭建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
上面的操作中,前三步由于文件较大,所以不建议使用xsync 脚本进行同步,还是挨个上传手动解压。至于第四步,则可以通过xsync 脚本将my_env.sh 同步到所有主机,然后在所有虚拟机上挨个执行source 命令即可。
五、hadoop集群配置
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 标签内
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop-node1:8020</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.3.2/data</value>
</property>
<property>
<name>hadoop.http.staticuser.user</name>
<value>root</value>
</property>
(2)hdfs-site.xml
vim etc/hadoop/hdfs-site.xml
将下面的内容完整复制到configuration 标签内
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop-node1:9870</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop-node3:9868</value>
</property>
(3)yarn-site.xml
vim etc/hadoop/yarn-site.xml
将下面的内容完整复制到configuration 标签内
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop-node2</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop-node1:19888/jobhistory/logs</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
(4)mapred-site.xml
vim etc/hadoop/mapred-site.xml
将下面的内容完整复制到configuration 标签内
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=/opt/module/hadoop-3.3.2</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=/opt/module/hadoop-3.3.2</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=/opt/module/hadoop-3.3.2</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop-node1:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop-node1:19888</value>
</property>
(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
|