学习链接:https://www.bilibili.com/video/BV1Qp4y1n7EN?p=26&spm_id_from=pageDriver
运行模式
官网:http://hadoop.apache.org/
Hadoop运行模式包括:本地模式、伪分布模式和完全分布式模式
在hadoop-3.1.3下面创建一个wcinput文件夹
mkdir wcinput
创建word.txt,里面写一些内容
[qtbhy@hadoop102 hadoop-3.1.3]$ cd wcinput/[qtbhy@hadoop102 wcinput]$ vim word.txt

回到Hadoop目录/opt/module/hadoop-3.1.3
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount wcinput/ ./wcoutput
按tab会有提示
./wcoutput:结果目录 执行之前不能存在查看结果
cat wcoutput/part-r-00000
完全分布式运行模式
1. scp(secure copy)安全拷贝
- scp可以实现服务器与服务器之间的数据拷贝
基本语法
scp -r $pdir/$fname $user@$host:$pdir/$fname
- scp:命令
- -r:递归
- $pdir/$fname:要拷贝的文件路径/名称
- $user@$host:$pdir/$fname:目的地用户@主机:目的地路径/名称
在hadoop102上把hadoop102的jdk拷贝到hadoop103上
[qtbhy@hadoop102 ~]$ scp -r /opt/module/jdk1.8.0_212 qtbhy@hadoop103:/opt/module

在hadoop103上把hadoop102的Hadoop拷贝到hadoop103上
[qtbhy@hadoop103 ~]$ scp -r qtbhy@hadoop102:/opt/module/hadoop-3.1.3 /opt/module/

