Hadoop集群运维管理

Hadoop集群运维管理

  • 一、Hadoop 集群进程管理
    • 1.1 NameNode 守护进程管理
    • 1.2 DataNode 守护进程管理
    • 1.3 ResourceManager 守护进程管理
    • 1.4 NodeManager 守护进程管理
  • 二、Hadoop 集群运维技巧
    • 2.1 查看日志
    • 2.2 清理临时文件
    • 2.3 定期执行负载均衡
    • 2.4 文件系统检查
    • 2.5 元数据备份
  • 三、Hadoop 集群动态扩缩容
    • 3.1 使用背景
    • 3.2 原 Hadoop 集群配置
    • 3.2.1 配置 include 和 exclude 文件路径
      • 3.2.2 添加 include 和 exclude文件
      • 3.2.3 同步修改配置文件
    • 3.3 Hadoop 集群启动
      • 3.1.1 启动 Zookeeper
      • 3.1.2 启动 HDFS 集群
      • 3.1.3 启动 YARN 集群
    • 3.4 Hadoop 集群动态扩容
      • 3.4.1 克隆一台 Centos 7 服务器,并配置集成环境
      • 3.4.2 修改 include 文件并同步
      • 3.4.3 刷新 NameNode
      • 3.4.4 刷新 resourceManager
      • 3.4.5 修改 配置文件 slaves
      • 3.4.6 启动新增节点进程
      • 3.4.6 检查新增节点
      • 3.4.7 启动负载均衡
    • 3.5 Hadoop 集群动态收缩
      • 3.5.1 修改 exclude 文件
      • 3.5.2 刷新 NameNode
      • 3.5.3 刷新 resourceManager
      • 3.5.4 开始解除节点
      • 3.5.4 停止退役节点进程
      • 3.5.5 修改include文件
      • 3.5.6 刷新NameNode和ResourceManager
      • 3.5.7 修改slaves文件
      • 3.5.8 启动负载均衡

文本使用工具脚本 deploy.sh 和 runRemoteCmd.sh ,可以到 《ZooKeeper 集群的详细部署》 的 4.1 章节查看如何使用

一、Hadoop 集群进程管理

1.1 NameNode 守护进程管理

  • 下线操作
[root@hadoop1 hadoop]# /usr/local/hadoop/sbin/hadoop-daemon.sh stop namenode

在这里插入图片描述
在这里插入图片描述
从上图可以看出当 hadoop1 停用 namenode 后,hadoop2 的 namenode 节点由 standby 转换为 active

  • 上线操作
[root@hadoop1 hadoop]# /usr/local/hadoop/sbin/hadoop-daemon.sh start namenode

1.2 DataNode 守护进程管理

  • 下线操作
[root@hadoop1 hadoop]# /usr/local/hadoop/sbin/hadoop-daemon.sh stop datanode
  • 上线操作
[root@hadoop1 hadoop]# /usr/local/hadoop/sbin/hadoop-daemon.sh start datanode

1.3 ResourceManager 守护进程管理

  • 下线操作
[root@hadoop1 hadoop]# /usr/local/hadoop/sbin/hadoop-daemon.sh stop resourcemanager

在这里插入图片描述
在这里插入图片描述
从上图可以看出当 hadoop1 停用 resourcemanager 后,hadoop2 的 resourcemanager 节点由 standby 转换为 active

  • 上线操作
[root@hadoop1 hadoop]# /usr/local/hadoop/sbin/hadoop-daemon.sh start resourcemanager

1.4 NodeManager 守护进程管理

  • 下线操作
[root@hadoop1 hadoop]# /usr/local/hadoop/sbin/hadoop-daemon.sh stop nodemanager
  • 上线操作
[root@hadoop1 hadoop]# /usr/local/hadoop/sbin/hadoop-daemon.sh start nodemanager

二、Hadoop 集群运维技巧

2.1 查看日志

$ HAD00P HOME/logs/hadoop-hadoop-namenode-hadoop1.log
$ HAD00P H0ME/logs/yarn-hadoop-resourcemanager-hadoop1.log
$ HAD00P H0ME/logs/hadoop-hadoop-datanode-hadoop1.log
$ HAD00P HOME/logs/yarn-hadoop-nodemanager-hadoop1.log

