hadoop3.1.3集群搭建(基于Flink电商项目实战)
介绍本文这里的hadoop3.1.3的集群仅仅指hadoop本身的搭建,不涉及到其他框架整合;Flink实时电商实战项目中HDFS部分是基于此版本,B站上有这个版本的安装视频:Flink实时电商项目实战项目框架整合下载提取码:whqf搭配环境VMware16(注意不要使用15,容易蓝屏,如果出现蓝屏,大概率是系统兼容性问题,建议改用16,激活码搜索即可,很方便)安装硬件,安装虚拟机;账户:root
介绍
本文这里的hadoop3.1.3的集群仅仅指hadoop本身的搭建,不涉及到其他框架整合;Flink实时电商实战项目中HDFS部分是基于此版本,B站上有这个版本的安装视频:
Flink实时电商项目实战
项目框架链接
提取码:whqf
gitee地址
搭配环境
VMware16(注意不要使用15,容易蓝屏,如果出现蓝屏,大概率是系统兼容性问题,建议改用16,激活码搜索即可,很方便)
安装硬件,安装虚拟机;
账户:root 密码:root
用户名:chenxu 密码:root
配置IP时要注意:VMware、win10、Hadoop都要配置;
Hadoop静态IP地址更改
进入终端命令行:su root (输入密码)
输入命令:vim etc/sysconfig/network-scripts/ifcfg-ens33
dhcp表示动态获取IP地址,改为static;
增加内容:
#IP地址
IPADDR=192.168.10.100 #100表示hadoop100
#网关
GATEWAY=192.168.10.2
#域名解析器
DNS1=192.168.10.2
输入完之后按一下ESC进入EX模式,输入wq保存并退出;
-
配置主机名称:vim /etc/hostname
-
配置Linux克隆机主机名称映射hosts文件,打开/etc/hosts;(这么做的目的是为了让)以后修改IP时方便修改;
-
加入以下内容:
IP地址及hostname:
192.168.10.100 hadoop100
192.168.10.101 hadoop101
192.168.10.102 hadoop102
192.168.10.103 hadoop103
192.168.10.104 hadoop104
192.168.10.105 hadoop105
192.168.10.106 hadoop106
192.168.10.107 hadoop107
- 重启克隆机
- 切换root用户,ifconfig指令查看IP是否配置好;
模板虚拟机准备
远程控制Xshell安装完毕后,连接远程服务器;
账号密码:root;
配置主机名称映射,进入"C:\Windows\System32\drivers\etc"路径下的hosts文件中,加入之前加入的IP和主机名称内容;
可以先修改hosts文件的属性,改为可更改后再修改;(也可以直接复制出来修改,修改完之后再粘贴回去)
下载Xftp(从windows传输文件到虚拟机种);
安装epel-release;
yum install -y epel-release
关闭防火墙自启动:
- systemctl stop firewalld
- systemctl disable firewalld.service
创建一个系统用户,并修改用户密码:(安装时已创建,不需要再创建)
useradd 用户名
passwd 密码
给用户赋予root权限:
输入命令vim /etc/sudoers
找到%wheel ALL=(ALL) ALL这一行,在下一行加上
用户名 All=(ALL) NOPASSWD:ALL
其中,nopass表示以后不需要密码,可获得root权限,也可以不加NOPASS;
后续使用用户时,加上sudo,有root效果;
切换root账号:
卸载对应安装的JDK
rpm -qa | grep -i java | xargs -n1 rpm -e --nodeps
其中rpm -qa | grep -i java命令是一个遍历查询指令;
重启虚拟机;
克隆虚拟机:
先克隆3台:hadoop100、hadoop102、hadoop103、hadoop104;
先关闭现行的虚拟机,再克隆;
在VMware列表中删除,并不会直接删除源文件,要选择在磁盘中删除;
进入新生成的克隆虚拟机,进入root权限后,只需要再次输入命令
vim /etc/sysconfig/network-scripts/ifcfg-ens33
修改IPADDR,之后输入命令vim /etc/hostname 修改hostname;
输入命令 vim /etc/hosts(之前已经修改完毕,可以不用动);
Hadoop102部署JDK
部署完之后,拷贝至其他;
tar -zxvf jdk-8u212-linux-x64.tar.gz -C /opt/module/
解压文件至…目录;
配置JDK环境变量;
cd /etc/profile.d进入特定文件夹中,创建一个文件sudo vim my_env.sh,不要更改原文件;
进入存放JDK的module目录下,运用pwd命令找到JDK的路径;
在my_env.sh文件中写上:
#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_212
export PATH=
P
A
T
H
:
PATH:
PATH:JAVA_HOME/bin
接下来
source /etc/profile
部署hadoop
解压安装
tar -zxvf hadoop-3.1.3.tar.gz -C /opt/module/
配置环境变量
找到hadoop的目录,pwd获得路径;
cd /etc/profile.d/my_env.sh 进入之前创建好的文件,
添加内容:
#HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-3.1.3
export PATH=
P
A
T
H
:
PATH:
PATH:HADOOP_HOME/bin
export PATH=
P
A
T
H
:
PATH:
PATH:HADOOP_HOME/sbin
然后输入source /etc/profile
注意etc、bin、sbin目录,以后要用到;
完全分布式运行模式;
1、准备3台客户机
2、安装JDK/etc
4、安装hadoop
5、配置环境变量
6、配置集群
7、单点启动
8、配置ssh
9、群起并测试集群
hadoop102已经准备好了,现在的目标就是将hadoop102拷贝至其他服务器;
命令 scp(完全拷贝)
1、具体命令行为:scp -r $文件路径/名称 目的地用户@主机:目的地路径/名称;
scp -r hadoop-3.1.3 chenxu@hadoop103:/opt/module(从102复制到-103)
注意:如果其他服务器没有对应文件权限,赋予其module777权限;
2、也可以去要粘贴的地址,将文件拉过来:
scp -r chenxu@hadoop102:/opt/module/hadoop-3.1.3 ./(从103把102的信息拉过去)
即在之前的命令行后 加一个要粘贴的地址;文件名也改到第一个地址后;
3、scp -r chenxu:hadoop102:/opt/module/* chenxu@hadoop104:/opt/module/(从103把102的信息复制到104)
案例实操:
1、前提:hadoop102、hadoop103、hadoop104都已经创建好的/opt/module,/opt/software两个目录,并且已经把这个目录修改为chenxu:chenu;
rsync(同步命令)
用于备份和镜像;(只复制不用的文件)
rsync -av 内容 目的地用户@主机:路径或者文件名称
实操:删掉hadoop-3.1.3目录下的wcinput和wcoutput文件,再从hadoop102同步过去:
xsync(集群分发)
用法:xsync + 要同步的文件名;
期望脚本在任何路径下都能使用(脚本要放在声明了全局环境变量的路径中):
echo $PATH查看全局变量位置:为了简单,这里直接用已经存在的路径;在/usr/local/bin目录下创建bin目录,存放脚本(vim xsync);(脚本执行地址 /usr/local/bin)
脚本实现:
#!/bin/bash
#1.判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2.遍历集群所有机器
for host in hadoop102 hadoop103 hadoop104
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
chmod 777 xsync 赋予权限;
运行,发现其他几台服务器创建成功;
分发环境变量;
sudo xsync /etc/profile.d/my_env.sh
注意:如果是用sudo(即root权限)来执行,可能会找不到命令,此时可以用绝对路径:sudo ./bin/xsync /etc/profile.d/my_env.sh这种格式;
然后在103和104服务器上source一次;
ssh
ssh +主机 进入对应主机,exit退出;
免密配置方法:
进入/home/chenxu用户目录----ls -al查看虽有隐藏文件----发现有ssh文件,里面有一个known-hosts(注意,只有用过,即ssh访问过的文件才有)—输入命令行ssh-keygen -t rsa,然后三次回车;
注意:
[root@localhost ~]``# cd /root/.ssh/ 【root用户就在root目录下的.ssh目录】
[root@localhost ~]``# cd /home/omd/.ssh/ 【普通用户就是在家目录下的.ssh目录】
3个集群都配置一次:
ssh-copy-id hadoop102,ssh-copy-id hadoop103,ssh-copy-id hadoop104,配置完成;
然后对hadoop103、hadoop104做同样操作;
或者也可以这样做:(推荐)
也可以把每一个账户的root账号进行同样的ssh免密配置,这里只对hadoop102的root做操作;(直接cd进入根目录,找到.ssh/目录操作)
现在再调用xsync,可以不用再输出密码;
集群配置
NameNode、SecondaryNameNode、ResourceManager不要安装再同一台服务器;
四个配置文件:
1、核心配置文件:core-site.xml;
配置前两个;
<!-- 指定NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop102:8020</value>
</property>
<!-- 指定hadoop数据的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.1.3/data</value>
</property>
2、HDFS配置文件:hdfs-site.xml;
<!-- nn web端访问地址 -->
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop102:9870</value>
</property>
<!-- 2nn wen端访问地址 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop104:9868</value>
</property>
9870和9868分别为两者以后的访问端口;
(9868一般不需要用,但是9870使用频率会很高,记住这个端口号)
3、Yarn配置文件
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>hadoop103</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>
4、MapReduce配置文件
mapred-site.xml;
<!-- 指定MapReduce -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
接下来把配置好的hadoop分发到hadoop103和hadoop104;
群起集群
1、配置workers
找到/opt/module/hadoop-3.1.3/etc/hadoop目录下的workers文件,添加内容:(作为主机名称)
hadoop102
hadoop103
hadoop104
注意:不能有空格和空行
2、启动集群
如果集群是第一次启动,需要在hadoop102节点格式化NameNode(注意:格式化NameNode,会产生新的集群id,NameNode和DataNode的id会不一致,集群找不到以往数据,会报错;所以需要格式化NameNode的话,一定要先停止namenode和datanode,并且删除所有机器的data和logs目录(再module/hadoop-3.1.3目录下,再进行格式化;
初始化:hdfs namenode -format,初始化后hadoop-3.1.3目录下多出data和logs文件夹;(data/dfs/name/current下可以看到镜像文件和Version,即当前版本的版本号)
启动集群:/opt/module/hadoop-3.1.3/sbin/目录下
启动 start-dfs.sh;
找到各自服务器的hadoop-3.1.3/jps目录下的文件是否与之前要配置NameNode、SecondaryNameNode和ResourceManager的位置一致;
如果其他文件创建失败,可能是权限不够导致的;
接下来在配置了ResourcrManager的节点(hadoop103)上启动Yarn;
sbin/start-yarn.sh;
此时我们可以得到两个web页面:
hadoop102:9870(Utilities—Browse Directory);hadoop103:8088(yarn资源调度监控网);
3、集群测试
1、上传文件
在hadoop-3.1.3目录下:
- 上传小文件:在Browse Directory中监控到上传的文件;
hadoop fs -mkdir /input 上传并建立一个目录
hadoop fs -put wcinput/word.txt /wcinput 上传本地文件到/wcinput中,如果接收目录不存在,会自动创建;
上传文件之后,可以下载;tail the file可以查看文件信息;
-
上传大文件:hadoop fs -put /opt/software/jdk-8u212-linux-x64.tar.gz
实际上这些数据只是在页面上展示,而不是存储在这里,实际存储在DataNode中,而DataNode的数据存储在hadoop-3.1.3/data目录下;
具体路径为:
/opt/module/hadoop-3.1.3/data/dfs/data/current/BP-1173909124-192.168.10.102-1616131443559/current/finalized/subdir0/subdir0;
2、拼接文件
如果涉及到解压型文件,可以用文件名 + >> +文件类型的形式来追加
比如:cat blk_1073741826>> tmp.tar.gz,cat blk_1073741826>> tmp.tar.gz就取出来了,解压之后就是之前上传的JDK文件;
3、执行一些程序(这个涉及到yarn的资源调度)
例子:执行一个wordcount程序
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /wcinput(集群模式下的计算 输入和输出结果都需要在集群的路径中) /wcoutput(观察9870端口的Browse Directory窗口的路径信息)
运行过程中观察yarn提供的网站(8088端口),发现有任务正在进行;
yarn的服务端口号是8032,即提交任务的端口是8032;
4、配置历史服务器
配置在mapred-site.xml文件中;
在原基础上加上:
<!-- 历史服务器地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop102:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop102:19888</value>
</property>
然后分发给其他服务器:xsync mapred-site.xml
重启一下yarn;
进入hadoop102 ,bin/mapred --daemon start historyserver;(mapred是命令 在bin目录下 daemon表示守护进程或者说是后台启动;historserver是历史服务器)
查看是否启动:jps(JobHistoryServer)
启动之后,可以在页面的History选项中查看历史状态,configuration中可以擦看历史参数状态;
5、集群异常/崩溃
比如不小心把三个服务器的某一data文件删了:
1:先kill进程;(停掉所有的集群)
2:删除所有服务器的data和logs;
3:进行初始化;
4:启动集群;
之所以要全部删除再初始化,是因为每一个DataNode和NameNode都有自己的ID,是唯一对应的,如果信息不全部删除,是无法匹配的;
6、日志聚集功能
好处:查看程序运行情况,方便开发调试;
概念:应用运行完成以后,将程序运行日志上传到HFDS系统上,所有服务器日志聚集到HFDS,用户可以直接查看;
注意:开启日志查看功能,需要重新启动NodeManager,ResourceManager,HistoryServer;
具体步骤:
进入hadoop102服务器的/etc/hadoop目录下;
配置yarn-site.xml
添加如下设置:
<!-- 开启日志聚集功能 -->
<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>
之后分发配置 xsync yarn-site.xml
前往hadoop102服务器关闭NodeManager,ResourceManager和HistoryServer:
mapred --daemon stop historyserver
前往hadoop103服务器hadoop-3.1.3目录下关闭yarn:
sbin/stop-yarn.sh
开启yarn:
sbin/start-yarn.sh
再次启动NodeManager,ResourceManager和HistoryServer:
mapred --daemon start historyserver
这样后续执行命令就会自动生成日志并保存;
可以进入hadoop102服务器的hadoop-3.1.3/目录下执行一个命令hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output2试试;
7、集群启动和停止方式总结:
各个模块分开启动/停止(配置ssh是前提)(常用)
整体启动/停止 HDFS
start-dfs.sh/stop-dfs.sh
整体启动/停止YARN
start-yarn.sh/stop-yarn.sh
各个服务逐一启动停止:
分别启动/停止HDFS组件:
hdfs --daemon start/stop namenode/datanode/secondarynamenode;
启动/停止YARN:
yarn --daemon start/stop resourcemanager/nodemanager;
部分信息总结
Hadoop集群启停脚本(包含HDFS,Yarn,Historyserver):
进入hadoop102根目录 cd /usr/local/bin----
vim myhadoop.sh;创建好之后先赋予权限,方便修改;
#!/bin/bash
if [ $# -lt 1 ]
then
echo "No Args Input..."
exit;
fi
case $1 in
"start")
echo "=============启动 hadoop集群 ============="
echo " --------------启动hdfs --------------"
ssh hadoop102 "/opt/module/hadoop-3.1.3/sbin/start-dfs.sh"
echo " --------------启动yarn --------------"
ssh hadoop103 "/opt/module/hadoop-3.1.3/sbin/start-yarn.sh"
echo "-------------- 启动historyserver --------------"
ssh hadoop104 "/opt/module/hadoop-3.1.3/bin/mapred --daemon start historyserver"
;;
"stop")
echo " ===========关闭 hadoop集群"
echo "------------关闭historyserver ----------------"
ssh hadoop102 "/opt/module/hadoop-3.1.3/bin/mapred --daemon stop historyserver"
echo "-------------关闭yarn ---------------------"
ssh hadoop103 "/opt/module/hadoop-3.1.3/sbin/stop-yarn.sh"
echo " ------------关闭hdfs --------------------"
ssh hadoop104 "/opt/module/hadoop-3.1.3/sbin/stop-dfs.sh"
;;
*)
echo "Input Args Error..."
;;
esac
myhadoop.sh start/stop控制启动和停止;
5.2、查看3台服务器的进程
进入hadoop102根目录 cd /usr/local/bin----
sudo vim jpsall:
#!/bin/bash
for host in hadoop102 hadoop103 hadoop104
do
echo =========== $host ============
ssh $host jps
done
jpsall直接启动即可;
然后利用xsync分发程序,记得开放其他服务器bin目录的权限
集群同步时间的坑
注意,这里最好不要去固定你的集群时间,让他自动连网同步即可,如果集群时间不一致:
下载ntpd服务,可以自行搜索;
先查看一下状态
systemctl status ntpd
再重启一下服务
sudo systemctl start ntpd
这里会涉及到后续hbase的启动问题,有时候hbase不能同时启动3个region server并不是其他问题,就是时间不一致导致的;
6、部分端口信息
hadoop3.x:
- HDFS NameNode 内部通讯接口:8020/9000/9820
- HDFS NameNode 对用户的查询接口:web端9870(服务端口号9820)
- Yarn查看任务运行情况:web端8088(服务端口号8032)
- 历史服务器: web端19888(不用直接进入,点击history选项进入)(服务端口号10020)
hadoop2.x:
- HDFS NameNode 内部通讯接口:8020/9000
- HDFS NameNode 对用户的查询接口:50070
- Yarn查看任务运行情况:8088
- 历史服务器 19888
2181:zookeeper的端口号:
2888:单个服务器与集群Leader服务器交换信息的端口号
3888:执行选举时服务器相互通信的端口号
6379:Redis的端口号
16010:HBASE的web端口号
16000:HBASE的服务端口号
8485:journalnode默认的端口号
9092:kafka的端口号
41414:flume监控的端口
更多推荐
所有评论(0)