hadoop优化
# Hadoop优化
## 案例、天气预报
> 随机生成温度代码
```java
package com.shujia.weather;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class RandomWeather {
public static void main(String[] args) throws ParseException {
//创建日期格式
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
long start = sdf.parse("2000-01-01 00:00:00").getTime();
long end = sdf.parse("2022-12-31 00:00:00").getTime();
long difference = end - start;
for (int i = 0; i < 10000; i++) {
//随机生成时间2000-2023
Date date = new Date(start + (long) (Math.random() * difference));
//随机生成一个温度
int temperature = -20 + (int) (Math.random() * 60);
//打印生成的结果
System.out.println(sdf.format(date) + "\t" + temperature);
}
}
}
```
需求:查询某一年,某一月的最高的温度
## 优化1:Combiner
> 使用之前

> 使用之后

> 减少的了reduce 从map拉取数据的过程,提高计算效率。
>
> hadoop 的计算特点:**将计算任务向数据靠拢,而不是将数据向计算靠拢。**
>
> 特点:数据本地化,减少网络io。
>
> 首先需要知道,hadoop数据本地化是指的map任务,reduce任务并不具备数据本地化特征。
> 通常输入的数据首先在**逻辑上**(**注意这里不是真正物理上划分**)将会分片split,每个分片上构建一个map任务,由该任务执行执行用户自定义的map函数,从而处理分片中的每条记录。
> 那么切片的大小一般是趋向一个HDFS的block块的大小。为什么最佳的分片大小是趋向block块的大小呢?是因为这样能够确保单节点上最大输入块的大小,如果分片跨越两个数据块,没有一个block能够同时存储这两块数据,因此需要通过网络传输将部分数据传输到map任务节点上。这样明显比使用本地数据的map效率更低。
> 注意,map任务执行后的结果并没有写到HDFS中,而是作为中间结果存储到本地硬盘,那为什么没有存储到HDFS呢?因为,该中间结果会被reduce处理后产生最终结果后,该中间数据会被删除,如果存储到HDFS中,他会进行备份,这样明显没有意义。如果map将中间结果传输到reduce过程中出现了错误,Hadoop会在另一个节点上重新执行map产生中间结果。
> 那么为什么reduce没有数据本地化的特点呢?对于单个reduce任务来说,他的输入通常是所有mapper经过排序输出,这些输出通过网络传输到reduce节点,数据在reduce节点合并然后由reduce函数进行处理。最终结果输出到HDFS上。当多个有reduce任务的时候,map会针对输出进行分区partition,也就是为每个reduce构建一个分区,分区是由用户指定的partition函数,效率很高。
> 同时为了高效传输可以指定combiner函数,他的作用就是,**减少网络传输和本地传输**
>
> combine操作只适合等幂操作
>
>
>
> 假设文件是500mb
>
>
>
> long bytesRemaining = length; 500mb
>
> while (((double) bytesRemaining)/splitSize > SPLIT_SLOP) {
>
> int blkIndex = getBlockIndex(blkLocations, length-bytesRemaining );
>
> splits.add(makeSplit(path, length-bytesRemaining 256 , splitSize 128,
>
> blkLocations[blkIndex].getHosts(),
>
> blkLocations[blkIndex].getCachedHosts()));
>
> bytesRemaining = bytesRemaining-splitSize;116
>
> }
>
> **注意:将reduce端的聚合操作,放到map 进行执行。适合求和,计数,等一些等幂操作。不适合求平均值,次幂等类似操作**
## 优化2:Join(数据倾斜)
> MapReduce中的join
>
> 其实就是类似于关系型数据库中的连接查询一样。需要计算的数据可能存储在不同的文件中或不同表中,两个文件又有一些相同的字段可以相互关联,这时候我们就可以通过这些关联字段将两个文件中的数据组合到一起进行计算了。
>
> 我知道的mr有三种join方式。Map join、SemiJoin、reduce join。
>
> Reduce Join(我们之前做的代码连接就是这个方式)
>
> 思路:
>
> 分为两个阶段
>
> (1)map函数主要是对不同文件中的数据打标签。
>
> (2)reduce函数获取key相同的value list,进行笛卡尔积。
>
> Map Join思路:
>
> 比如有两个表,有一个表非常大,而另一个表非常小,以至于小表可以直接存放到内存中。这样,我们可以将小表复制多份,让每个map task内存中保存一个hash map,将小表数据放入这个hash map中,key是小表与大表的内个连接字段,value是小表一条记录,然后只扫描大表:对于大表中的每一条记录key/value,在hash map中查找是否有相同的key的记录,如果有,则连接输出即可。
>
> **Semi Join 这个SemiJoin其实就是对reduce join的一种优化。**
>
> 就是在map端过滤掉不参加join操作的数据,则可以大大减少数据量,提高网络传输速度。
>
> 这三种join方式适用于不同的场景:
>
> Reduce join要考虑数据量过大时的网络传输问题。
>
> Map join和SemiJoin则要考虑数据量过大时的内存问题。 如果只考虑网络传输,忽略内存问题则。
>
> Map join效率最高,其次是SemiJoin,最低的是reduce join。
>
> DistributedCache DistributedCache是Hadoop提供的文件缓存工具,它能够自动将指定的文件分发到各个节点上,缓存到本地,供用户程序读取使用。一般用户数据字典的分发,和map join使用。一般缓存的文件都是只读。
## 优化3:根据实际情况调整切片大小
> **为什么默认切片是128MB和blk大小一致?(优化)**
>
> 1 切片大小默认一致,是为了数据本地化,减少数据拉取消耗网络io
>
> 2 并不是越大越好,也不是越小越好。根据集群的资源情况而定。
>
> 当集群计算资源充足的情况下:将切片的大小调小,增加map数量,提高读取效率。
>
> 当集群计算资源紧张的情况下:将切片的大小调大,减少资源占用,让任务正常运转。
>
> mapred.min.split.size、mapred.max.split.size、blockSize
## 优化4:可以设置yarn资源和队列。
> mr运行日志信息:百分比是按照完成的m或r的任务的个数/m或r的总个数。
>
> MRv1/MRv2/YARN MRv1:
>
> 对于经典的MRv1它由三部分组成 :
>
> 编程模型、 数据处理引擎和运行时环境。
>
> 编程模型由新旧 API 两部分组成,新旧api只是代码封装上略有变化,性能没变化。
>
> 数据处理引擎由 MapTask 和 ReduceTask 组成。 运行时环境由 JobTracker 和 TaskTracker 两类服务组成。
>
> MRv2:
>
> 由于MRv1对JobTracker的功能过多造成负载过重在扩展性、 资源利用率和多框架支持等方面存在不足,因此MRv2框架 的基本设计思想是将MRv1中的JobTracker包含的资源管理和应用管理两部分功能进行拆分,分别交给两个进程实现。 资源管理进程与具体应用程序无关,它负责整个集群的资源管理(内存、 CPU、 磁盘)。 应用管理进程负责管理应用程序,并且每个应用管理进程只管理一个作业。 由于资源管理可以共享给其他框架使用,因此MRv2将其做成了一个通用的系统YARN,YARN系统使得MRv2计算框架在可扩展性,资源利用率,多框架支持方面得到了很大改进。
>
> YARN:yarn由4部分组成。
>
> 1. ResourceManager主要功能是:
>
> (1)接收用户请求
>
> (2)管理调度资源
>
> (3)启动管理am
>
> (4)管理所有nm,处理nm的状态汇报,向nm下达命令。
>
> 2.Container:yarn的应用都是运行在容器上的,容器包含cpu,内存等信息。
>
> 3.NodeManager:NM是每个节点上的资源和任务管理器,它会定时地向RM汇报本节点上的资源使用情况和各个容器的运行状态;同时负责对容器的启动和停止。
>
> 4. ApplicationMaster:管理应用程序。向RM获取资源、为应用程序分配任务、 监控所有任务运行状态。
>
> 1. 作业提交
>
> 首先我们将任务提交给JobClient,JobClient会向RM获取一个appId。 然后我们的JobClient会对作业进行处理, 切分InputSplit, 将作业的Jar包, 配置文件和拷贝InputSplit信息拷贝到HDFS。 最后, 通过调用RM的submitApplication()来提交作业。
>
> 2. 作业初始化
>
> 当RM收到submitApplciation()的请求时, 就将该请求发给调度器, 调度器分配第一个容器, 然后RM在该容器内启动ApplicationMaster进程。该进程上运行着一个MRAppMaster的Java应用。其通过创造一些bookkeeping对象来监控作业的进度。 然后通过hdfs得到由JobClient已经处理好的作业信息。为每个Inputsplit创建一个map任务, 并创建相应的reduce任务。然后ApplicationMaster会对整个作业量进行判断,**如果作业量很小, ApplicationMaster会选择在其自己的JVM中运行任务**, **这种作业称作是uber task的方式**。在任务运行之前, 作业的**setup**方法被调用来创建输出路径。
>
> 3. 任务分配
>
> 如果不是小作业, 那么ApplicationMaster向RM请求更多的容器来运行所有的map和reduce任务,**每个容器只能对应一个任务**。这些请求是通过心跳来传输的, 包括每个map任务的数据位置, 比如Inputsplit的主机名和机架。调度器利用这些信息来调度任务, 尽量将任务分配给有存储数据的节点, 或者分配给和存放Inputsplit的节点相同机架的节点。
>
> 4. 任务运行
>
> 当一个任务由RM的调度器分配了一个容器后, ApplicationMaster与NM通信来启动容器。任务由一个为YarnChild的Java应用执行。在运行任务之前首先本地化任务需要的资源, 比如作业配置, JAR文件, 以及hdfs中保存的任务所需的所有文件。最后, map任务或者reduce运行在一个叫YarnChild的进程当中。
>
> 5. 进度和状态更新
>
> 每个NM会向applicationmaster汇报自己的工作状态,JobClient会每秒轮询检测applicationmaster,这样就能随时收到更新信息。
>
> 6. 作业完成
>
> 除了向applicationmaster请求作业进度外, JobClient每5分钟都会通过调用waitForCompletion()来检查作业是否完成。作业完成之后,applicationmaster和NM会清理工作状态, OutputCommiter的作业清理方法也会被调用. 作业的信息会被作业历史服务器存储以备之后用户核查.
>
> **yarn对异常task的处理(推测执行)?(重要!!!)**
>
> 推测执行是在分布式环境下,因为某种原因造成同一个job的多个task运行速度不一致,有的task运行速度明显慢于其他task,则这些task拖慢了整个job的执行进度,为了避免这种情况发生,Hadoop会为该task启动备份任务,让该speculative task与原始task同时处理一份数据,哪个先运行完,则将谁的结果作为最终结果。推测执行优化机制采用了**典型的以空间换时间的优化策略**,它同时启动多个相同task(备份任务)处理相同的数据块,哪个完成的早,则采用哪个task的结果,这样可防止拖后腿Task任务出现,进而提高作业计算速度,但是,这样却会占用更多的资源。
>
> **yarn调度器的策略?(重要!!!)**
>
> yarn默认是计算能力调度 FifoScheduler:根据先进先出排队,最简单的调度器。 FIFO
>
> CapacityScheduler(计算能力调度)、FairScheduler(公平调度):
>
> 相同点:
>
> (1)都是队列。
>
> (2)都有资源最大最小上线限制。
>
> (3)都是资源共享,每个队列剩余的资源可以给其他队列使用。
>
> 不同点:
>
> (1)队列排序算法不同:计算能力调度资源使用量小的优先。公平调度根据公平排序算法排序。
>
> (2)应该用选择算法不同:计算能力调度是先进先出。公平调度先进先出或者公平排序算法。
>
> (3)资源抢占:公平调度如果当前队列有新应用提交后,会把共享出去的资源抢夺回来。
### 1、构建基础虚拟机
#### 1.1 更换yum为清华源
**写在前面 ,若最小化安装,安装基础插件**
```yum install -y net-toolsyum install -y vim```
更换
```shell# 一个教室一堆阿里云,不如换清华源,同理可以反过来# 官方教程 https://mirrors.tuna.tsinghua.edu.cn/help/centos/# 备份cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
# 切换清华源sudo sed -e 's|^mirrorlist=|#mirrorlist=|g' \ -e 's|^#baseurl=http://mirror.centos.org|baseurl=https://mirrors.tuna.tsinghua.edu.cn|g' \ -i.bak \ /etc/yum.repos.d/CentOS-*.repo
# 创建缓存yum clean allyum makecache```
#### 1.2 关闭防火墙
**关闭防火墙原因 开放端口,若管理得当,可只开放端口**
```shell# 关闭防火墙systemctl stop firewalld# 开机不自启systemctl disable firewalld.service```
#### 1.3 关闭可视化界面
```shell# 关闭 切换图像graphical.targetsystemctl set-default multi-user.target```
#### 1.4 创建用户
```shell# 可在一开始创建,也可命令创建 useradd laypasswd 123456
# 切换root权限不需要输入密码vim /etc/sudoers# 利用/%whell定位 写在whell后插入# 切换时,不用使用密码lay ALL=(ALL) NOPASSWD:ALL```