2.2 清理临时文件

HDFS的临时文件路径: h a d o o p . t m p . d i r / m a p r e d / s t a g i n g 本地临时文件路径 : {hadoop.tmp.dir}/mapred/staging 本地临时文件路径: hadoop.tmp.dir/mapred/staging本地临时文件路径:{mapred.local.dir}/mapred/local

2.3 定期执行负载均衡

脚本:/usr/local/hadoop/sbin/start-balancer.sh -t 10%
-t:HDFS达到平衡状态的磁盘使用率偏差值。如果机器与机器之间磁盘使用率偏差小于10%,那么我们就认为HDFS集群已经达到了平衡的状态。

2.4 文件系统检查

命令:/usr/local/hadoop/bin/hdfs fsck /
在这里插入图片描述

2.5 元数据备份

命令:/usr/loacl/hadoop/bin/hdfs ‘dfsadmin’ -fetchImage fsimage.backup
在这里插入图片描述

三、Hadoop 集群动态扩缩容

3.1 使用背景

随着公司业务的增长,数据量越来越大,原有 DataNode,节点的容量已经不能满足数据存储的需求,需要在原有集群基础上动态添加新的数据节点,也就是俗称的动态扩容。如果在 Hadoop 集群运行过程中,某些节点变得反常,例如故障率过高或者性能过低,可能就需要停止这些节点上的 Hadoop 服务,并从 Hadoop 集群中移除,也就是俗称的动态缩容。通常情况下,节点需要同时运行 DataNode 和 NodeManager守护进程,所以两者一般同时新增或者移除。

3.2 原 Hadoop 集群配置

在 Hadoop 集群进行动态扩缩容之前,首先需要修改原有集群的配置文件,具体操作步骤如下所示。
配置之前,先停止 hdfs 集群 和 yarn 集群

[root@hadoop1 hadoop]# /usr/local/hadoop/sbin/stop-dfs.sh 
[root@hadoop1 hadoop]# /usr/local/hadoop/sbin/stop-yarn.sh 

3.2.1 配置 include 和 exclude 文件路径

在 NameNode 节点(hadoop1)上,修改 hdfs-sitexml配置文件添加 dfs.hosts 和 dfs.hosts.exclude 属性,具体操作如下所示。

[root@hadoop1 hadoop]# vim /usr/local/hadoop/etc/hadoop/hdfs-site.xml 

添加如下内容:

<property><name>dfs.hosts</name><value>/usr/local/hadoop/etc/hadoop/include</value>
</property>
<property><name>dfs.hosts.exclude</name><value>/usr/local/hadoop/etc/hadoop/exclude</value>
</property>

在 ResourceManager 节点(hadoop1)上,修改 yarn-site.xml 配置文件,添加 yarn.resourcemanager.nodes.include-path 和 yarn.resourcemanager.nodes.exclude-path 属性,具体操作如下所示:

[root@hadoop1 hadoop]# vim /usr/local/hadoop/etc/hadoop/yarn-site.xml

添加如下内容:

<property><name>dfs.hosts.exclude</name><value>/usr/local/hadoop/etc/hadoop/exclude</value>
</property>
<property><name>yarn.resourcemanager.nodes.exclude-path</name><value>/usr/local/hadoop/etc/hadoop/exclude</value>
</property>

3.2.2 添加 include 和 exclude文件

在 NameNode 和 ResourceManager,节点(hadoop1)上,创建 include 文件,并将集群节点的 hostname,信息添加到 include 文件中,具体操作如下所示。

添加 include 文件

[root@hadoop1 hadoop]# vim /usr/local/hadoop/etc/hadoop/include

添加如下内容,不要换行和空格。

hadoop1
hadoop2
hadoop3

添加 exclude 文件

[root@hadoop1 hadoop]# vim /usr/local/hadoop/etc/hadoop/exclude

暂时不添加内容,大家可以根据实际需要添加排查的服务器

3.2.3 同步修改配置文件

将 hadoop1 节点上中修改的配置文件远程拷贝到集群其他节点,具体操作如下。

