一文让你彻底烂熟于心, Hadoop完全分布式集群的安装部署 1
文章目录
- 一,前置知识
- 二,集群的结构
- 三,集群内主机名称和ip映射的配置情况
- 四, 集群部署详细步骤 (十个步骤)
- 附录一, Hadoop集群部署中常用的端口号和配置文件
- 附录二, Hadoop客户端节点
- 附录三, 在搭建集群时经常遇到的问题及其解决办法
一,前置知识
Hadoop: 适合海量数据
分布式计算
(多台计算机并行处理数据)和分布式存储
hadoop的版本:
原生版:Apache-hadoop
发行版:CDH,HDP
-
Hadoop核心架构的发展历史
- MapReduce: 分布式计算(负责海量数据的分布计算)
- HDFS(Hadoop Distributed File System): 分布式文件系统(负责
海量
数据的存储) - YARN: 集群资源的管理和调度
二,集群的结构
本文中Hadoop集群中主要含一台主节点(bigdata01)和两个从节点(bigdata02, bigdata03)。
三,集群内主机名称和ip映射的配置情况
主机Hostname | 静态ip |
---|---|
bigdata01 | 192.168.182.100 |
bigdata02 | 192.168.182.101 |
bigdata03 | 192.168.182.102 |
添加主机映射的方法
四, 集群部署详细步骤 (十个步骤)
1️⃣,集群内主从节点都要一一进行配置
的基本步骤
注: 包括的设置选项有, 静态IP, 主机名, IP地址-主机名的映射, 关闭防火墙, 安装JDK和Hadoop并配置相应的环境变量
这里以bigdata01为例, (这一小节(4.1), 主从节点的配置方法是一样的, 但是bigdata02, 和 bigdata03两台从主机的静态ip, 和host映射要改成第三节表格中的形式噢!)
一. 配置静态IP
- 首先cd跳转到网络配置文件所在的目录:
cd /etc/sysconfig/network-scripts
由于centos版本的不同,此处网络配置文件名称会有所不同,此处为
ifcfg-en016777736
(centos 7.0),还可能为ens-33
(centos 7.3)
- 然后用vim修改网络配置如下:
BOOTPROTO=static 意思为静态ip模式
另外,注意此处ip前三位应与虚拟机所在的子网保持一致
windows网络适配器Vmnet8中的默认网关和DNS服务器同样跟上面所配置的网关和DNS保持一致;
同时也要注意,虚拟机的NAT设置中的网关
与外部系统(windows系统)网络适配器中的网关,DNS
保持一致
二.设置Hostname , 添加IP地址-主机名的映射
vi /etc/hostname
添加主机映射的方法
三. 关闭防火墙
在企业开发时,通常单个服务器的防火墙时关闭的。公司整体对外会设置非常安全的防火墙
systeamctl status firewalld----查看防火墙状态
systemctl stop firewalld----暂时关闭防火墙
systemctl disable firewalld----关闭防火墙服务
关闭防火墙后的状态:
四. 安装JDK,Hadoop以及配置相应的环境变量
(0). 删除centos自带的openJDK
[root@bigdata01]# rpm -qa | grep -i java
java-1.6.0-openjdk-1.6.0.0-1.7.b09.el5
java-1.4.2-gcj-compat-1.4.2.0-40jpp.115
[root@bigdata01]# rpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-1.7.b09.el5
[root@bigdata01l]# rpm -e --nodeps java-1.4.2-gcj-compat-1.4.2.0-40jpp.115
[root@bigdata01]# java -version
-bash: /usr/bin/java: No such file or directory
我们也可以利用下面的这行命令一键删除OpenJDK
(1).下载Jdk1.8和Hadoop-3.2.0
Oracle下载 jdk-8u281-linux-x64.tar.gz
Apache下载 Hadoop-3.2.0.tar.gz
(2). 因为在工作中, 我们不一定有root用户的权限, 所以在以后的栗子中, 我们使用普通用户名win10
完成所有的操作.
- 而为了能够正常使用系统级命令(通过sudo 暂时获取root权限), 我们需要做以下的设置:
-通过vi /etc/soduers
打开sudoers文件, 使用vim的搜索功能搜索/wheel
, 在 %wheel这一行下面添加新的一行, 如下图框中所示:
注意: win10 这一行不要直接放在root行下面, 因为所有用户都属于wheel组(如果我们发现普通用户不在wheel组该怎么办呢? 让root用户把他加入wheel组即可, 如下图所示),
- 当你配置了 wi10用户具有免密功能并放在了上图所示的 root行下面时,
- 在程序执行到 %wheel 行时, 该功能又被覆盖回需要密码, 所以 win10 要放到 %wheel这行下面.
- 借助
usermod -G wheel 用户名
把win10加入wheel组.
(3). 在/opt
目录中创建 module
和 software
目录,并确保目录的所有用户名和所属组均为win10
, 然后`解压jdk, hadoop的压缩包和hadoop到/module目录中,并改名以方便引用
##解压jdk,hadoop安装包并改名
tar -zxvf jdk-8u281-linux-x64.tar.gz -C /opt/module
tar -zxvf hadoop-3.2.0 -C /opt/module
mv jdk-8u281-linux-x64.tar jdk1.8
(3). 通过vi /etc/profile
配置jdk,hadoop的环境变量:
exprot JAVA_HOME=/data/soft/jdk1.8
export HADOOP_HOME=/data/soft/hadoop-3.2.0
exprot PATH=.:$JAVA_HOME/bin:$HADOOP_HOME/sbin:$HADOOP_HOME/bin:$PATH
- 注: 强烈推荐环境变量采用下面的写法, 方便记忆:
# JAVA_HOME configuration
export JAVA_HOME=/opt/module/jdk1.8
export PATH=$PATH:$JAVA_HOME/bin
####java编译器路径
export CLASSPATH=$CLASSPATH:$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JRE_HOME=${JAVA_HOME}/jre
# HADOOP_HOME configuration
export HADOOP_HOME=/opt/module/hadoop-3.1.3
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
(4). 使用 source /etc/profile
使刚修改的环境变量生效
对hadoop配置环境变量主要是方便使用其安装目录
sbin
或是bin
目录下的脚本。
另外注意,另外两台子节点主机无需全部手动配置环境变量,只要解压的路径一致,只需通过
scp命令
复制 bigdata01的/etc/profile.d/my_env.sh
文件到bigdata02与bigdata03即可!(当然, 我们还是在后面直接克隆其他节点的主机比较省事儿, 这一段话可直接略过)
(5) 检查安装是否成功
检查java以及hadoop安装是否成功的方法:
java -version
,javac -verision
hadoop -version
, 版本号一致则说明安装成功。
也可以通过echo $PATH
查看路径是否一致
[注意!]
到此, 主从结点都要进行的配置阶段完成, 如果此时主节点这一台主机已经完成以上的配置操作了, 而我们又不想再重复配置剩下的从节点, 我们可以通过克隆虚拟机的方式, 来得到从节点, 但是要注意:
从节点中的
静态IP地址
,主机名
,IP地址-主机名映射
,防火墙
一定要进行相应的修改哦!
★ 强烈推荐: 配置环境变量的另一种方法: 使用 /etc/profile.d/
2️⃣, 配置Hadoop集群
Hadoop安装目录的结构
五. SSH的免密登录以及不同节点主机之间的文件同步方法(必会)
由于本文使用的是普通用户win10
, 所以在实现免密登录方法一的时候, 注意.ssh
目录是位于路径在 /home/win10/
目录下, 切记注意!!!
要注意的是: 我们在使用集群分发脚本去同步root用户所属的环境变量my_env.sh
的时候, 要利用sudo进行提权操作, 上面参见的文章中是直接使用的root用户, 所以没有必要使用sudo, 但是本文中, 使用的是普通用户win10
, 所以需要.
- 另外, 在使用sudo之后, 我们的分发脚本必须带上完整的路径(绝对路径), 详见下面的解释:
参考链接 sudo /opt/etc/profile.d/my_env.sh
- 最终的执行结果如下:
六, 集群配置
1. 集群部署规划
注意:
- NameNode 和 SecondaryNameNode 不要安装在同一台服务器
- ResourceManager 也很消耗内存, 不要和NameNode, SecondaryNameNode 配置在同一台服务器上.
-
集群规划如下:
2. 配置集群(修改hadoop配置文件)
对Hadoop配置文件的说明:
Hadoop 配置文件分两类: 默认配置文件和自定义配置文件
- 只有用户想修改某一默认配置值时, 才需要修改自定义配置文件, 更改相应的属性值;
- 默认配置文件相当于一个模版, 一个参考, 里面有所有提供的属性property及其说明, 当我们添加或修改自定义配置文件时, 可以先查看默认配置文件搞清楚要添加或修改的属性的含义, 再去编写自定义配置文件(注意自定义配置文件初始情况下是空的)
- 默认配置文件:
要获取的默认文件 | 文件存放在Hadoop的jar包中的位置 |
---|---|
[core-default.xml] | hadoop-coomon-3.2.0.jar/core-default.xml |
[hdfs-default.xml] | hadoop-hdfs-3.2.0.jar/hdfs-default.xml |
[yarn-default.xml] | hadoop-yarn-common-3.2.0.jar/yarn-default.xml |
[mapred-default.xml] | hadoop-mapreduce-client-core-3.2.0.jar/mapred-default.xml |
- 自定义配置文件
core-site.xml,hdfs-site.xml, mapred-site.xml, yarn-site.xml
四个配置文件存放在 $HADOOP_HOME/etc/haoop路径
上, 用户可以根据项目需求重新进行修改配置;
需要修改的hadoop配置文件 |
---|
core-site.xml |
hdfs-site.xml |
mapred-site.xml |
yarn-site.xml |
workers |
注意: core-site.xml, hdfs-site.xml, yarn-site.xml, mapred-site.xml 四个配置文件放在$HADOOP_HOME/etc/hadoop 这个路径上. 用户可以根据项目需求重新进行修改配置;
(0). hadoop配置文件的路径
(1). 核心配置文件(修改core-site.xml)
注意: fs.defaultFS的主机名需要和主节点(master)名保持一致
(2). HDFS 配置文件 (修改hdfs-site.xml)
(3). YARN 配置文件 (修改yarn-site.xml)
注意下图的一个小错误:
aux-services 少了个s,
马虎的我害
(5). MapReduce 配置文件 (修改mapred-site.xml)
(6). 分发本节点的配置文件到其余节点上
- 检验其他节点的分发情况:
cat /opt/module/hadoop-3.1.3/etc/hadoop/core-site.xml
七, 群起集群
1. 修改workers
什么是workers? 在hadoop 3.x以前这个文件叫 slaves(对, 现在3.x以后他改名叫workers了), 但是作用还是一样的, 即workers(saves)
由主机的列表组成,每台1行,用于说明数据节点(DataNode)。
这个文件供NameNode
在集群执行和结束的时候进行读取.注意: workers中, 主机名后面不允许出现空格, 每个主机名之间不允许出现空行.
(1). 修改(添加存储数据的结点DataNodes)
(2). 分发workers到其他节点进行同步:
2. 集群的开启, 验证, 关闭.
非常重要的一点说明:
- 如果是集群是第一次启动, 需要在bigdata01(NameNode所在节点)格式化NameNode,
- 注意:
格式化NameNode, 会产生新的集群id
, 导致NameNode和DataNode的集群id 不一致, 集群找不到以往的数据. ———>所以如果集群在运行过程中报错(我们可以选择格式化), 在重新格式化NameNode 的时候, 一定要:- 先停止 NameNode 和 DataNode进程.
- 再删除所有节点机器的 data 和 logs目录
- 最后再进行格式化
(0) 格式化NameNode
hdfs namenode -format
没有报错就说明已经格式化成功了.
(1) 启动DFS
start-dfs.sh
经验证, 此命令可在主节点, 从节点任意位置处执行, 整个hdfs相关的NN, 2NN, DN都会相应的启动
(2) 启动YARN: 要在配置了 ResourceManager
的节点(bigdata02) 上
start-yarn.sh
注意!!! , yarn相关的启动和停止命令必须在
ResourceManager
所在的节点才能正常运作
(3) 验证集群: jps
以及 Web端
查看 HDFS的NameNode
, YARN的ResourceManager
- 使用
jps
查看节点上相应的进程启动情况, 正常情况下应该与 6.1小节中集群部署规划的进程相同;
- WEB端查看HDFS的 NameNodes (设置在bigdata01主机上, 开放的是9870端口)
- 键入 bigdata01: 9870即可访问
- WEB端查看YARN的ResourceManager(设置在bigdata02主机上, 默认开放的是8088端口)
- 键入bigdata02:8088即可访问
(4). 测试集群功能
- 文件的上传
- 上传小文件, 大文件
- Web端查看
- 上传小文件, 大文件
- 文件在节点上的存储位置
-这是小文件poem.txt
- 对于大文件, 可能会被分割存储, 我们可以拼接起来进行查看
- 对于大文件, 可能会被分割存储, 我们可以拼接起来进行查看
-
文件的下载
hdfs dfs -get /dfs上的目录路径 /下载目的地路径
- 执行WordCount程序
- 可能出现的错误及其解决办法:
-
分配给容器的内存超过规定值
—->hadoop Container [] is running 255195648B beyond the ‘VIRTUAL‘ memory limit -
yarn-site.zml
中yarn.nodemanager.aux-services
中services
写成了service
—->org.apache.hadoop.yarn.exceptions.InvalidAuxServiceException: The auxService: mapreduce_shuffle do
-
- 可能出现的错误及其解决办法:
(5). 关闭集群
#3. 提高效率:(把集群的开启/关闭, 验证集群编写到脚本中)
3.1 集群的启动/停止方式
各个模块(hdfs, yarn)分开停止或启动
-
整体启动/停止 HDFS模块
start-dfs.sh / stop-dfs.sh
-
整体启动/停止 YARN模块
start-yarn.sh/ stop-yarn.sh
各个服务组件(namenode, datanode等)逐一启动/停止
-
单个启动/停止 HFDS模块的组件
hdfs --daemon start/stop namenode/datanode/secondarynamenode
-
单个启动/停止YARN模块的组件
yarn --daemon start/stop nodemanager/resourcemanager
3.2 Hadoop集群一键启动/停机脚本
(HDFS, YARN, HistoryServer的启动和停止): myHadoop.sh
➢ 编写myHadoop.sh脚本如下
#!/bin/bash
if [ $# -lt 1 ]
then
echo "No Args Input..."
exit ;
fi
case $1 in
"start")
echo " =================== 启动 hadoop 集群 ==================="
echo " --------------- 启动 hdfs ---------------"
ssh bigdata01 "/opt/module/hadoop-3.1.3/sbin/start-dfs.sh"
echo " --------------- 启动 yarn ---------------"
ssh bigdata02 "/opt/module/hadoop-3.1.3/sbin/start-yarn.sh"
echo " --------------- 启动 historyserver ---------------"
ssh bigdata01 "/opt/module/hadoop-3.1.3/bin/mapred --daemon start historyserver"
;;
"stop")
echo " =================== 关闭 hadoop 集群 ==================="
echo " --------------- 关闭 historyserver ---------------"
ssh bigdata01 "/opt/module/hadoop-3.1.3/bin/mapred --daemon stop historyserver"
echo " --------------- 关闭 yarn ---------------"
ssh bigdata02 "/opt/module/hadoop-3.1.3/sbin/stop-yarn.sh"
echo " --------------- 关闭 hdfs ---------------"
ssh bigdata01 "/opt/module/hadoop-3.1.3/sbin/stop-dfs.sh"
;;
*)
echo "Input Args Error..."
;;
esac
➢ 保存后退出,然后赋予脚本执行权限
chmod +x myhadoop.sh
- 运行
- 如果想要全局运行的话, 可以把脚本路径作为环境变量添加到
/etc/profile.d/my_env.sh
或etc/profile
中去, 当然, 一定不要忘了source /etc/profile
- 如果在别的节点机器上也想运行的话, 老样子,
xsync myhadoop.sh
进行分发即可.
3.3 Hadoop集群一键验证集群进程脚本
(jps 所有节点的整合): jpsall.sh
➢ 输入如下内容
#!/bin/bash
for host in bigdata01 bigdata02 bigdata03
echo =============== $host ===============
ssh $host jps
done
➢ 保存后退出,然后赋予脚本执行权限
chmod +x jpsall.sh
➢ 1. 全局运行, 添加环境变量; 2. 其他节点运行, 分发此脚本
#4., 集群崩溃的处理方法
1、停掉所有进程(NameNode和DataNode所有进程)
2、删除每台机器hadoop-3.1.3下的data和logs
3、在NameNode
配置机器上格式化:hdfs namenode -format
4、重新启动集群
八, 配置历史服务器
hadoop jobhistory记录下
已运行完的MapReduce作业信息
并存放在指定的HDFS目录下,默认情况下是没有启动的,需要配置完后手工启动服务。
- 配置步骤如下:
1. 配置 mapred-site.xml 并分发同步
- 在hadoop的安装目录下
/etc/hadoop
中输入vi mapred-site.xml
, 添加下列的配置, 这里我们把历史服务器运行在bigdata01主机,
并提供19888端口
给WEB端访问
- 分发到其他的节点上,
xsync mapred-site.xml
.
2. 在配置的节点上启动历史服务器, 并验证是否启动成功
- 在配置了历史服务器的节点上(此处为 bigdata01) 输入
mapred --daemon start historyserver
, 启动历史服务器 - 输入
jps
, 查看 JobHistoryServer 进程是否存在
3. 执行官方的WordCount示例, 然后查看 JobHistory
- 在hadoop安装目录内输入
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examplies-3.1.3.jar wordcount /input/wc.txt /output1
- 查看历史服务器: bigdata01:19888
- 检验wordcount执行后的结果(HDFS web端(bigdata01:9870)查看输出目录的part文件)
九, 配置日志的聚集
- 日志聚集: 集群上的应用运行完成之后, 将程序运行日志信息上传到HDFS系统上.
- 通过日志聚集功能, 我们可以很方便的查看到程序的运行情况, 方便开发调试.
注意: 开启日志聚集功能, 需要重新启动
NodeManager, ResourceManager 和 historyServer
- 配置步骤如下:
1. 配置 yarn-site.xml 并分发同步
- 在hadoop安装目录下配置
vi 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://bigdata01:19888/jobhistoryserver/logs</value>
</property>
<!-- 设置日志的保留时间为7天-->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
- 分发
2. 如果集群正在运行, 重启ResourceManager, NodeManager 和 HistoryServer
- 在上面的操作中, 我们在
bigdata01
上配置的historyserver
, 在bigdata02
上配置的resourceManager
, 所以相应进程的停止和启动也应该在各自的主机上.
3. 执行一些操作(WordCount), 以便产生日志
- 把第九步的Worcount示例重新执行一次即可(注意要删除已经生成了的输出目录)
- 在hadoop安装目录内输入
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examplies-3.1.3.jar wordcount /input/wc.txt /output1
4. 查看日志
十, 集群各节点之前的时间同步(主要用于实际工作, 虚拟机集群不需要)
如果服务器在公网环境(能连接外网),可以不采用集群时间同步,因为服务器会定期
和公网时间进行校准;
如果服务器在内网环境,必须要配置集群时间同步,否则时间久了,会产生时间偏差,
导致集群执行任务时间不同步
1. 需求分析
找一台主机作为时间服务器, 集群中所有其他的主机与这台主机定时进行时间同步, 生产环境根据任务对时间的准确程度要求周期性同步. 在这里, 我们为了尽快看到效果, 采用一分钟更新一次.
2. 时间服务器的配置
(1)查看所有节点 ntpd 服务状态和开机自启动状态
[atguigu@hadoop102 ~]$ sudo systemctl status ntpd
[atguigu@hadoop102 ~]$ sudo systemctl start ntpd
[atguigu@hadoop102 ~]$ sudo systemctl is-enabled ntpd
(2)修改 hadoop102 的 ntp.conf
配置文件
[atguigu@hadoop102 ~]$ sudo vim /etc/ntp.conf
修改内容如下
- (a)修改 1(授权 192.168.10.0-192.168.10.255 网段上的所有机器可以从这台机器上查
询和同步时间)
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
改为
restrict 192.168.182.0 mask 255.255.255.0 nomodify notrap
- (b)修改 2(集群在局域网中,不使用其他互联网上的时间)
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst
为
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
- (c)添加 3 ( 当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群中
的其他节点提供时间同步 )
server 127.127.1.0
fudge 127.127.1.0 stratum 10
(3)修改 hadoop102 的/etc/sysconfig/ntpd
文件
[atguigu@hadoop102 ~]$ sudo vim /etc/sysconfig/ntpd
增加内容如下(让硬件时间与系统时间一起同步)
SYNC_HWCLOCK=yes
(4)重新启动 ntpd 服务
[atguigu@hadoop102 ~]$ sudo systemctl start ntpd
(5)设置 ntpd 服务开机启动
[atguigu@hadoop102 ~]$ sudo systemctl enable ntpd
3. 其他机器配置(必须 root 用户)
(1)关闭所有节点上 ntp 服务和自启动
[atguigu@hadoop103 ~]$ sudo systemctl stop ntpd
[atguigu@hadoop103 ~]$ sudo systemctl disable ntpd
[atguigu@hadoop104 ~]$ sudo systemctl stop ntpd
[atguigu@hadoop104 ~]$ sudo systemctl disable ntpd
(2)在其他机器配置 1 分钟与时间服务器同步一次
[atguigu@hadoop103 ~]$ sudo crontab -e
编写定时任务如下:
*/1 * * * * /usr/sbin/ntpdate hadoop102
(3)修改任意机器时间
[atguigu@hadoop103 ~]$ sudo date -s "2021-9-11 11:11:11"
(4)1 分钟后查看机器是否与时间服务器同步
[atguigu@hadoop103 ~]$ sudo date
-
至此,集群全部搭建完毕
附录一, Hadoop集群部署中常用的端口号和配置文件
附录二, Hadoop客户端节点