#### 1.5 设置软件安装目录
```shell# 安装包存放路径mkdir /home/lay/software_file# 安装路径mkdir /home/lay/software
# 若创建在其他路径,且用户不是自身,设置权限chown lay:lay /home/lay/software_filechown lay:lay /home/lay/software# 执行结果# drwxr-xr-x. 2 lay lay 6 2月 27 21:23 software# drwxr-xr-x. 2 lay lay 6 2月 27 21:23 software_file
```
#### 1.6 卸载jdk
```shell# xargs -n1 只传一个参数 rpm -e --nodeps 强制卸载安装包rpm -qa | grep -i java | xargs -n1 rpm -e --nodeps```
#### 1.7 设置静态IP
**01 设置虚拟机**
```shell# xshell命令设置vim /etc/sysconfig/network-scripts/ifcfg-ens33```

**02 设置win中**
**配置虚拟机VM8参数**

**配置NAT参数**

**配置win网卡v8**
右击右下角的网线图标 --> 点击更改适配器--> 右击VM8—>进入属,更改ipv4相关配置

#### 1.8 设置主机名
```shell# 改成hadoop01 自己命名也可,方便管理即可vim /etc/hostname```
#### 1.9 设置主机名映射
```shellvim /etc/hosts# 添加如下192.168.10.11 base192.168.10.21 hadoop01192.168.10.22 hadoop02192.168.10.23 hadoop03# 利用Xshell连接时,直接将ip地址换成hadoop01也可连接 增加IP安全性
# 查看本机IPifconfig```
#### 1.10 win设置主机名映射
```shell# 修改C:\Windows\System32\drivers\etc目录下的hosts文件# 可利用vscode打开,直接添加下面映射,然后管理员修改192.168.10.11 base192.168.10.21 hadoop01192.168.10.22 hadoop02192.168.10.23 hadoop03```
### 2、集群准备
#### 2.1 克隆三台主机
```shell# 修改IP 192.168.188.21 vim /etc/sysconfig/network-scripts/ifcfg-ens33
# 修改主机名 hadoop02vim /etc/hostname```
#### 2.2 导入相关文件到虚拟机对应文件夹
```shell# 解压jdk到指定文件夹cd /home/lay/software_filetar -zxvf jdk-8u172-linux-x64.tar.gz -C /home/lay/software/```