[root@hadoop1 hadoop]# deploy.sh /usr/local/hadoop/etc/hadoop/hdfs-site.xml /usr/local/hadoop/etc/hadoop/ slave
hdfs-site.xml                                                              100% 4207     2.7MB/s   00:00    
hdfs-site.xml                                                              100% 4207     2.2MB/s   00:00    
[root@hadoop1 hadoop]# deploy.sh /usr/local/hadoop/etc/hadoop/yarn-site.xml /usr/local/hadoop/etc/hadoop/ slave
yarn-site.xml                                                              100% 3401     2.9MB/s   00:00    
yarn-site.xml                                                              100% 3401     2.6MB/s   00:00    
[root@hadoop1 hadoop]# deploy.sh /usr/local/hadoop/etc/hadoop/include /usr/local/hadoop/etc/hadoop/ slave
include                                                                    100%   24    16.2KB/s   00:00    
include                                                                    100%   24    30.9KB/s   00:00    
[root@hadoop1 hadoop]# deploy.sh /usr/local/hadoop/etc/hadoop/exclude /usr/local/hadoop/etc/hadoop/ slave
exclude                                                                    100%    0     0.0KB/s   00:00    
exclude                                                                    100%    0     0.0KB/s   00:00 

在这里插入图片描述

3.3 Hadoop 集群启动

3.1.1 启动 Zookeeper

[root@hadoop1 hadoop]# runRemoteCmd.sh "/usr/local/zookeeper/bin/zkServer.sh start" all

3.1.2 启动 HDFS 集群

[root@hadoop1 hadoop]# /usr/local/hadoop/sbin/start-dfs.sh 

3.1.3 启动 YARN 集群

[root@hadoop1 hadoop]# /usr/local/hadoop/sbin/start-yarn.sh 

3.4 Hadoop 集群动态扩容

3.4.1 克隆一台 Centos 7 服务器,并配置集成环境

配置内容:修改固定IP、/etc/hostname、/etc/hosts、关闭防火墙、免密、时钟同步,具体可以参考 《ZooKeeper 集群的详细部署》

在此处我新增了一台 hadoop4 IP地址:192.168.220.154

完成以上继续配置

3.4.2 修改 include 文件并同步

在 NameNode 和 ResouceMamager节点(hadoop1)上,修改 include 文件,并将新增节点的 hostname,信息添加到 include 文件中,具体操作如下所示。

[root@hadoop1 hadoop]# vim ./etc/hadoop/include 

修改为如下内容(不要添加空格和换行):

hadoop1
hadoop2
hadoop3
hadoop4

在这里插入图片描述
将 hadoop1 的 include 文件同步到其他服务器

[root@hadoop1 hadoop]# deploy.sh /usr/local/hadoop/etc/hadoop/include /usr/local/hadoop/etc/hadoop/ slave

3.4.3 刷新 NameNode

将一系列审核过的 DataNode 来更新 NameNode 设置,具体操作如下所示:

[root@hadoop1 hadoop]# /usr/local/hadoop/bin/hdfs dfsadmin -refreshNodes

在这里插入图片描述

3.4.4 刷新 resourceManager

将一系列审核过的 NodeManager 来更新 ResourceManger 设置,具体操作如下所示:

[root@hadoop1 hadoop]# /usr/local/hadoop/bin/yarn rmadmin -refreshNodes

在这里插入图片描述

3.4.5 修改 配置文件 slaves

[root@hadoop1 hadoop]# cat /usr/local/etc/hadoop/slaves 

新增 hadoop4 主机名称节点,配置如下:

hadoop1
hadoop2
hadoop3
hadoop4

将 hadoop1 中配置好的 slaves 推送到其他hadoop 节点

[root@hadoop1 hadoop]# deploy.sh /usr/local/hadoop/etc/hadoop/slaves /usr/local/hadoop/etc/hadoop/ slave

在这里插入图片描述

3.4.6 启动新增节点进程

在新增的 hadoop4 节点中,使用如下命令启动 DataNode 和 NodeManager 守护进程

[root@hadoop4 hadoop]# /usr/local/hadoop/sbin/hadoop-daemon.sh start datanode
[root@hadoop4 hadoop]# /usr/local/hadoop/sbin/yarn-daemon.sh start nodemanager

