Day02 Hadoop分布式集群搭建步骤
文章目录
一、安装jdk和hadoop环境
本文所描述的分布式集群搭建步骤可以使用虚拟机进行同样也可以使用云服务器的方式进行,所以需要有一些准备工作,
- 虚拟机软件(可以使用VMware Workstation Pro)
- 同一内网的云服务器(相互可以内部ping通)
以上两个二选一即可。
详细步骤:
-
安装centos7.5系统(实际笔者建议安装server版本,节约些内存)
这个自己选择进行安装,配置好密码。笔者将在文末提供ISO的链接。
-
使用
root
权限登录系统,在根目录下的opt目录中创建两个目录,一个soft,另一个module。Soft目录用于存放压缩文件,module目录用于存放解压后的文件。mkdir /opt/soft /opt/module
-
上传
JDK
以及Hadoop
的压缩包到/opt/soft
(注意:现目前用户是否是root用户)如果使用虚拟机并centos为桌面版的话可以直接从windows拖入虚拟机内linux中,如果是云服务器或server版本centos的话可以使用
MobaXterm
进行ssh连接
,该软件自带Sftp
功能,可以直接拖入文件到linux中。 -
将
JDK
以及Hadoop
解压到module
中。
tar -zxvf /opt/soft/jdk-8u121-linux-x64.tar.gz -C /opt/module
tar -zxvf /opt/soft/hadoop-3.1.3.tar.gz -C /opt/module
-
配置环境变量,在
/etc/profile
最后添加以下内容:-
vim /etc/profile
-
按字母
i
-
箭头调整光标到最后输入
JAVA_HOME=/opt/module/jdk1.8.0_121 HADOOP_HOME=/opt/module/hadoop-3.1.3 PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin export JAVA_HOME HADOOP_HOME PATH
-
按
ESC
后输入wq!
保存退出 -
source /etc/profile
-
二、配置集群前的准备工作
-
创建一个新用户(如果已经存在新用户,该步骤可以省略)
useradd tgmmmmmmmm(你想要的用户名) passwd tgmmmmmmmm(为你的用户创建密码)
-
给该用户
root
权限vim /etc/sudoers
-
关闭防火墙
systemctl stop firewalld 停止防火墙 systemctl disable firewalld 永久禁止防火墙开机自启
-
把opt目录下soft目录以及module目录交给普通用户*(我的是tgmmmmmmmm)*
chown -R tgmmmmmmmm:tgmmmmmmmm /opt/soft /opt/module
-
克隆虚拟机,保证至少有三台机器运行
-
保证3台机器能够相互通信,也就是需要配置/etc/hosts,在此之前,需要把主机名更改为不同名字,如hadoop101,hadoop102,hadoop103。
(1)最好配置为静态分配IP,避免因为虚拟机被分配IP改变重新配置,见文章**linux下设置静态ip**。
(2)更改主机名的文件在
/etc/hostname
,将原有名字全部删除,并写入新的名字,保存并退出,再重启。(3)将每台机器的ip地址复制,粘贴到
/etc/hosts
文件中,并在后方写入对应的主机名,如下图:
三、Hadoop节点分配
- 集群的三大框架:
- 如何避免单点故障:只需要咱们合理的分配节点在集群的机器中(均衡搭配)。
Hadoop101: namenode datanode nodemanager
Hadoop102: resourcemanager datanode nodemanager
Hadoop103: secondarynamenode datanode nodemanager
也就是说,namenode作为hdfs的关键,放置在了hadoop101,而resourcemanager作为yarn的关键,放置在了hadoop102.
四、配置HDFS
core-site.xml
- 要启动HDFS,首先需要配置core-site.xml文件
(该文件位于/opt/module/hadoop-3.1.3/etc/hadoop/)
在文件中的标签中添加以下配置
<!-- 决定hdfs运行模式 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop101:8020</value>
</property>
<!-- 配置hadoop临时目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.1.3/data</value>
</property>
<!-- 配置web端页面的静态用户 -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>tedu</value>
</property>
<!--定义HDFS所开放的代理服务 -->
<property>
<name>hadoop.proxyuser.tedu.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.tedu.groups</name>
<value>*</value>
</property>
-
**格式化namenode(**自动创建hadoop临时目录)
hadoop namenode -format
-
启动namenode和datanode节点(启动hdfs)
hadoop-daemon.sh start namenode hadoop-daemon.sh start datanode
hdfs-site.xml(与core-site.xml在同级目录)
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop101:9870</value>
</property>
<!-- 2nn web端访问地址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop103:9868</value>
</property>
mapred-site.xml(同目录)
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 历史服务器运行机器以及端口 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop102:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop102:19888</value>
</property>
yarn-site.xml(同级目录)
<!-- 指定MR走shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定ResourceManager的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop102</value>
</property>
<!-- 环境变量的继承 -->
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
<!-- yarn容器允许分配的最大最小内存 -->
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>1024</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>4096</value>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>4096</value>
</property>
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 设置日志聚集服务器地址 -->
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop102:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间为7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
配置同步
将三台电脑配置同步一下
rsync -av /opt/module/…/core-site.xml tgm@hadoop102:/opt/module/.../
五、集群启动与关闭
a) 启动:
i. Hadoop101命令:
1. hadoop-daemon.sh start namenode
2. hadoop-daemon.sh start datanode
3. yarn-daemon.sh start nodemanager
ii. Hadoop102命令:
-
hadoop-daemon.sh start datanode
-
yarn-daemon.sh start nodemanager
-
yarn-daemon.sh start resourcemanager
iii. Hadoop103命令:
-
hadoop-daemon.sh start secondarynamenode
-
yarn-daemon.sh start nodemanager
-
hadoop-daemon.sh start datanode
b)停止:
就是把启动命令中的start替换成stop
六、其他配置
配置免密登录
-
使用ssh算法
ssh-keygen -t rsa
-
本机免密登录其他主机
ssh-copy-id tgm@hadoop102
not set 报错解决
如果配置了java_home还是显示not set的话 就在hadoop/etc/hadoop/下的hadoop.env.sh配置中重新配置一下java_home的路径。
使用群起、群闭
hadoop中本身具有群起群闭的命令可以用,首先配置workers同样在hadoop的etc中,加入三台主机即可
后续使用start-dfs.sh即可
七、脚本记录
虽然有hadoop的群起群闭命令,但是我们还想查看一下整个系统的运行状态,我们可以自己编写脚本进行命令封装,同时也可以把文件同步,和三机同时执行命令一起封装了。
myjps
可以用该命令看三台机器的运行状况
#!/bin/bash
echo "jps is run..."
for i in hadoop101 hadoop102 hadoop103
do
echo "-----------$i-----------"
ssh $i "source /etc/profile;jps"
done
start-cluster
该命令可以启动集群
#!/bin/bash
echo -e "\n--------------------TgM@Copyright-------------------"
echo -e "\n--------------------start cluster-------------------"
echo -e "\n-------------------- start hdfs -------------------"
echo -e "\n-------------------start hadoop101 namenode---------"
hadoop-daemon.sh start namenode
echo -e "\n-------------------start hadoop101 datanode---------"
hadoop-daemon.sh start datanode
echo -e "\n-------------------start hadoop102 datanode---------"
ssh tgm@hadoop102 "source /etc/profile;hadoop-daemon.sh start datanode"
echo -e "\n-------------------start hadoop103 datanode---------"
ssh tgm@hadoop103 "source /etc/profile;hadoop-daemon.sh start datanode"
echo -e "\n-------------------start hadoop103 secondarynamenode---------"
ssh tgm@hadoop103 "source /etc/profile;hadoop-daemon.sh start secondarynamenode"
echo -e "\n--------------------finish hdfs --------------------"
echo -e "\n-------------------- start yarn --------------------"
echo -e "\n-------------------start hadoop101 nodemanager---------"
yarn-daemon.sh start nodemanager
echo -e "\n-------------------start hadoop102 resourcemanager---------"
ssh tgm@hadoop102 "source /etc/profile;yarn-daemon.sh start resourcemanager"
echo -e "\n-------------------start hadoop102 nodemanager---------"
ssh tgm@hadoop102 "source /etc/profile;yarn-daemon.sh start nodemanager"
echo -e "\n-------------------start hadoop103 nodemanager---------"
ssh tgm@hadoop103 "source /etc/profile;yarn-daemon.sh start nodemanager"
echo -e "\n--------------------finish yarn --------------------"
echo -e "\n--------------------finish cluster------------------"
myjps
最后这个myjps是使用了上述自己编写的命令,如果想要不输入路径直接使用的话,需要将命令写在一个配置到环境变量中的文件夹中。
tongshi
该脚本会在三台机器中执行任意同一条命令。
#!/bin/bash
if (($#==0)); then
echo "nothing to do";
exit
fi
echo --------------------$*----------------------
for i in hadoop101 hadoop102 hadoop103
do
echo ---------------------$i-------------------
ssh $i "$@"
tongbu
该脚本位于101机器,实现效果:就算我们输入的路径是相对路径,该脚本也能识别为绝对路径,并且发放到102以及103机器中的同一目录下。
#!/bin/bash
pcount=$#
if((pcount==0));then
echo "nothing to do";
exit;
fi
p1=$1 fname=`basename $p1`
echo fname=$fname
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir
user=`whoami`
for i in hadoop101 hadoop102 hadoop103; do
echo --------------- $i ----------------
rsync -av $pdir/$fname $user@$i:$pdir
done
于101机器,实现效果:就算我们输入的路径是相对路径,该脚本也能识别为绝对路径,并且发放到102以及103机器中的同一目录下。
#!/bin/bash
pcount=$#
if((pcount==0));then
echo "nothing to do";
exit;
fi
p1=$1 fname=`basename $p1`
echo fname=$fname
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir
user=`whoami`
for i in hadoop101 hadoop102 hadoop103; do
echo --------------- $i ----------------
rsync -av $pdir/$fname $user@$i:$pdir
done