#### 2.3 配置jdk环境
```shell# 配置环境变量# 关于profile.d和profile的区别 ---全局环境变量# 二者都可以控制环境变量 # 前者在对应文件夹中创建新的脚本,在启动是后者直接调用,同时启动文件夹中的脚本运行# 区别的话,前者可以直接删自己写的脚本,维护方便
# 可在/home/lay配置用户独立环境变量 .bash_profile# 创建用户环境变量sudo vim /etc/profile.d/my_env.sh# 写入环境变量 export是shell编程里面设置全局变量的关键字# JAVA_HOME export JAVA_HOME=/home/lay/software/jdk1.8.0_172# 环境变量 可以理解为:隔开,后面加$目录export PATH=$PATH:$JAVA_HOME/bin
# 更新一下source /etc/profile
# 测试是否成功 不行就rebootjava -version
```
#### 2.4 配置Hadoop
```shell# 解压Hadoopcd /home/lay/software_filetar -zxvf hadoop-3.1.3.tar.gz -C /home/lay/software/
sudo vim /etc/profile.d/my_env.sh# 写入export HADOOP_HOME=/home/lay/software/hadoop-3.1.3export PATH=$PATH:$HADOOP_HOME/binexport PATH=$PATH:$HADOOP_HOME/sbin
#刷新配置source /etc/profile
# 查看环境hadoop version```
### 3 、本地运行模式
#### 3.1 执行
```shellcd /home/lay/software/hadoop-3.1.3mkdir my_input
# 执行案例,统计单词个数vim my_input/word.txt# 写入文本hello world01hello world05hello world04hello world03hello world02# 由于配置过环境变量 bin/hadoop可直接写成hadoop wordcount为功能模块 wcinput输入路径 my_output输出路径,但不可存在# 利用tab查看文件夹下具体目录列表bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount my_input my_outputcd my_output/cat part-r-00000```


