准备虚拟机及基本环境
网络配置
先确认自己的网络情况,我这里是网关和dns:192.168.93.2
设置为静态ip:192.168.93.102
重启network服务
systemctl restart network
可通过ip addr
查看网络情况。打开浏览器确认网络可用。
安装插件
1 2
| sudo yum install -y epel-release net-tools vim sudo yum install -y psmisc nc rsync lrzsz ntp libzstd openssl-static tree iotop git
|
关闭防火墙
这里是统一采用外部防火墙,本身不开。可参看阿里云的规则组,阿里云也是默认关闭防火墙的。
1 2
| systemctl stop firewalld systemctl disable firewalld
|
如果之前使用的root,新建账号bunny
1 2
| useradd bunny passwd bunny
|
配置免密提权
1 2 3 4
| sudo visudo # 在root ALL=(ALL) ALL下面添加如下内容 bunny ALL=(ALL) NOPASSWD:ALL
|
创建软件安装目录
修改目录的所属主和所属组为bunny
1 2
| cd /opt chown bunny:bunny bunny
|
修改主机名:h102
修改hosts文件
1 2 3 4 5 6 7 8 9 10 11 12
| sudo vi /etc/hosts
# 添加如下内容 192.168.93.100 h100 192.168.93.101 h101 192.168.93.102 h102 192.168.93.103 h103 192.168.93.104 h104 192.168.93.105 h105 192.168.93.106 h106 192.168.93.107 h107 192.168.93.108 h108
|
重启生效。
卸载自带的jdk
1 2 3 4 5 6
| # 查询已安装的jdk rpm -qa | grep java # 卸载查询到的jdk sudo rpm -e --nodeps java-1.8.0-openjdk-headless-1.8.0.332.b09-1.el7_9.x86_64 sudo rpm -e --nodeps java-1.8.0-openjdk-1.8.0.332.b09-1.el7_9.x86_64
|
安装hadoop
将安装包传到系统,包含jdk和Hadoop
jdk安装
1 2 3 4 5 6 7 8 9 10 11 12
| # 解压 tar -zxvf jdk-8u212-linux-x64.tar.gz -C /opt/bunny/ # 配置环境变量 sudo vi /etc/profile.d/bunny.sh
# 添加内容 #JAVA_HOME export JAVA_HOME=/opt/bunny/jdk1.8.0_212 export PATH=$PATH:$JAVA_HOME/bin
# 让新的环境变量PATH生效 source /etc/profile
|
Hadoop安装
下载地址:https://archive.apache.org/dist/hadoop/common/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| # 解压 tar -zxvf hadoop-3.1.3.tar.gz -C /opt/bunny/
# 配置环境变量 sudo vi /etc/profile.d/bunny.sh
# 添加内容 #HADOOP_HOME export HADOOP_HOME=/opt/bunny/hadoop-3.1.3 export PATH=$PATH:$HADOOP_HOME/bin export PATH=$PATH:$HADOOP_HOME/sbin
# 让新的环境变量PATH生效 source /etc/profile
|
复制虚拟机及地址规划
可以复制粘贴整个虚拟机文件夹,手工复制的需要改网卡mac(虚拟机导入-编辑设置-选择网卡-高级-mac生成),修改虚拟机名字。
(收费用户可以使用复制克隆功能)
进入系统修改ip地址和计算机名(参看前面操作)。
分发脚本
在/home/bunny/bin目录下创建xsync文件
1 2 3 4
| cd /home/bunny mkdir bin cd bin vi xsync
|
添加内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| #!/bin/bash
#1. 判断参数个数 if [ $# -lt 1 ] then echo "Not Enough Arguement!" exit fi
#2. 遍历集群所有机器 for host in h102 h103 h104 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
|
修改脚本 xsync 具有执行权限
chmod +x xsync
同步脚本
由于没有配置免密登录,需要逐一确认、输入密码。
免密登录
在每一台机器都要执行,这里只以h102为例
1 2 3 4 5 6 7 8
| # 生成公钥和私钥 ssh-keygen -t rsa
# 3个回车后生成成功,然后将公钥拷贝到要免密登录的目标机器上(包括自己) ssh-copy-id h102 ssh-copy-id h103 ssh-copy-id h104
|
集群配置
Hadoop配置文件分两类:默认配置文件和自定义配置文件,只有用户想修改某一默认配置值时,才需要修改自定义配置文件,更改相应属性值。
自定义配置文件: core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml四个配置文件存放在$HADOOP_HOME/etc/hadoop这个路径上,用户可以根据项目需求重新进行修改配置。
我们这里集群配置需要自定义配置文件:
1
| vi /opt/bunny/hadoop-3.1.3/etc/hadoop/core-site.xml
|
core-site.xml内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration> <!-- 指定NameNode的地址 --> <property> <name>fs.defaultFS</name> <value>hdfs://h102:8020</value> </property>
<!-- 指定hadoop数据的存储目录 --> <property> <name>hadoop.tmp.dir</name> <value>/opt/bunny/hadoop-3.1.3/data</value> </property>
<!-- 配置HDFS网页登录使用的静态用户为bunny --> <property> <name>hadoop.http.staticuser.user</name> <value>bunny</value> </property> </configuration>
|
1
| vi /opt/bunny/hadoop-3.1.3/etc/hadoop/hdfs-site.xml
|
hdfs-site.xml内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration> <!-- nn web端访问地址--> <property> <name>dfs.namenode.http-address</name> <value>h102:9870</value> </property> <!-- 2nn web端访问地址--> <property> <name>dfs.namenode.secondary.http-address</name> <value>h104:9868</value> </property> </configuration>
|
1
| vi /opt/bunny/hadoop-3.1.3/etc/hadoop/yarn-site.xml
|
yarn-site.xml内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration> <!-- 指定MR走shuffle --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property>
<!-- 指定ResourceManager的地址--> <property> <name>yarn.resourcemanager.hostname</name> <value>h103</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> </configuration>
|
1
| vi /opt/bunny/hadoop-3.1.3/etc/hadoop/mapred-site.xml
|
mapred-site.xml内容:
1 2 3 4 5 6 7 8 9 10 11
| <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration> <!-- 指定MapReduce程序运行在Yarn上 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
|
分发配置文件
1
| xsync /opt/bunny/hadoop-3.1.3/etc/hadoop/
|
配置workers
1 2 3 4 5 6 7
| vi /opt/bunny/hadoop-3.1.3/etc/hadoop/workers
# 添加如下3行内容,结尾无空格 h102 h103 h104
|
同步文件
1
| xsync /opt/bunny/hadoop-3.1.3/etc
|
启动集群
如果集群是第一次启动,需要在h102节点格式化NameNode(格式化NameNode,会产生新的集群id,导致NameNode和DataNode的集群id不一致,集群找不到已往数据。如果集群在运行过程中报错,需要重新格式化NameNode的话,一定要先停止namenode和datanode进程,并且要删除所有机器的data和logs目录,然后再进行格式化。)
hdfs namenode -format
启动HDFS(相同目录有关闭脚本)
1
| /opt/bunny/hadoop-3.1.3/sbin/start-dfs.sh
|
在配置了ResourceManager的节点(h103)启动YARN(相同目录有关闭脚本)
/opt/bunny/hadoop-3.1.3/sbin/start-yarn.sh
分别启动/停止HDFS组件
hdfs --daemon start/stop namenode/datanode/secondarynamenode
启动/停止YARN
yarn --daemon start/stop resourcemanager/nodemanager
Hadoop集群常用脚本
Hadoop集群启停脚本
启停脚本(包含HDFS,Yarn,Historyserver):bunnyhadoop.sh
1 2
| cd /home/bunny/bin vi bunnyhadoop.sh
|
编辑内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| #!/bin/bash
if [ $# -lt 1 ] then echo "No Args Input..." exit ; fi
case $1 in "start") echo " ===========启动 hadoop集群 ========" echo " --------------- 启动 hdfs ---------------" ssh h102 "/opt/bunny/hadoop-3.1.3/sbin/start-dfs.sh" echo " --------------- 启动 yarn ---------------" ssh h103 "/opt/bunny/hadoop-3.1.3/sbin/start-yarn.sh" ;; "stop") echo " ==========关闭 hadoop集群 =========" echo " --------------- 关闭 yarn ---------------" ssh h103 "/opt/bunny/hadoop-3.1.3/sbin/stop-yarn.sh" echo " --------------- 关闭 hdfs ---------------" ssh h102 "/opt/bunny/hadoop-3.1.3/sbin/stop-dfs.sh" ;; *) echo "Input Args Error..." ;; esac
|
赋予脚本执行权限
chmod +x bunnyhadoop.sh
查看三台服务器Java进程脚本:jpsall
1 2
| cd /home/bunny/bin vi jpsall
|
输入如下内容
1 2 3 4 5 6 7
| #!/bin/bash
for host in h102 h103 h104 do echo =============== $host =============== ssh $host jps done
|
保存后退出,然后赋予脚本执行权限
chmod +x jpsall
同步脚本和查看地址
Web端查看HDFS的NameNode
http://192.168.93.102:9870
Web端查看YARN的ResourceManager
http://192.168.93.103:8088
配置历史服务器
配置mapred-site.xml
1
| vi /opt/bunny/hadoop-3.1.3/etc/hadoop/mapred-site.xml
|
添加内容
1 2 3 4 5 6 7 8 9 10 11
| <!-- 历史服务器端地址 --> <property> <name>mapreduce.jobhistory.address</name> <value>h102:10020</value> </property>
<!-- 历史服务器web端地址 --> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>h102:19888</value> </property>
|
分发配置
1
| xsync $HADOOP_HOME/etc/hadoop/mapred-site.xml
|
在h102启动历史服务器
mapred --daemon start historyserver
查看历史服务器是否启动
jps
查看JobHistory
http://192.168.93.102:19888/jobhistory
日志的聚集
集群时间同步
常见问题