在hadoop103上把hadoop102的hadoop和jdk都拷贝到hadoop104
scp -r qtbhy@hadoop102:/opt/module/* qtbhy@hadoop104:/opt/module/
2. rsync远程同步工具
rsync主要用于备份和镜像,速度快、避免复制相同内容、支持符号链接
- rsync和scp的区别:用rsync做文件的复制要比scp速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去。
基本语法
rsync -av $pdir/$fname $user@$host:$pdir/$fname
- rsync:命令
- -av:选项参数 -a,归档拷贝;-v,显示复制过程
- $pdir/$fname:要拷贝的文件路径/名称
- $user@$host:$pdir/$fname:目的地用户@主机:目的地路径/名称
在hadoop103上删除wcinput/ wcoutput/
rm -rf wcinput/ wcoutput/
在hadoop102上同步hadoop-3.1.3到hadoop103
rsync -av hadoop-3.1.3/ qtbhy@hadoop103:/opt/module/hadoop-3.1.3/
3. xsync集群分发脚本
需求:循环复制文件到所有节点的相同目录下
创建脚本
在/home/qtbhy目录下创建a.txt
touch a.txt
现在的环境变量:

因此在/home/qtbhy/bin路径下创建脚本
[qtbhy@hadoop102 ~]$ mkdir bin[qtbhy@hadoop102 ~]$ cd bin/
#!/bin/bash#1. 判断参数个数if [ $# -lt 1 ] # 判断参数个数($#)是否小于1thenecho Not Enough Arguement!exit;fi#2. 遍历集群所有机器for host in hadoop102 hadoop103 hadoop104doecho ==================== $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:$pdirelseecho $file does not exists!fidonedone
修改脚本xsync具有执行权限
[qtbhy@hadoop102 bin]$ chmod 777 xsync
测试
配置ssh
基本语法
ssh 另一台电脑的IP地址

返回到hadoop102

- 无密钥登录配置
- 免密登录原理

- 配置免密登录
查看所有文件
[qtbhy@hadoop103 ~]$ ls -al

在/home/qtbhy/.ssh目录下生成公钥和私钥
[qtbhy@hadoop102 .ssh]$ ssh-keygen -t rsa
生成了hadoop102的公钥和私钥

将公钥拷贝到要免密登录的目标机器上
[qtbhy@hadoop102 .ssh]$ ssh-copy-id hadoop103[qtbhy@hadoop102 .ssh]$ ssh-copy-id hadoop104[qtbhy@hadoop102 .ssh]$ ssh-copy-id hadoop105
同样配置其他机器相互间的免密登录,以上都是自建账号
以及在hadoop102上用root账号无密登录到hadoop102、hadoop103、hadoop104
[qtbhy@hadoop102 .ssh]$ su root[root@hadoop102 .ssh]# ssh-keygen -t rsa[root@hadoop102 .ssh]# ssh-copy-id hadoop102[root@hadoop102 .ssh]# ssh-copy-id hadoop103[root@hadoop102 .ssh]# ssh-copy-id hadoop104
- .ssh文件夹下的文件

| known_hosts | 记录ssh访问过计算机的公钥(public key) |
|---|---|
| id_rsa | 生成的私钥 |
| id_rsa.pub | 生成的公钥 |
| authorized_keys | 存放授权过的无密登录服务器公钥 |
集群配置
1. 集群部署规划
| hadoop102 | hadoop103 | hadoop104 | |
|---|---|---|---|
| HDFS | NameNode DataNode |
DataNode |
SecondaryNameNode DataNode |
| YARN | NodeManager |
ResourceManager NodeManager |
NodeManager |
- NameNode和SecondaryNameNode不要安装在同一台服务器,都很消耗内存
ResourceManager很消耗内存,不要和NameNode、SecondaryNameNode配置在同一台机器上
2. 配置文件说明
Hadoop配置文件分为两类:默认配置文件和自定义配置文件,用户想修改某一默认配置值时,才需要修改自定义配置文件,更改相应属性值。
默认配置文件
core-default.xml hadoop-common-3.1.3.jar/core-default.xml
- hdfs-default.xml hadoop-hdfs-3.1.3.jar/hdfs-default.xml
- yarn-default.xml hadoop-yarn-common-3.1.3.jar/yarn-default.xml
- mapred-default.xml hadoop-mapreduce-client-core-3.1.3.jar/mapred-default.xml
自定义配置文件
core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml四个配置文件存放在$HADOOP_HOME/etc/hadoop,根据需求修改配置常用的配置文件
- 3.x core-site.xml hdfs-site.xml yarn-site.xml mapred-site.xml workers
- 2.x core-site.xml hdfs-site.xml yarn-site.xml mapred-site.xml slaves
配置集群
- 核心配置文件
配置core-site.xml
[qtbhy@hadoop102 hadoop]$ vim core-site.xml
文件内容:
<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="configuration.xsl"?><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网页登录使用的静态用户为qtbhy --><property><name>hadoop.http.staticuser.user</name><value>qtbhy</value></property></configuration>

[qtbhy@hadoop102 ~]$ cd /opt/module/hadoop-3.1.3/[qtbhy@hadoop102 hadoop-3.1.3]$ cd etc/hadoop[qtbhy@hadoop102 hadoop]$ vim core-site.xml
<!-- 配置HDFS网页登录使用的静态用户为qtbhy --><property><name>hadoop.http.staticuser.user</name><value>qtbhy</value></property>
[qtbhy@hadoop102 hadoop]$ xsync core-site.xml[qtbhy@hadoop102 hadoop]$ myhadoop.sh stop[qtbhy@hadoop102 hadoop]$ myhadoop.sh start
- HDFD配置文件
配置hdfs-site.xml
[qtbhy@hadoop102 hadoop]$ vim hdfs-site.xml
文件内容:
<?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>hadoop102:9870</value></property><!-- 2nn web端访问地址--><property><name>dfs.namenode.secondary.http-address</name><value>hadoop104:9868</value></property></configuration>

- YARN配置文件
配置yarn-site.xml
[qtbhy@hadoop102 hadoop]$ vim yarn-site.xml
<?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>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
[qtbhy@hadoop102 hadoop]$ vim mapred-site.xml
<?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>

把配置好的Hadoop配置文件分发到集群
[qtbhy@hadoop102 etc]$ pwd/opt/module/hadoop-3.1.3/etc[qtbhy@hadoop102 etc]$ xsync hadoop/
hadoop103、hadoop104上配置文件已经改好了

配置workers
[qtbhy@hadoop102 hadoop-3.1.3]$ cd etc/hadoop[qtbhy@hadoop102 hadoop]$ vim workers
初始化 如果集群是第一次启动,需要在hadoop102节点格式化NameNode
格式化NameNode,会产生新的集群id,导致NameNode和DataNode的集群id不一致,集群找不到以往数据。
如果集群在运行过程中报错,需要重新格式化NameNode,一定要先停止namenode和datanode进程,并且要删除所有机器的data和logs目录,然后再进行格式化
[qtbhy@hadoop102 hadoop-3.1.3]$ hdfs namenode -format
执行完后会出现data、logs
在/opt/module/hadoop-3.1.3/data/dfs/name/current目录下
[qtbhy@hadoop102 current]$ vim VERSION
当前服务器版本号
- 启动HDFS
/opt/module/hadoop-3.1.3/sbin目录下的start-dfs.sh用于启动集群
[qtbhy@hadoop102 hadoop-3.1.3]$ sbin/start-dfs.sh

查看启动情况,是否与集群规划一致
[qtbhy@hadoop102 hadoop-3.1.3]$ jps[qtbhy@hadoop103 hadoop-3.1.3]$ jps[qtbhy@hadoop104 hadoop-3.1.3]$ jps



- Web端查看HDFS的NameNode
在hadoop103上启动YARN(hadoop103配置了ResourceManager)
[qtbhy@hadoop103 hadoop-3.1.3]$ sbin/start-yarn.sh

查看集群启动情况
[qtbhy@hadoop103 hadoop-3.1.3]$ jps



Web端查看YARN的ResourceManager
- 测试
- 上传文件到集群
- 上传小文件
- 上传文件到集群
(1)创建一个文件夹input
[qtbhy@hadoop102 hadoop-3.1.3]$ hadoop fs -mkdir /input

(2)把word.txt上传到/input文件夹
[qtbhy@hadoop102 hadoop-3.1.3]$ hadoop fs -put wcinput/word.txt /input

2. 上传大文件
[qtbhy@hadoop102 hadoop-3.1.3]$ hadoop fs -put /opt/software/jdk-8u212-linux-x64.tar.gz /

上传文件后查看文件存放在什么位置
[qtbhy@hadoop102 subdir0]$ pwd/opt/module/hadoop-3.1.3/data/dfs/data/current/BP-953109074-192.168.10.102-1651135420825/current/finalized/subdir0/subdir0
文件存储路径 /opt/module/hadoop-3.1.3/data/dfs/data/current/BP-953109074-192.168.10.102-1651135420825/current/finalized/subdir0/subdir0
查看HDFS在磁盘存储文件内容
[qtbhy@hadoop102 subdir0]$ cat blk_1073741825
\
(3)拼接[qtbhy@hadoop102 subdir0]$ cat blk_1073741826 >> tmp.tar.gz[qtbhy@hadoop102 subdir0]$ cat blk_1073741827 >> tmp.tar.gz

[qtbhy@hadoop102 subdir0]$ tar -zxvf tmp.tar.gz
解压之后就是上传的jdk压缩包
(4)在web端打开有三个副本



[qtbhy@hadoop102 hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output
集群崩溃处理
杀死进程
[qtbhy@hadoop102 hadoop-3.1.3]$ sbin/stop-dfs.sh
删除每一个节点上的data和logs

[qtbhy@hadoop102 hadoop-3.1.3]$ rm -rf data/ logs/[qtbhy@hadoop103 hadoop-3.1.3]$ rm -rf data/ logs/[qtbhy@hadoop104 hadoop-3.1.3]$ rm -rf data/ logs/
格式化
[qtbhy@hadoop102 hadoop-3.1.3]$ hdfs namenode -format
启动集群
[qtbhy@hadoop102 hadoop-3.1.3]$ sbin/start-dfs.sh
配置历史服务器
配置mapred-site.xml
[qtbhy@hadoop102 hadoop]$ vim mapred-site.xml
在该文件里面增加如下配置

分发配置
[qtbhy@hadoop102 hadoop]$ xsync mapred-site.xml
在hadoop102启动历史服务器
[qtbhy@hadoop102 hadoop-3.1.3]$ bin/mapred --daemon start historyserver
查看历史服务器是否启动

测试
准备数据
[qtbhy@hadoop102 hadoop-3.1.3]$ hadoop fs -mkdir /input[qtbhy@hadoop102 hadoop-3.1.3]$ hadoop fs -put wcinput/word.txt /input
运行
[qtbhy@hadoop102 hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output
查看JobHistory
访问:http://hadoop102:19888/jobhistory
配置日志的聚集
日志聚集概念:应用运行完成以后,将程序运行日志信息上传HDFS系统上。
开启日志聚集功能,需要重新启动NodeManager、ResourceManager和HistoryServer。
配置yarn-site.xml
[qtbhy@hadoop102 hadoop]$ vim 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>

分发配置
[qtbhy@hadoop102 hadoop]$ xsync yarn-site.xml
关闭NodeManager、ResourceManager和HistoryServer
[qtbhy@hadoop102 hadoop-3.1.3]$ mapred --daemon stop historyserver[qtbhy@hadoop102 hadoop-3.1.3]$ sbin/stop-yarn.sh
启动NodeManager、ResourceManager和HistoryServer ```shell [qtbhy@hadoop102 hadoop-3.1.3]$ sbin/start-yarn.sh [qtbhy@hadoop102 hadoop-3.1.3]$ mapred —daemon start historyserver
5. 执行WordCount程序```shell[qtbhy@hadoop102 hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output2
- 访问web端
访问:http://hadoop102:19888/jobhistory
运行日志详情:
集群启动/停止方式总结
1. 各个模块分开启动/停止
(1)整体启动/停止HDFS
start-dfs.sh/stop-dfs.sh
(2)整体启动/停止YARN
start-yarn.sh/stop-yarn.sh
2. 各个服务组件逐一启动/停止
(1)分别启动/停止HDFS组件
hdfs --daemon start/stop namenode/datanode/secondarynamenode
(2)启动/停止YARN
yarn --daemon start/stop resourcemanager/nodemanager
编写Hadoop集群常用脚本
- Hadoop集群启停脚本(包含HDFS,YARN,Historyserver):myhadoop.sh
在/home/qtbhy/bin目录下创建myhadoop.sh脚本
[qtbhy@hadoop102 bin]$ vim myhadoop.sh
在文件中写入:
#!/bin/bashif [ $# -lt 1 ]thenecho "No Args Input..."exit ;ficase $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
赋予脚本执行权限
[qtbhy@hadoop102 bin]$ chmod 777 myhadoop.sh
测试

- 查看三台服务器Java进程脚本:jpsall
在/home/qtbhy/bin目录下创建jpsall脚本
[qtbhy@hadoop102 bin]$ vim jpsall
写入如下内容:
#!/bin/bashfor host in hadoop102 hadoop103 hadoop104doecho =============== $host ===============ssh $host jpsdone
赋予脚本执行权限
[qtbhy@hadoop102 bin]$ chmod 777 jpsall
测试:
- 分发脚本
[qtbhy@hadoop102 ~]$ xsync bin/
常用端口号
| | 端口名称 | Hadoop 2.x | Hadoop 3.x | | —- | —- | —- | —- | | HDFS | NameNode内部通信端口 | 8020/9000 | 8020/9000/9820 | | | NameNode HTTP UI
(对用户的查询端口) | 50070 | 9870 | | YARN | MapReduce查看执行任务端口 | 8088 | 8088 | | | 历史服务器通信端口 | 19888 | 19888 |
集群时间同步
如果服务器在公网环境(能连接外网),可以不采用集群时间同步,因为服务器会定期和公网时间进行校准;
如果服务器在内网环境,必须要配置集群时间同步,否则时间久了,会产生时间偏差,导致集群执行任务时间不同步。
- 需求
找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时的同步,生产环境根据任务对时间的准确程度要求周期同步。测试环境为了尽快看到效果,采用1分钟同步一次。
时间服务器配置(用root用户)
查看所有节点ntpd服务状态和开机自启动状态
[qtbhy@hadoop102 ~]$ sudo systemctl status ntpd[qtbhy@hadoop102 ~]$ sudo systemctl start ntpd[qtbhy@hadoop102 ~]$ sudo systemctl is-enabled ntpd
修改hadoop102的ntp.conf配置文件
[qtbhy@hadoop102 ~]$ sudo vim /etc/ntp.conf
修改内容如下
修改1(授权192.168.10.0-192.168.10.255网段上的所有机器可以从这台机器上查询和同步时间)
#restrict 192.168.10.0 mask 255.255.255.0 nomodify notrap为restrict 192.168.10.0 mask 255.255.255.0 nomodify notrap
修改2(集群在局域网中,不使用其他互联网上的时间)
server 0.centos.pool.ntp.org iburstserver 1.centos.pool.ntp.org iburstserver 2.centos.pool.ntp.org iburstserver 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
添加3
当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群中的其他节点提供时间同步
server 127.127.1.0fudge 127.127.1.0 stratum 10
修改hadoop102的/etc/sysconfig/ntpd
[qtbhy@hadoop102 ~]$ sudo vim /etc/sysconfig/ntpd
增加内容如下(让硬件时间与系统时间一起同步)
SYNC_HWCLOCK=yes
重新启动ntpd服务
[qtbhy@hadoop102 ~]$ sudo systemctl start ntpd
设置ntpd服务开机启动
[qtbhy@hadoop102 ~]$ sudo systemctl enable ntpd
- 其他机器配置(root用户)
(1)关闭所有节点上ntp服务和自启动
[qtbhy@hadoop103 ~]$ sudo systemctl stop ntpd[qtbhy@hadoop103 ~]$ sudo systemctl disable ntpd[qtbhy@hadoop104 ~]$ sudo systemctl stop ntpd[qtbhy@hadoop104 ~]$ sudo systemctl disable ntpd
(2)在其他机器配置1分钟与时间服务器同步一次
[qtbhy@hadoop103 ~]$ sudo crontab -e
编写定时任务如下:
*/1 * * * * /usr/sbin/ntpdate hadoop102
(3)修改任意机器时间
[qtbhy@hadoop103 ~]$ sudo date -s "2021-9-11 11:11:11"
(4)1分钟后查看机器是否与时间服务器同步
[qtbhy@hadoop103 ~]$ sudo date
[qtbhy@hadoop102 ~]$ cd /opt/module/hadoop-3.1.3/[qtbhy@hadoop102 hadoop-3.1.3]$ cd etc/hadoop[qtbhy@hadoop102 hadoop]$ vim core-site.xml
<!-- 配置HDFS网页登录使用的静态用户为qtbhy --><property><name>hadoop.http.staticuser.user</name><value>qtbhy</value></property>
[qtbhy@hadoop102 hadoop]$ xsync core-site.xml
[qtbhy@hadoop102 hadoop]$ myhadoop.sh stop
[qtbhy@hadoop102 hadoop]$ myhadoop.sh start