### 4、分布式搭建
#### 4.1 配置三台jdk和hadoop环境
```shell# function 1 手动配置,重复一下2.4那一块 # 真狗啊,搞快了,其实可以用命令的
# 主机名可以写IP地址应该# function 2 我给别人scp -r 文件路径 目标用户@主机名:目标路径scp -r /home/lay/software/hadoop-3.1.3/my_output hadoop02@192.168.10.22:/home/lay/software/
# function 3 别人拿我的数据scp -r 目标用户@主机名:目标路径 文件路径
# function 4 我把a的数据给bscp -r hadoop01@192.168.188.23:/home/lay/software/hadoop-3.1.3/my_output hadoop02@192.168.10.22:/home/lay/software/scp -r hadoop01@192.168.188.23:/home/lay/software/hadoop-3.1.3/my_output hadoop03@192.168.10.23:/home/lay/software/#function 5 rsync远程同步 每次同步只同步差异文件rsync -av 文件路径 目标用户@主机名:目标路径```
#### 4.2 同步脚本 (续4.1)
```shell# 需求:批量,且我什么目录下的文件,你就什么目录下创建# 创建用户环境变量echo $PATHcd /home/laymkdir bincd bin# 若my_rsync没有执行权限,使用 chmod 777 my_rsyncvim my_rsync# 脚本命令如下
#!/bin/bash# 判断输入参数是否正确if [$# -lt 1]then echo Syntax error! exit;fi
# 遍历集群所有机器 IP也可以for host in hadoop02 hadoop03 hadoop04do echo ++++++++++++++ wait me +++++++++++++++++ for file in $@ do # 判断文件是否存在 if [ -e $file ] then # 获取目录名 # 设置-P可进入软连接,以防意外 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 donedone```
**创建免密登录**
```shell# 免密登录原理```

