实时数仓Flink生产环境部署+提交作业【步骤】

news2024/11/24 5:08:01

文章目录

  • 1、基础环境
  • 2、开发环境
    • 2.1、pom.xml
    • 2.2、log4j.properties
    • 2.3、测试用的代码
      • 2.3.1、Kafka工具
      • 2.3.3、Flink执行环境工具
      • 2.3.3、测试Flink读写Kafka
      • 2.3.4、测试FlinkSQL读写Kafka
    • 2.4、打包后上传到服务器
  • 3、生产环境
    • 3.1、Flink安装
    • 3.2、Flink on YARN下3种模式
      • 3.2.1、Session-Cluster
      • 3.2.2、Per-Job Cluster Mode
      • 3.2.3、Application Mode
    • 3.3、关闭Flink

1、基础环境

  • 开发环境:Windows
    WIN10+JDK1.8+IDEA2022.3+Maven3.8.1
  • 生产环境:Linux
    CentOS7.5+JDK1.8+Hadoop3.1.3+Kafka3.0.0
    Flink集群生产环境常用部署模式为 YARN模式

2、开发环境

创建Maven项目

2.1、pom.xml

本依赖支持:Flink、FlinkSQL、Flink读写Kafka、JSON解析

<properties>
    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <flink.version>1.13.6</flink.version>
    <scala.version>2.12</scala.version>
    <hadoop.version>3.1.3</hadoop.version>
    <slf4j.version>2.0.5</slf4j.version>
    <log4j.version>2.19.0</log4j.version>
    <fastjson.version>1.2.83</fastjson.version>
