Hadoop集群
安装前准备
安装虚拟机
-
配置网络
-
关闭防火墙
systemctl stop firewalld systemctl disable firewalld.service
-
创建用户
[root@hadoop102 hadoop]# useradd hadoop [root@hadoop102 hadoop]# passwd hadoop
-
配置hadoop 用户具有 root 权限,方便后期加 sudo 执行 root 权限的命令
[root@hadoop102 hadoop]# vi /etc/sudoers
修改/etc/sudoers 文件,在%wheel 这行下面添加一行,如下所示:
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
hadoop ALL=(ALL) NOPASSWD:ALL
-
在/opt 目录下创建文件夹,并修改所属主和所属组
(1)在/opt 目录下创建 module、software 文件夹
[root@hadoop102 ~]# mkdir /opt/module [root@hadoop102 ~]# mkdir /opt/software
(2)修改 module、software 文件夹的所有者和所属组均为 hadoop 用户
[root@hadoop102 ~]# chown hadoop:hadoop /opt/module [root@hadoop102 ~]# chown hadoop:hadoop /opt/software
(3)查看 module、software 文件夹的所有者和所属组
[root@hadoop102 ~]# cd /opt/ [root@hadoop102 opt]# ll
-
重启虚拟机
[root@hadoop102 ~]# reboot
克隆虚拟机
1)利用模板机hadoop102,克隆2台虚拟机: hadoop103 hadoop104
2)修改克隆机静态IP
[root@hadoop103 ~]# vi /etc/sysconfig/network-scripts/ifcfg-en0s3
3)修改主机名称
[root@hadoop103 ~]# vi /etc/hostname
hadoop103
4)配置 Linux 克隆机主机名称映射 hosts 文件,打开/etc/hosts
[root@hadoop103 ~]# vi /etc/hosts
添加如下内容
192.168.56.102 hadoop102
192.168.56.103 hadoop103
192.168.56.104 hadoop104
5) reboot重启虚拟机
安装JDK
SecureCRT 上传使用
- 安装lrzsz
yum -y install lrzsz
- 上传完成之后解压
[hadoop@hadoop102 software]# ls
jdk-8u212-linux-x64.tar.gz
[hadoop@hadoop102 software]# tar -zxvf jdk-8u212-linux-x64.tar.gz -C /opt/module/
-
配置 JDK 环境变量
(1)新建/etc/profile.d/my_env.sh 文件
[hadoop@hadoop102 ~]$ sudo vim /etc/profile.d/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
(2)保存后退出
(3)source 一下/etc/profile 文件,让新的环境变量 PATH 生效
[hadoop@hadoop102 ~]$ source /etc/profile
-
测试 JDK 是否安装成功
[hadoop@hadoop102 module]$ java -version java version "1.8.0_212" Java(TM) SE Runtime Environment (build 1.8.0_212-b10) Java HotSpot(TM) 64-Bit Server VM (build 25.212-b10, mixed mode)
安装HADOOP
-
文件传输工具将 hadoop-3.1.3.tar.gz 导入到 opt 目录下面的 software 文件夹下面
-
进入到 Hadoop 安装包路径下
[hadoop@hadoop102 ~]$ cd /opt/software/
-
解压安装文件到/opt/module 下面
[hadoop@hadoop102 software]$ tar -zxvf hadoop-3.1.3.tar.gz -C /opt/module/
-
查看是否解压成功
[hadoop@hadoop102 software]$ ls /opt/module/hadoop-3.1.3
-
将 Hadoop 添加到环境变量
(1)获取 Hadoop 安装路径
[hadoop@hadoop102 hadoop-3.1.3]$ pwd /opt/module/hadoop-3.1.3
(2)打开/etc/profile.d/my_env.sh 文件
[hadoop@hadoop102 hadoop-3.1.3]$ sudo vi /etc/profile.d/my_env.sh
➢ 在 my_env.sh 文件末尾添加如下内容:(shift+g)
#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
➢ 保存并退出: :wq
(3)让修改后的文件生效
[hadoop@hadoop102 hadoop-3.1.3]$ source /etc/profile
-
测试是否安装成功
[hadoop@hadoop102 hadoop-3.1.3]$ hadoop version Hadoop 3.1.3
-
重启(如果 Hadoop 命令不能用再重启虚拟机)
[hadoop@hadoop102 hadoop-3.1.3]$ sudo reboot
Hadoop目录结构
[hadoop@hadoop102 hadoop-3.1.3]$ ll
总用量 176
drwxr-xr-x. 2 hadoop hadoop 183 9月 12 2019 bin
drwxr-xr-x. 3 hadoop hadoop 20 9月 12 2019 etc
drwxr-xr-x. 2 hadoop hadoop 106 9月 12 2019 include
drwxr-xr-x. 3 hadoop hadoop 20 9月 12 2019 lib
drwxr-xr-x. 4 hadoop hadoop 288 9月 12 2019 libexec
-rw-rw-r--. 1 hadoop hadoop 147145 9月 4 2019 LICENSE.txt
-rw-rw-r--. 1 hadoop hadoop 21867 9月 4 2019 NOTICE.txt
-rw-rw-r--. 1 hadoop hadoop 1366 9月 4 2019 README.txt
drwxr-xr-x. 3 hadoop hadoop 4096 9月 12 2019 sbin
drwxr-xr-x. 4 hadoop hadoop 31 9月 12 2019 share
重要目录
(1)bin 目录:存放对 Hadoop 相关服务(hdfs,yarn,mapred)进行操作的脚本
(2)etc 目录:Hadoop 的配置文件目录,存放 Hadoop 的配置文件
(3)lib 目录:存放 Hadoop 的本地库(对数据进行压缩解压缩功能)
(4)sbin 目录:存放启动或停止 Hadoop 相关服务的脚本
(5)share 目录:存放 Hadoop 的依赖 jar 包、文档、和官方案例
完全分布式运行模式
配置3台服务器免密登录
(1)生成公钥和私钥
[hadoop@hadoop102 .ssh]$ pwd
/home/hadoop/.ssh
[hadoop@hadoop102 .ssh]$ ssh-keygen -t rsa
然后敲(三个回车),就会生成两个文件 id_rsa(私钥)、id_rsa.pub(公钥)
(2)将公钥拷贝到要免密登录的目标机器上
[hadoop@hadoop102 .ssh]$ ssh-copy-id hadoop102
[hadoop@hadoop102 .ssh]$ ssh-copy-id hadoop103
[hadoop@hadoop102 .ssh]$ ssh-copy-id hadoop104
注意:
还需要在 hadoop103 上采用 hadoop 账号配置一下无密登录到 hadoop102、hadoop103、
hadoop104 服务器上。
还需要在 hadoop104 上采用 hadoop 账号配置一下无密登录到 hadoop102、hadoop103、
hadoop104 服务器上。
还需要在 hadoop102 上采用 root 账号,配置一下无密登录到 hadoop102、hadoop103、
hadoop104; su
编写集群分发脚本 xsync 用于分发同步资源
(1)安装 rsync
yum install -y rsync
(2) 脚本如下
#!/bin/bash
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
for host in hadoop102 hadoop103 hadoop104
do
echo ==================== $host ====================
for file in $@
do
if [ -e $file ]
then
pdir=$(cd -P $(dirname $file); pwd)
fname=$(basename $file)
ssh $host "mkdir -p $pdir"
rsync -av $pdir/$fname $host:$pdir
else
echo $file does not exists!
fi
done
done
(3) 配置环境变量 ,以便全局调用
[hadoop@hadoop102 bin]$ vi /etc/profile.d/my_env.sh
[hadoop@hadoop102 bin]$ source /etc/profile
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IyNKVEcP-1629430164931)(/Users/liuhui/Library/Application Support/typora-user-images/image-20210819171243338.png)]
(4)修改脚本 xsync 具有执行权限
[hadoop@hadoop102 bin]$ chmod +x xsync
(5)利用脚本同步hadoop 和 java 到hadoop103,hadoop104上去
[hadoop@hadoop102 ~]$ sudo ./bin/xsync /opt/module/
#查看已经分发传送成功
[hadoop@hadoop104 root]$ ls /opt/module/
hadoop-3.1.3 jdk1.8.0_212
(6)利用脚本同步环境变量到 hadoop103,hadoop104上去
[hadoop@hadoop102 ~]$ sudo ./bin/xsync /etc/profile.d/my_env.sh
==================== hadoop102 ====================
sending incremental file list
sent 48 bytes received 12 bytes 120.00 bytes/sec
total size is 219 speedup is 3.65
==================== hadoop103 ====================
sending incremental file list
my_env.sh
sent 314 bytes received 35 bytes 232.67 bytes/sec
total size is 219 speedup is 0.63
==================== hadoop104 ====================
sending incremental file list
my_env.sh
sent 314 bytes received 35 bytes 698.00 bytes/sec
total size is 219 speedup is 0.63
让环境变量生效
[hadoop@hadoop104 ~]$ source /etc/profile
[hadoop@hadoop103 ~]$ source /etc/profile
集群配置
集群部署规划
➢ NameNode 和 SecondaryNameNode 不要安装在同一台服务器
➢ ResourceManager 也很消耗内存,不要和 NameNode、SecondaryNameNode 配置在
同一台机器上。
Hadoop102 | Hadoop103 | Hadoop104 | |
---|---|---|---|
HDFS | NameNode DataNode | DataNode | SecondaryNameNode DataNode |
YARN | NodeManager | ResourceManager NodeManager | NodeManager |
配置集群
核心配置文件
配置 core-site.xml
[hadoop@hadoop102 ~]$ cd $HADOOP_HOME/etc/hadoop
[hadoop@hadoop102 hadoop]$ ls
capacity-scheduler.xml kms-log4j.properties
configuration.xsl kms-site.xml
container-executor.cfg log4j.properties
core-site.xml mapred-env.cmd
hadoop-env.cmd mapred-env.sh
hadoop-env.sh mapred-queues.xml.template
hadoop-metrics2.properties mapred-site.xml
hadoop-policy.xml shellprofile.d
hadoop-user-functions.sh.example ssl-client.xml.example
hdfs-site.xml ssl-server.xml.example
httpfs-env.sh user_ec_policies.xml.template
httpfs-log4j.properties workers
httpfs-signature.secret yarn-env.cmd
httpfs-site.xml yarn-env.sh
kms-acls.xml yarnservice-log4j.properties
kms-env.sh yarn-site.xml
[root@hadoop102 hadoop]# vi core-site.xml
<configuration>
<!-- 指定 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>
<!-- 配置 HDFS 网页登录使用的静态用户为 hadoop -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>hadoop</value>
</property>
</configuration>
HDFS配置文件
配置 hdfs-site.xml
[hadoop@hadoop102 hadoop]$ vi hdfs-site.xml
<!--文件内容如下:-->
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->
<!-- Put site-specific property overrides in this file. -->
<configuration>
<!-- nn web 端访问地址-->
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop102:9870</value>
</property>
<!-- 2nn web 端访问地址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop104:9868</value>
</property>
</configuration>
YARN 配置文件
配置 yarn-site.xml
[hadoop@hadoop102 hadoop]$ vi yarn-site.xml
文件内容如下:
<configuration>
<!-- Site specific YARN configuration properties -->
<!-- 指定 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>
</configuration>
MapReduce 配置文件
配置 mapred-site.xml
[hadoop@hadoop102 hadoop]$ vi mapred-site.xml
文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定 MapReduce 程序运行在 Yarn 上 -->
<configuration>
<!-- 指定 MapReduce 程序运行在 Yarn 上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
</configuration>
在集群上分发配置好的 Hadoop 配置文件
[hadoop@hadoop102 hadoop]$ xsync /opt/module/hadoop-3.1.3/etc/hadoop/
==================== hadoop102 ====================
sending incremental file list
sent 889 bytes received 18 bytes 604.67 bytes/sec
total size is 107,603 speedup is 118.64
==================== hadoop103 ====================
sending incremental file list
hadoop/
hadoop/core-site.xml
hadoop/hdfs-site.xml
hadoop/mapred-site.xml
hadoop/yarn-site.xml
sent 3,337 bytes received 139 bytes 6,952.00 bytes/sec
total size is 107,603 speedup is 30.96
==================== hadoop104 ====================
sending incremental file list
hadoop/
hadoop/core-site.xml
hadoop/hdfs-site.xml
hadoop/mapred-site.xml
hadoop/yarn-site.xml
sent 3,337 bytes received 139 bytes 6,952.00 bytes/sec
total size is 107,603 speedup is 30.96
群起集群
配置workers
[hadoop@hadoop102 hadoop]$ vi /opt/module/hadoop-3.1.3/etc/hadoop/workers
在该文件中增加如下内容:如果有其他内容就删除,比如localhost
hadoop102
hadoop103
hadoop104
注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行。
同步所有节点配置文件
[hadoop@hadoop102 hadoop]$ xsync /opt/module/hadoop-3.1.3/etc
启动集群
(1)如果集群是第一次启动,需要在 hadoop102 节点格式化 NameNode(注意:格式
化 NameNode,会产生新的集群 id,导致 NameNode 和 DataNode 的集群 id 不一致,集群找
不到已往数据。如果集群在运行过程中报错,需要重新格式化 NameNode 的话,一定要先停
止 namenode 和 datanode 进程,并且要删除所有机器的 data 和 logs 目录,然后再进行格式
化。)
[hadoop@hadoop102 hadoop-3.1.3]$ hdfs namenode -format
(2)启动 HDFS
[hadoop@hadoop102 hadoop-3.1.3]$ sbin/start-dfs.sh
(3)在配置了 ResourceManager 的节点(hadoop103)启动 YARN
[hadoop@hadoop103 hadoop-3.1.3]$ sbin/start-yarn.sh
(4)Web 端查看 HDFS 的 NameNode
(a)浏览器中输入:http://hadoop102:9870
(b)查看 HDFS 上存储的数据信息
(5)Web 端查看 YARN 的 ResourceManager
(a)浏览器中输入:http://hadoop103:8088
(b)查看 YARN 上运行的 Job 信息
配置历史服务器
为了查看程序的历史运行情况,需要配置一下历史服务器。
配置 mapred-site.xml
[hadoop@hadoop102 hadoop]$ vi mapred-site.xml
在该文件里面增加如下配置。
<configuration>
<!-- 指定 MapReduce 程序运行在 Yarn 上 -->
<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>
</configuration>
分发配置
[hadoop@hadoop102 hadoop]$ xsync $HADOOP_HOME/etc/hadoop/mapred-site.xml
==================== hadoop102 ====================
sending incremental file list
sent 70 bytes received 12 bytes 164.00 bytes/sec
total size is 1,182 speedup is 14.41
==================== hadoop103 ====================
sending incremental file list
mapred-site.xml
sent 603 bytes received 47 bytes 1,300.00 bytes/sec
total size is 1,182 speedup is 1.82
==================== hadoop104 ====================
sending incremental file list
mapred-site.xml
sent 603 bytes received 47 bytes 433.33 bytes/sec
total size is 1,182 speedup is 1.82
[hadoop@hadoop102 hadoop]$
在 hadop102 启动历史服务器
[hadoop@hadoop102 hadoop]$ mapred --daemon start historyserver
[hadoop@hadoop102 hadoop]$ jps
7104 NodeManager
7473 JobHistoryServer
6724 NameNode
7530 Jps
3179 DataNode
查看 JobHistory
http://hadoop102:19888/jobhistory
配置日志的聚集
应用运行完成以后,将程序运行日志信息上传到 HDFS 系统上。
可以方便的查看到程序运行详情,方便开发调试。
注意:开启日志聚集功能,需要重新启动 NodeManager 、ResourceManager 和HistoryServer。
开启日志聚集功能具体步骤如下:
-
配置 yarn-site.xml
[hadoop@hadoop102 hadoop]$ vi 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>
-
分发配置
[hadoop@hadoop102 hadoop]$ xsync $HADOOP_HOME/etc/hadoop/yarn-site.xml ==================== hadoop102 ==================== sending incremental file list sent 66 bytes received 12 bytes 52.00 bytes/sec total size is 1,642 speedup is 21.05 ==================== hadoop103 ==================== sending incremental file list yarn-site.xml sent 1,059 bytes received 47 bytes 2,212.00 bytes/sec total size is 1,642 speedup is 1.48 ==================== hadoop104 ==================== sending incremental file list yarn-site.xml sent 1,059 bytes received 47 bytes 2,212.00 bytes/sec total size is 1,642 speedup is 1.48 [hadoop@hadoop102 hadoop]$
-
关闭 NodeManager 、ResourceManager 和 HistoryServer
[hadoop@hadoop103 hadoop-3.1.3]$ sbin/stop-yarn.sh [hadoop@hadoop103 hadoop-3.1.3]$ mapred --daemon stop historyserver
-
****启动 NodeManager 、ResourceManage 和 HistoryServer
[hadoop@hadoop103 ~]$ start-yarn.sh [hadoop@hadoop102 ~]$ mapred --daemon start historyserver
-
查看日志
历史服务器地址
http://hadoop102:19888/jobhistory
集群启动停止方式总结
各个模块分开启动/停止(配置 ssh 是前提)常用
(1)整体启动/停止 HDFS
start-dfs.sh/stop-dfs.sh
(2)整体启动/停止 YARN
start-yarn.sh/stop-yarn.sh
各个服务组件逐一启动/停止
(1)分别启动/停止 HDFS 组件
hdfs --daemon start/stop namenode/datanode/secondarynamenode
(2)启动/停止 YARN
yarn --daemon start/stop resourcemanager/nodemanager
编写 Hadoop 集群常用脚本
- Hadoop 集群启停脚本(包含 HDFS,Yarn,Historyserver):myhadoop.sh
[hadoop@hadoop102 ~]$ cd /home/hadoop/bin
[hadoop@hadoop102 bin]$ vi 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 hadoop102 "/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 hadoop102 "/opt/module/hadoop-3.1.3/sbin/stop-dfs.sh"
;;
*)
echo "Input Args Error..."
;;
esac
保存后退出,然后赋予脚本执行权限
[hadoop@hadoop102 bin]$ chmod +x myhadoop.sh
[hadoop@hadoop102 bin]$
- 查看三台服务器 Java 进程脚本:jpsall
[hadoop@hadoop102 bin]$ cd /home/hadoop/bin/
[hadoop@hadoop102 bin]$ vi jpsall
脚本内容如下
#!/bin/bash
for host in hadoop102 hadoop103 hadoop104
do
echo =============== $host ===============
ssh $host jps
done
保存后退出,然后赋予脚本执行权限
[hadoop@hadoop102 bin]$ chmod +x jpsall
分发/home/hadoop/bin目录,保证自定义脚本在三台机器上都可以使用
[hadoop@hadoop102 ~]$ xsync /home/hadoop/bin/