```shell# 生成公钥和私钥cdcd .sshssh-keygen -t rsa# 三次回车即可生成私钥和公钥
# 每台主机都设置免密 第一步输入yes回车 第二步输入对应主机密码ssh-copy-id hadoop02ssh-copy-id hadoop03ssh-copy-id hadoop01```


#### 4.3 集群配置
(1)集群规划
namenode 目录管理者resourcemanager yarn资源管理者secondarynamenode 目录管理者助手

(2)默认配置
jar包可理解为zip文件的类似,war是javaweb项目打包的zip文件

(3)用户自定义配置
```shell# 进入配置文件目录cd /home/lay/software/hadoop-3.1.3/etc/hadoopvim core-site.xml# 在configuration 中写入如下设定<!-- 指定NameNode的地址 --> <property> <name>fs.defaultFS</name> <value>hdfs://hadoop01:8020</value> </property>
<!-- 指定hadoop数据的存储目录 --> <property> <name>hadoop.tmp.dir</name> <value>/home/lay/software/hadoop-3.1.3/data</value> </property>
<!-- 配置HDFS网页登录使用的静态用户为lay --> <!-- 尽量避免暴露外部接口给用户 --> <property> <name>hadoop.http.staticuser.user</name> <value>lay</value> </property>
vim hdfs-site.xml# 配置如下命令<!-- nn web端访问地址--> <property> <name>dfs.namenode.http-address</name> <value>hadoop01:9870</value> </property> <!-- 2nn web端访问地址--> <property> <name>dfs.namenode.secondary.http-address</name> <value>hadoop03:9868</value> </property>
vim yarn-site.xml# 配置如下<!-- 指定MR走shuffle --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property>
<!-- 指定ResourceManager的地址--> <property> <name>yarn.resourcemanager.hostname</name> <value>hadoop02</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> vim mapred-site.xml# 配置如下<!-- 指定MapReduce程序运行在Yarn上 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
# 配置workersvim workers# 写入 不允许每一行后面有空格,且不允许空白行,会产生主机名不匹配# 机器是不知道空格是无效的hadoop02hadoop03hadoop01# 批量同步my_rsync /home/lay/software/hadoop-3.1.3/etc```
### 5、集群
#### 5.1 启动
```shell# 初次启动,需格式化hdfshdfs namenode -format
# 在标识namenode的主机中启动HDFS 网页查看http://hadoop02:9870sbin/start-dfs.sh# 在标识yarn的主机中启动yarn 网页查看http://hadoop03:8088sbin/start-yarn.sh
# 使用jps查看集群运行节点jps```
#### 5.2 集群测试
```shell# 创建文件存放文件夹hadoop fs -mkdir /input# 上传文件 hadoop fs -put /home/lay/software_file/jdk-8u172-linux-x64.tar.gz /input# 上传文件数据存储路径 /home/lay/software/hadoop-3.1.3/data
# 追加写入,解压cat blk_1073741825 >> temp.tar.gzcat blk_1073741826 >> temp.tar.gztar -zxvf temp.tar.gz
# 下载 可以直接从可视化界面下载hadoop fs -get /input/jdk-8u172-linux-x64.tar.gz /tmp```



