一文让你彻底烂熟于心, 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 -verisionhadoop -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客户端节点

 
 
                    
                













 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号