在这里插入图片描述

3.4.6 检查新增节点

分别通过 HDFS(地址:http://hadoop1:50070/)和 YARN(地址:http:/hadoop1:8088/)的 Web界面,查看新增节点 hadoop4 是否添加成功。如果能检査到新的 DataNode 和 NodeManager,则说明 Hadoop 集群扩容成功了。

在这里插入图片描述

3.4.7 启动负载均衡

当 Hadoop 集群扩容成功之后,HDFS 集群不会自动将数据块从旧的 DataNode 迁移到新的 DataNode,以保持集群数据负载均衡,而是需要用户手动执行脚本来实现负载均衡,具体操作如下所示。

[root@hadoop1 hadoop]# /usr/local/hadoop/sbin/start-balancer.sh 

3.5 Hadoop 集群动态收缩

从 Hadoop 集群移除节点的操作步骤如下所示:

3.5.1 修改 exclude 文件

在NameNode和ResourceManager节点(hadoop1)上,修改exclude文件,并将需要移除节点的hostname信息添加到exclude文件中,具体操作如下所示。

[root@hadoop1 hadoop]# vim /usr/local/hadoop/etc/hadoop/exclude 

输入想要移除的节点,比如我想要把 hadoop4 移除,新增如下内容:

hadoop4

然后将修改后的exclude文件同步集群其他节点(包括新增节点),这里以hadoop2节点为例,具体操作如下所示。

[root@hadoop1 hadoop]# deploy.sh /usr/local/hadoop/etc/hadoop/exclude /usr/local/hadoop/etc/hadoop/ slave

在这里插入图片描述

3.5.2 刷新 NameNode

在NameNode(hadoop1)节点上,使用一组新的审核过的DataNode来更新NameNode设置,具体操作如下所示。

[root@hadoop1 hadoop]# /usr/local/hadoop/bin/hdfs dfsadmin -refreshNodes

3.5.3 刷新 resourceManager

在ResourceManager(hadoop1)节点上,使用一组新的审核过的NodeManager来更新ResourceManager设置,具体操作如下所示。

[root@hadoop1 hadoop]# /usr/local/hadoop/bin/yarn rmadmin -refreshNodes

3.5.4 开始解除节点

通过Web界面(地址:http://hadoop1:50070/)查看待解除DataNode的管理状态是否已经变为正在解除(Decommission In Progress),因为此时相关的DataNode正在被解除过程中,这些DataNode会把它们的数据块复制到其他DataNode中。当所有DataNode的状态变为解除完毕(Decommissioned)时,表明所有数据块已经复制完毕,此时会关闭已经解除的节点。

在这里插入图片描述

3.5.4 停止退役节点进程

等待退役节点hadoop4的状态为decommissioned时,说明所有块已经复制成功,然后使用如下命令关闭DataNode和NodeManager进程。

[root@hadoop4 hadoop]# /usr/local/hadoop/sbin/hadoop-daemon.sh stop datanode
stopping datanode
[root@hadoop4 hadoop]# /usr/local/hadoop/sbin/yarn-daemon.sh stop nodemanager
no nodemanager to stop

3.5.5 修改include文件

在NameNode和ResourceManager节点(hadoop1)中,从include文件中删除退役节点hadoop4的hostname信息,具体操作如下所示。

[root@hadoop1 hadoop]# vim /usr/local/hadoop/etc/hadoop/include 

删除 hadoop4,结果如下:

hadoop1
hadoop2
hadoop3

然后将修改后的include文件同步集群其他节点(包括退役节点),这里以hadoop2节点为例,具体操作如下所示。

[root@hadoop1 hadoop]# deploy.sh /usr/local/hadoop/etc/hadoop/include /usr/local/hadoop/etc/hadoop/ slave

在这里插入图片描述

3.5.6 刷新NameNode和ResourceManager

[root@hadoop1 hadoop]# /usr/local/hadoop/bin/hdfs dfsadmin -refreshNodes
[root@hadoop1 hadoop]# /usr/local/hadoop/bin/yarn rmadmin -refreshNodes

3.5.7 修改slaves文件

[root@hadoop1 hadoop]# vim /usr/local/hadoop/etc/hadoop/slaves 

删除 hadoop4,结果如下:

hadoop1
hadoop2
hadoop3

然后将修改后的slaves文件同步集群其他节点(包括退役节点),这里以hadoop2节点为例,具体操作如下所示。

[root@hadoop1 hadoop]# deploy.sh /usr/local/hadoop/etc/hadoop/slaves /usr/local/hadoop/etc/hadoop/ slave

3.5.8 启动负载均衡

[root@hadoop1 hadoop]# /usr/local/hadoop/sbin/start-balancer.sh 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/409068.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Maven的一些相关知识【重修】《包括私服搭建!》

mvnrepository.com Maven 下载jar包的位置&#xff01; 【该部分有教程】 这是什么nb代码投稿视频-这是什么nb代码视频分享-哔哩哔哩视频 MAVEN 的私服搭建&#xff1a; https://zhuanlan.zhihu.com/p/520107316 2、maven私服搭建及应用&#xff08;下&#xff09;_哔哩…

SQL手工注入漏洞测试(PostgreSQL数据库)

判断注入点 and 12 判断回显点 order 不用 4 页面正常 order by 5 页面异常&#xff0c;得出只存在四个字段 测试回显位置 and 12 union select null,null,null,null and 12 union select null,null,null,null and 12 union select null,null,null,null and 12 union select…

如何在不格式化的情况下解锁 Android 智能手机密码

如果您忘记密码&#xff0c;您的 Android 移动设备将锁定您。发生这种情况时&#xff0c;通常可以通过恢复出厂设置来重新获得对设备的访问权限。可悲的是&#xff0c;这将导致所有数据丢失。下面列出的是解锁锁定的Android 手机而不会丢失任何个人数据的有效方法。 Android 手…

Open3D 近似点体素滤波(36)

Open3D 近似点体素滤波(36) 一、算法介绍二、算法实现1.代码2.效果一、算法介绍 这个算法也是体素滤波, 它保留的点是近似点,也就是新的点,原始点云中对应位置是不存在这些点的。其他的看着类似,下面是代码,滤波抽稀结果 二、算法实现 1.代码 代码如下(示例): …

Long Short-Term Memory

这篇论文总结的太抽象了&#xff0c;只是翻译了一遍。 &#xff08;我太笨了&#xff0c;如果把这个当我的入门读物&#xff0c;我觉着会把我折磨坏&#xff09; 递归神经网络的一个重要优点是它们在映射输入和输出序列时使用上下文信息的能力。不幸的是&#xff0c;对于标准的…

Chainlit接入FastGpt接口完美对接,实现全新的用户聊天界面

前言 由于fastgpt只提供了一个分享用的网页应用&#xff0c;网页访问地址没法自定义&#xff0c;虽然可以接入NextWeb/ChatGPT web等开源应用。但是如果我们想直接给客户应用&#xff0c;还需要客户去设置配置&#xff0c;里面还有很多我们不想展示给客户的东西怎么办&#xf…

[数据集][目标检测]街灯路灯检测数据集VOC+YOLO格式1893张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1893 标注数量(xml文件个数)&#xff1a;1893 标注数量(txt文件个数)&#xff1a;1893 标注…

数据结构(Java实现):链表习题

文章目录 1. 题目列表及链接2. 题目解析及代码2.1 删除链表中等于给定值 val 的所有节点2.2 反转一个单链表2.3 给定一个带有头结点 head 的非空单链表&#xff0c;返回链表的中间结点。如果有两个中间结点&#xff0c;则返回第二个中间结点2.4 输入一个链表&#xff0c;输出该…

iTransformer时序模型改进——基于SENet和TCN的倒置Transformer,性能暴涨

1数据集介绍 ETT(电变压器温度)&#xff1a;由两个小时级数据集&#xff08;ETTh&#xff09;和两个 15 分钟级数据集&#xff08;ETTm&#xff09;组成。它们中的每一个都包含 2016 年 7 月至 2018 年 7 月的七种石油和电力变压器的负载特征。 数据集链接&#xff1a; https…

深度学习入门-第4章-神经网络的学习

学习就是从训练数据中自动获取最优权重参数的过程。引入损失函数这一指标&#xff0c;学习的目的是找出使损失函数达到最小的权重参数。使用函数斜率的梯度法来找这个最小值。 人工智能有两派&#xff0c;一派认为实现人工智能必须用逻辑和符号系统&#xff0c;自顶向下看问题…

Sass实现网页背景主题切换

Sass 实现网页背景主题切换 前言准备工作一、 简单的两种主题黑白切换1.定义主题2. 添加主题切换功能3. 修改 data-theme 属性 二、多种主题切换1. 定义主题2. 动态生成 CSS 变量1.遍历列表2.遍历映射3.高级用法 3. 设置默认主题4. 切换功能HTML 三、多种主题多种样式切换1. 定…

Java数组的定义与使用

目录 1. 数组的基本概念 1.1为什么要使用数组 1.2 什么是数组 1.3 数组的创建及初始化 1.3.1 数组的创建 1.3.2 数组的初始化 1. 动态初始化 2. 静态初始化 1.4 数组的使用 1.4.1 数组中元素访问 1.4.2 遍历数组 2. 数组是引用类型 2.1 基本类型变量与引用类型变量…

【C++从小白到大牛】C++智能指针的使用、原理和分类

目录 1、我们为什么需要智能指针&#xff1f; 2、内存泄露 2.1 什么是内存泄漏&#xff0c;内存泄漏的危害 2.2如何避免内存泄漏 总结一下: 3.智能指针的使用及原理 3.1 RAII 3.2关于深拷贝和浅拷贝更深层次的理解&#xff1a; 3.3 std::auto_ptr 3.4 std::unique_pt…

Springboot里集成Mybatis-plus、ClickHouse

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; Springboot里集成Mybati…

Overleaf参考文献由 BibTex 转 \bibitem 格式

目录 Overleaf参考文献由 BibTex 转 \bibitem 格式一、获取引用论文的BibTex二、编写引用论文对应的bib文件三、编写生成bibitem的tex文件四、转化bibitem格式 参考资料 Overleaf参考文献由 BibTex 转 \bibitem 格式 一、获取引用论文的BibTex 搜索论文引用点击BibTex 跳转出…

怎样快速搭建 Linux 虚拟机呢?(vagrant 篇)

作为一名Coder&#xff08;程序员或码农&#xff09;&#xff0c;供职于中小型互联网公司&#xff0c;而你恰恰偏向于服务端&#xff0c;那么&#xff0c;产品部署在生产环境的艰巨任务&#xff0c;便毫无疑问的落在你身上了。 只有大厂&#xff08;大型互联网&#xff09;企业…

Ps:首选项 - 界面

Ps菜单&#xff1a;编辑/首选项 Edit/Preferences 快捷键&#xff1a;Ctrl K Photoshop 首选项中的“界面” Interface选项卡可以定制 Photoshop 的界面外观和行为&#xff0c;从而创建一个最适合自己工作习惯和需求的工作环境。这些设置有助于提高工作效率&#xff0c;减轻眼…

Simple RPC - 07 从零开始设计一个服务端(下)_RPC服务的实现

文章目录 PreRPC服务实现服务注册请求处理 设计&#xff1a; 请求分发机制 Pre Simple RPC - 01 框架原理及总体架构初探 Simple RPC - 02 通用高性能序列化和反序列化设计与实现 Simple RPC - 03 借助Netty实现异步网络通信 Simple RPC - 04 从零开始设计一个客户端&#…

# 利刃出鞘_Tomcat 核心原理解析(九)-- Tomcat 安全

利刃出鞘_Tomcat 核心原理解析&#xff08;九&#xff09;-- Tomcat 安全 一、Tomcat专题 - Tomcat安全 - 配置安全 1、 删除 tomcat 的 webapps 目录下的所有文件&#xff0c;禁用 tomcat 管理界面. 如下目录均可删除&#xff1a; D:\java-test\apache-tomcat-8.5.42-wind…

数据结构-KMP算法

先解决 前缀与后缀串的最长匹配长度信息(前缀或后缀都不能取整体)。如下 位置6的前缀最长串就是abcab(不能取全部,即不能为abcabc) 位置6的后缀最长串就是bcabc(不能取全部,即不能为abcabc)