#### 5.3 集群奔溃处理
```shell# 利用kill -9 ID 杀死相关进程 关闭顺序yarn -> namenode# 删除各个机器上的data目录和log目录 去除版本号匹配# 初始化namenodehdfs namenode -format```
#### 5.4 配置历史服务器
```shellcd $HADOOP_HOME/etc/hadoop
vim mapred-site.xml# 写入文件<!-- 历史服务器端地址 --><property> <name>mapreduce.jobhistory.address</name> <value>hadoop02:10020</value></property>
<!-- 历史服务器web端地址 --><property> <name>mapreduce.jobhistory.webapp.address</name> <value>hadoop02:19888</value></property># 启动历史服务器 http://hadoop02:19888/jobhistorymapred --daemon start historyserver# 查看是否启动历史服务器jps
```
#### 5.5 配置日志的聚集

```shellvim yarn-site.xml<!-- 开启日志聚集功能 --><property> <name>yarn.log-aggregation-enable</name> <value>true</value></property><!-- 设置日志聚集服务器地址 --><property> <name>yarn.log.server.url</name> <value>http://hadoop02:19888/jobhistory/logs</value></property><!-- 设置日志保留时间为7天 --><property> <name>yarn.log-aggregation.retain-seconds</name> <value>604800</value></property>
# 批量同步my_rsync /home/lay/software/hadoop-3.1.3/etc/hadoop/yarn-site.xml```
#### 5.6 关闭
```shell# 整体开启/关闭HDFS sbin目录下start-dfs.sh/stop-dfs.sh# 整体开启/关闭yarnstart-yarn.sh/stop-yarn.sh# 指定 开启/关闭HDFS组件hdfs --daemon start/stop namenode/datanode/secondarynamenode# 指定 开启/关闭yarn组件yarn --daemon start/stop resourcemanager/nodemanager```
#### 5.7 shell脚本
(1)自动化开关机hadoop
```shellcd cd binvim myAutoHadoop.sh# 写入#!/bin/bashif [ $# -lt 1 ]then echo "Syntax error!" exit ;fi
case $1 in"start") echo " =================== 启动 hadoop集群 ==================="
echo " --------------- 启动 hdfs ---------------" ssh hadoop02 "/home/lay/software/hadoop-3.1.3/sbin/start-dfs.sh" echo " --------------- 启动 yarn ---------------" ssh hadoop03 "/home/lay/software/hadoop-3.1.3/sbin/start-yarn.sh" echo " --------------- 启动 historyserver ---------------" ssh hadoop02 "/home/lay/software/hadoop-3.1.3/bin/mapred --daemon start historyserver";;"stop") echo " =================== 关闭 hadoop集群 ==================="
echo " --------------- 关闭 historyserver ---------------" ssh hadoop02 "/home/lay/software/hadoop-3.1.3/bin/mapred --daemon stop historyserver" echo " --------------- 关闭 yarn ---------------" ssh hadoop03 "/home/lay/software/hadoop-3.1.3/sbin/stop-yarn.sh" echo " --------------- 关闭 hdfs ---------------" ssh hadoop02 "/home/lay/software/hadoop-3.1.3/sbin/stop-dfs.sh";;*) echo "Syntax error!";;esac
# 设置文件权限chmod 777 myAutoHadoop.sh
```
(2)jpsall
```shellvim jpsall# 写入如下#!/bin/bashfor host in hadoop02 hadoop03 hadoop01do echo =============== $host =============== ssh $host jpsdone
# 设置文件权限chmod 777 jpsall```
#### 5.8 常见端口