</properties>
<!-- https://mvnrepository.com/ -->
<dependencies>
    <!-- Flink -->
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-java</artifactId>
        <version>${flink.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-streaming-java_${scala.version}</artifactId>
        <version>${flink.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-streaming-scala_${scala.version}</artifactId>
        <version>${flink.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-clients_${scala.version}</artifactId>
        <version>${flink.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-runtime-web_${scala.version}</artifactId>
        <version>${flink.version}</version>
    </dependency>
    <!-- Flink_Kafka -->
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-connector-kafka_${scala.version}</artifactId>
        <version>${flink.version}</version>
    </dependency>
    <!-- FlinkSQL -->
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-table-planner-blink_${scala.version}</artifactId>
        <version>${flink.version}</version>
    </dependency>
    <!-- 'format'='json' -->
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-json</artifactId>
        <version>${flink.version}</version>
    </dependency>
    <!-- Checkpoint保存到HDFS -->
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-client</artifactId>
        <version>${hadoop.version}</version>
    </dependency>
    <!-- JSON解析 -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>${fastjson.version}</version>
    </dependency>
    <!--Flink默认使用slf4j记录日志,相当于一个日志的接口,此处使用log4j作为具体的日志实现 -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${slf4j.version}</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>${slf4j.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-to-slf4j</artifactId>
        <version>${log4j.version}</version>
    </dependency>
</dependencies>
<!-- 打包插件 -->
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.1.1</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <artifactSet>
                            <excludes>
                                <exclude>com.google.code.findbugs:jsr305</exclude>
                                <exclude>org.slf4j:*</exclude>
                                <exclude>log4j:*</exclude>
                            </excludes>
                        </artifactSet>
                        <filters>
                            <filter>
                                <!-- 不要复制META-INF文件夹中的签名,否则,在使用JAR时可能会导致SecurityExceptions -->
                                <artifact>*:*</artifact>
                                <excludes>
                                    <exclude>META-INF/*.SF</exclude>
                                    <exclude>META-INF/*.DSA</exclude>
                                    <exclude>META-INF/*.RSA</exclude>
                                </excludes>
                            </filter>
                        </filters>
                        <transformers combine.children="append">
                            <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer">
                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

2.2、log4j.properties

log4j.rootLogger=error, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

2.3、测试用的代码

代码架构

2.3.1、Kafka工具

package org.example;

import org.apache.flink.api.common.serialization.SimpleStringSchema;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer;

import java.util.Properties;

import org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer;

public class KafkaTool {
    private static final String BOOTSTRAP_SERVER = "hadoop105:9092,hadoop106:9092,hadoop107:9092";
    private static final String CONSUMER_GROUP_ID = "Flink01";

    public static FlinkKafkaProducer<String> getFlinkKafkaProducer(String topic) {
        return new FlinkKafkaProducer<>(BOOTSTRAP_SERVER, topic, new SimpleStringSchema());
    }

    public static FlinkKafkaConsumer<String> getFlinkKafkaConsumer(String topic) {
        Properties properties = new Properties();
        properties.setProperty("bootstrap.servers", BOOTSTRAP_SERVER);
        properties.setProperty("group.id", CONSUMER_GROUP_ID);
        properties.setProperty("auto.offset.reset", "latest");
        return new FlinkKafkaConsumer<>(topic, new SimpleStringSchema(), properties);
    }

    public static DataStreamSource<String> getKafkaSource(StreamExecutionEnvironment env, String topic) {
        return env.addSource(getFlinkKafkaConsumer(topic));
    }

    public static String getInputTable(String topic) {
        return " WITH ("
                + "'connector'='kafka',"
                + "'topic'='" + topic + "',"
                + "'properties.bootstrap.servers'='" + BOOTSTRAP_SERVER + "',"
                + "'properties.group.id'='" + CONSUMER_GROUP_ID + "',"
                + "'scan.startup.mode'='latest-offset',"
                + "'format'='json'"
                + ")";
    }

    public static String getOutputTable(String topic) {
        return " WITH ("
                + "'connector'='kafka',"
                + "'topic'='" + topic + "',"
                + "'properties.bootstrap.servers'='" + BOOTSTRAP_SERVER + "',"
                + "'format'='json'"
                + ")";
    }
}

2.3.3、Flink执行环境工具

package org.example;

import org.apache.flink.api.common.restartstrategy.RestartStrategies;
import org.apache.flink.runtime.state.hashmap.HashMapStateBackend;
import org.apache.flink.streaming.api.CheckpointingMode;
import org.apache.flink.streaming.api.environment.CheckpointConfig;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

public class FlinkEnv {
    private final static String CHECKPOINT_DIRECTORY = "hdfs://hadoop105:8020/Flink/Checkpoint";
    private final static String HADOOP_USER_NAME = "hjw";

    public static StreamExecutionEnvironment getEnv() {
        //创建流执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        //设置并行度(=Kafka分区数)
        env.setParallelism(3);
        //获取checkpoint撇嘴
        CheckpointConfig checkpointConfig = env.getCheckpointConfig();
        //开启CheckPoint:每隔5分钟1次,精准一次模式
        env.enableCheckpointing(300 * 1000L, CheckpointingMode.EXACTLY_ONCE);
        //设置CheckPoint超时:10分钟
        checkpointConfig.setCheckpointTimeout(600 * 1000L);
        //设置Checkpoint最大数量(10/5=2)
        checkpointConfig.setMaxConcurrentCheckpoints(2);
        //设置重启策略:重启3次,执行延时5秒
        env.setRestartStrategy(RestartStrategies.fixedDelayRestart(3, 5000L));
        //设置状态后端
        env.setStateBackend(new HashMapStateBackend());
        checkpointConfig.setCheckpointStorage(CHECKPOINT_DIRECTORY);
        System.setProperty("HADOOP_USER_NAME", HADOOP_USER_NAME);
        //返回
        return env;
    }
}

2.3.3、测试Flink读写Kafka

package org.example.test;

import com.alibaba.fastjson.JSONObject;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.example.FlinkEnv;
import org.example.KafkaTool;

public class FlinkTest {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = FlinkEnv.getEnv();
        DataStreamSource<String> kafkaSource = KafkaTool.getKafkaSource(env, "topic01");
        SingleOutputStreamOperator<String> s = kafkaSource.map(JSONObject::parseObject).map(Object::toString);
        s.addSink(KafkaTool.getFlinkKafkaProducer("topic02"));
        env.execute();
    }
}

2.3.4、测试FlinkSQL读写Kafka

package org.example.test;

import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;
import org.example.FlinkEnv;
import org.example.KafkaTool;

public class FlinkSqlTest {
    public static void main(String[] args) {
        //TODO 1 创建执行环境
        StreamExecutionEnvironment env = FlinkEnv.getEnv();
        StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);
        //TODO 2 数据来源
        tableEnv.executeSql("CREATE TABLE tb1 (database STRING, ts BIGINT, data STRING, type STRING)"
                + KafkaTool.getInputTable("topic02"));
        //TODO 3 数据终点
        tableEnv.executeSql("CREATE TABLE tb2 (database STRING, ts BIGINT, data STRING, type STRING)"
                + KafkaTool.getOutputTable("topic03"));
        //TODO 4 插入数据
        tableEnv.executeSql("INSERT INTO tb2 SELECT * FROM tb1 WHERE type IN ('insert','update')");
    }
}

2.4、打包后上传到服务器

打包后

把带original的jar上传到服务器(文件更小,上传更快)

3、生产环境

Flink集群YARN模式

  1. 把Flink应用提交给YARN的ResourceManager
  2. 从NodeManager上申请容器
  3. 在容器内创建JobManager和TaskManager
  4. 根据运行在JobManger上的Job的需要的插槽数量,动态地给TaskManager分配资源

3.1、Flink安装

1、解压

wget -b https://archive.apache.org/dist/flink/flink-1.13.6/flink-1.13.6-bin-scala_2.12.tgz
tar -zxf flink-1.13.6-bin-scala_2.12.tgz
mv flink-1.13.6 /opt/module/flink

2、环境变量

vim /etc/profile.d/my_env.sh
export HADOOP_CLASSPATH=`hadoop classpath`

3、分发环境变量

source ~/bin/source.sh

4、Per-Job-Cluster时报错:Exception in thread “Thread-5” java.lang.IllegalStateException:
Trying to access closed classloader.
Please check if you store classloaders directly or indirectly in static fields.
If the stacktrace suggests that the leak occurs in a third party library and cannot be fixed immediately,
you can disable this check with the configuration ‘classloader.check-leaked-classloader’.
对此,编辑配置文件

vim /opt/module/flink/conf/flink-conf.yaml

在配置文件添加下面这行,可解决上面报错

classloader.check-leaked-classloader: false

5、下载Flink-Kafka和fastjson的jar(去Maven官网找链接)

cd /opt/module/flink/lib
wget https://repo1.maven.org/maven2/org/apache/flink/flink-sql-connector-kafka_2.12/1.13.6/flink-sql-connector-kafka_2.12-1.13.6.jar
wget https://repo1.maven.org/maven2/com/alibaba/fastjson/1.2.83/fastjson-1.2.83.jar

3.2、Flink on YARN下3种模式

名称译名模式说明适用场景
Session-Cluster会话模式多个Job对应1个Flink集群Flink集群向YARN申请资源并常驻,可接收多个作业测试
Per-Job-Cluster独立作业模式1个Job对应1个Flink集群用户的main函数在客户端执行生产前
Application Mode应用模式1个Job对应1个Flink集群用户的main函数在集群中(JobManager)执行生产

Session-Cluster

在YARN中初始化一个Flink集群,开辟一定的资源
这个Flink集群会常驻在YARN集群中,可持续接收Job
若资源用完,则新的Job不能正常提交

Per-Job-ClusterApplication Mode

每次提交都会创建一个新的Flink集群,任务之间互相独立
任务执行完成之后,Flink集群也会消失

3.2.1、Session-Cluster

1、开启会话

/opt/module/flink/bin/yarn-session.sh \
-s 1 \
-jm 1024 \
-tm 1024 \
-nm a1 \
-d
参数说明
-s,--slots <arg>每个TaskManagerslot数量()
-jm,--jobManagerMemory <arg>JobManager的内存(单位默认MB)
-tm,--taskManagerMemory <arg>每个TaskManager的内存(单位默认MB)
-nm,--name <arg>YARN上应用的名字
-d,--detached以分离模式运行作业(后台执行)
-h,--help查看帮助

2、在会话上运行jar

/opt/module/flink/bin/flink run -c org.example.test.FlinkTest FlinkDW-1.0-SNAPSHOT.jar
/opt/module/flink/bin/flink run -c org.example.test.FlinkSqlTest FlinkDW-1.0-SNAPSHOT.jar

3.2.2、Per-Job Cluster Mode

/opt/module/flink/bin/flink run \
-t yarn-per-job \
-nm a2 \
-ys 1 \
-yjm 1024 \
-ytm 1024 \
-c org.example.test.FlinkSqlTest \
original-FlinkDW-1.0-SNAPSHOT.jar
参数说明
-ys,--yarnslots <arg>Number of slots per TaskManager
-yjm,--yarnjobManagerMemory <arg>Memory for JobManager Container with optional unit (default: MB)
-ytm,--yarntaskManagerMemory <arg>Memory per TaskManager Container with optional unit (default: MB)
-c,--class <classname>Class with the program entry point (“main()” method).
Only needed if the JAR file does not specify the class in its manifest.

3.2.3、Application Mode

/opt/module/flink/bin/flink run-application \
-t yarn-application \
-nm a3 \
-ys 1 \
-yjm 1024 \
-ytm 1024 \
-c org.example.test.FlinkTest \
original-FlinkDW-1.0-SNAPSHOT.jar

3.3、关闭Flink

yarn top可动态查看应用状况:应用名、应用所属用户、应用开始时间、容器数量、内存和CPU消耗…

yarn top

使用yarn application --list查看应用ID,使用yarn application --kill关闭会话

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux下POSIX信号量以及基于环形队列的生产消费模型

目录 一、POSIX信号量介绍 1. 信号量原理 2&#xff0c;初始化信号量 3,信号量销毁 4&#xff0c;信号量等待 5,发布信号量 二&#xff0c;基于环形队列的生产消费模型 1.基于单线程 2&#xff0c;测试&#xff1a; 3&#xff0c;基于多线程 4,测试 三&#xff0c;代…

故障转移,服务发现,负载均衡所运用的连接池

没错&#xff0c;说的就是连接池&#xff0c;玩互联网架构&#xff0c;连接池是必须要掌握的。 什么是连接池&#xff1f; 创建与管理连接缓冲池的技术&#xff0c;本质是资源复用&#xff0c;不用频繁创建与销毁连接&#xff0c;能提高性能。 画外音&#xff1a;数据库连接池…

Sentinel-2 L2A数据导入ENVI

Sentinel-2 L2A数据导入ENVI前言0 首先对SNAP进行设置1 用SNAP对Sentinel-2数据重采样2 在ENVI中打开重采样后的Sentinel-2数据3 其实不用重采样也行&#xff0c;ENVI可以直接打开解压后的Ssentinel-2文件&#xff0c;只需要将解压后的MTD_MSIL2A.xml拖进ENVI即可前言 Sentine…

揭秘倚天实例背后的硬核实力

2022云栖大会&#xff0c;阿里巴巴宣布自研CPU倚天710已大规模应用&#xff0c;阿里云未来两年20%的新增算力将使用自研CPU。11月15日&#xff0c;倚天710云实例上线并正式进入大规模应用阶段&#xff0c;现已应用于阿里巴巴集团核心业务&#xff0c;并服务科学研究、智能手机行…

[附源码]JAVA毕业设计天津城建大学校友录管理系统(系统+LW)

[附源码]JAVA毕业设计天津城建大学校友录管理系统&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。…

Nvidia力作:医学图像分割网络

来源&#xff1a;投稿 作者&#xff1a;梦飞翔 编辑&#xff1a;学姐 引自Unetr: Transformers for 3d medical image segmentation 1.序言 本文将以Nvidia团队最近提出的一种新的医学图像分割网络作为切入点&#xff0c;结合所用开源数据集&#xff0c;为各位同学提供一份从…

杨校老师课堂之Spring框架面试题【开发工程师面试前必看】

1.spring 中都用到了哪些设计模式?2.spring 中有哪些核心模块?3.说一下你理解的 IOC 是什么?4.spring 中的 IOC 容器有哪些?有什么区别?5.那 BeanFactory 和 FactoryBean 又有什么区别?6.Repository、Service、Compent、Controller它们有什么区别?7.那么 DI 又是什么?8…

C#学习笔记一 委托、事件

C# 委托、事件 1、Action委托、Func委托 namespace DelegateExample {class Program{static void main(string[] args){Calculator calculatornew Calculator();//Action委托Action Calnew Action(calculator.Report);//直接调用函数Calculator.Report();//通过委托调用函数Ca…

艾美捷RPMI-1640培养基含L-谷氨酰胺的功能和研究

Roswell Park Memorial Institute (RPMI) 1640 培养基起初是为了悬浮培养人白血病单层细胞而开发的。RPMI 1640 培养基被发现适用于多种哺乳动物细胞&#xff0c;包括 HeLa 细胞、Jurkat 细胞、MCF-7 细胞、PC12 细胞、PBMC 细胞、星形胶质细胞和癌细胞。针对广泛的细胞培养应用…

阿里影业的稳健业绩来源:科技+内容塑造韧性,应对市场变化

随着《阿凡达&#xff1a;水之道》&#xff08;简称&#xff1a;《阿凡达2》&#xff09;预售佳绩的显现&#xff0c;电影业的复苏已然箭在弦上。 12月7日&#xff0c;《阿凡达2》正式开启预售&#xff0c;灯塔专业版数据显示&#xff0c;其预售开启4小时后&#xff0c;总票房…

【工作随笔】验证经验、维度

背景&#xff1a;目前负责模块的验证工作基本进展完毕&#xff0c;包括所有功能验证、场景覆盖、用例编写调试和仿真、功能覆盖率收集、sva检测时序等&#xff0c;在当前的进度上和开发、验证同时对我的工作进行了评审。 问题&#xff1a;在评审中间讨论到一个当前tc实现的问题…

五、卷积神经网络CNN7(图像卷积与反卷积)

图像卷积 首先给出一个输入输出结果那他是怎样计算的呢&#xff1f; 卷积的时候需要对卷积核进行 180 的旋转&#xff0c;同时卷积核中心与需计算的图像像素对齐&#xff0c;输出结构为中心对齐像素的一个新的像素值&#xff0c;计算例子如下&#xff1a;这样计算出左上角(即第…

基于Dijkstra和A算法的机器人路径规划附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

JAVA SCRIPT设计模式--行为型--设计模式之Observer观察者模式(19)

JAVA SCRIPT设计模式是本人根据GOF的设计模式写的博客记录。使用JAVA SCRIPT语言来实现主体功能&#xff0c;所以不可能像C&#xff0c;JAVA等面向对象语言一样严谨&#xff0c;大部分程序都附上了JAVA SCRIPT代码&#xff0c;代码只是实现了设计模式的主体功能&#xff0c;不代…

Python图像识别实战(一):实现按比例随机抽取图像移动到另一文件夹

前面我介绍了可视化的一些方法以及机器学习在预测方面的应用&#xff0c;分为分类问题&#xff08;预测值是离散型&#xff09;和回归问题&#xff08;预测值是连续型&#xff09;&#xff08;具体见之前的文章&#xff09;。 从本期开始&#xff0c;我将做一个关于图像识别的…

Nacos集群搭建

1、下载nacos http://t.csdn.cn/ejfu9 2、配置Nacos 进入nacos的conf目录&#xff0c;修改配置文件cluster.conf.example&#xff0c;重命名为cluster.conf&#xff1a; 然后添加内容&#xff1a; 添加的内容是你要启动的多台nacos的IP和端口 127.0.0.1:8845 127.0.0.1:8846…

如何批量注册推特账号

Twitter推特账号怎么注册&#xff1f;相信国内好多朋友都被推特注册卡住&#xff0c;不知怎么注册twitter账号&#xff0c;由于国内限制的问题&#xff0c;推特账号注册比以前更麻烦了&#xff0c;本文将详细讲解Twitter怎么注册&#xff0c;Twitter (推特)是一个广受欢迎的社交…

【C#基础学习】第十五章、结构

目录 结构 1.结构的构造函数 1.1 实例构造函数 1.2 静态构造函数 1.3 总结 2.结构体作为返回值和参数 结构 结构的定义&#xff1a;结构是一种可以由程序员自定义的密封的值类型。 结构与类的区别&#xff1a;结构与类类似&#xff0c;它们都有自己的数据成员和函数成员。…

Nginx篇之实现反向代理和端口转发

一、前言 在正式生产环境中&#xff0c;web服务器、反向代理服务器的选择大都会选择nginx&#xff0c;确实&#xff0c;在常见的高并发场景下&#xff0c;nginx能够支持以万为单位的并发请求量&#xff0c;并且服务性能稳定&#xff0c;应用极为广泛。 二、反向代理含义 反向代…

【LeetCode_字符串_中心扩散 】5. 最长回文子串

目录考察点第一次&#xff1a;2022年12月8日10:29:05解题思路代码展示&#xff1a;中心扩散题目描述5. 最长回文子串 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 示例 1&#xff1a; 输入&#xff1a;s "babad" 输出&#xff1a;"bab" 解…