#### 5.9 设置时间同步ntpd
(0)触发同步任务,去除时间差异因素
(1)开启本机时间同步任务 **进入root用户**
```shell# 开启时间同步功能# 查看ntpd运行状态sudo systemctl status ntpd# 开启ntpd服务sudo systemctl start ntpd# 查询是否开启开机自启sudo systemctl is-enabled ntpd```

(2)修改本机时间配置
```shellvim /etc/ntp.conf# 修改如图配置,同时写入如下# 该节点丢失网络,仍可以使用本机时间同步其他机器时间server 127.127.1.0fudge 127.127.1.0 stratum 10
# 添加硬件时间和系统时间一起同步vim /etc/sysconfig/ntpdSYNC_HWCLOCK=yes```

(3)其他配置
```shell# 重启systemctl start ntpd# 设置开机自启systemctl enable ntpd
# 关闭其他机器ntpdsystemctl stop ntpdsystemctl disable ntpd
# 在其他机器上开启定时任务crontab -e*/1 * * * * /usr/sbin/ntpdate hadoop02
# 查看定时任务 crontab -l# 删除 crontab -r
# 修改时间机器时间date -s "2021-9-11 11:11:11"
# 一分钟后查看时间是否同步date```


本文来自博客园,作者:{kalione},转载请注明原文链接:https://www.cnblogs.com/kalione/p/17307233.html