源代码编译,Apache DolphinScheduler前后端分离部署解决方案

file

转载自神龙大侠

生产环境部署方案

在企业线上生产环境中,普遍的做法是至少实施两套环境。

  1. 测试环境
  2. 线上环境

测试环境用于验证代码的正确性,当测试环境验证ok后才会部署线上环境。

鉴于CI/CD应用的普遍性,源代码一键部署是必要的。

本文是探索对DolphinScheduler源代码改造,构建测试,线上双环境一键部署和上线。

同时,我对dolphinscheduler-api进行改造,使得前端管理系统前后端分离,以使得部署更贴近生产环境,方便生产环境组件横向部署,这也让前后端并行代码开发更加便利。

如果熟悉DolphinScheduler的同学可以前面的介绍,直接跳到部署方案那里看起。

DolphinScheduler介绍

Apache DolphinScheduler 是一个分布式易扩展的可视化DAG工作流任务调度开源系统。适用于企业级场景,提供了一个可视化操作任务、工作流和全生命周期数据处理过程的解决方案。

Apache DolphinScheduler 旨在解决复杂的大数据任务依赖关系,并为应用程序提供数据和各种 OPS 编排中的关系。 解决数据研发ETL依赖错综复杂,无法监控任务健康状态的问题。 DolphinScheduler 以 DAG(Directed Acyclic Graph,DAG)流式方式组装任务,可以及时监控任务的执行状态,支持重试、指定节点恢复失败、暂停、恢复、终止任务等操作。

工作流定义启动流程

很丝滑有木有(这里面没有alert-server的位置,不过这个也不负责具体的任务执行)

file

DolphinScheduler核心模块

在二进制文件部署方案中,DolphinScheduler主要是有4个核心server如下:

  • alert-server 提供告警服务,通过告警插件的方式实现丰富的告警手段。

  • master-server MasterServer采用分布式无中心设计理念,MasterServer主要负责 DAG 任务切分、任务提交监控,并同时监听其它MasterServer和WorkerServer的健康状态。 MasterServer服务启动时向Zookeeper注册临时节点,通过监听Zookeeper临时节点变化来进行容错处理。 MasterServer基于netty提供监听服务。

该服务内主要包含: DistributedQuartz分布式调度组件,主要负责定时任务的启停操作,当quartz调起任务后,Master内部会有线程池具体负责处理任务的后续操作;

MasterSchedulerService是一个扫描线程,定时扫描数据库中的t_ds_command表,根据不同的命令类型进行不同的业务操作;

WorkflowExecuteRunnable主要是负责DAG任务切分、任务提交监控、各种不同事件类型的逻辑处理;

TaskExecuteRunnable主要负责任务的处理和持久化,并生成任务事件提交到工作流的事件队列;

EventExecuteService主要负责工作流实例的事件队列的轮询;

StateWheelExecuteThread主要负责工作流和任务超时、任务重试、任务依赖的轮询,并生成对应的工作流或任务事件提交到工作流的事件队列;

FailoverExecuteThread主要负责Master容错和Worker容错的相关逻辑;

  • worker-server WorkerServer也采用分布式无中心设计理念,WorkerServer主要负责任务的执行和提供日志服务。 WorkerServer服务启动时向Zookeeper注册临时节点,并维持心跳。 WorkerServer基于netty提供监听服务。

  • api-server API接口层,主要负责处理前端UI层的请求。该服务统一提供RESTful api向外部提供请求服务。

从严格意义上来讲,api-server包含了两个模块,一个是后端接口api-server,一个是api-ui前端页面。在dolphinscheduler的二进制部署方案中ApiServer和ui是合并打包的。

在实际的生产环境中一般前后端是分离部署,一个是缩小上线改动的影响范围,上线效率更快,一个是前端和后端的部署机器没必要都保持一样的数量,分离部署更灵活,这个博文是使用最新的release版本3.2.1进行部署的。(2024年7月22日)

  • api-ui

系统的前端页面,提供系统的各种可视化操作界面。

部署方案

DolphinScheduler部署主要有四种:

  • 单机部署(Standalone)
  • 伪集群部署(Pseudo-Cluster)
  • 集群部署(Cluster)
  • 快速试用 Kubernetes 部署

其中单机部署主要是用于操作体验,并不能执行工作流调度。

官网部署指南:https://dolphinscheduler.apache.org/zh-cn/docs/3.2.2/%E9%83%A...

DolphinScheduler官网提供了二进制文件部署,这种我也试了一下,安装流程很流畅,不过还是没有采用这种部署方案,主要考虑后面产品或者业务会提一些需求,需要这边基于最新的版本做一些开发。

最终决定采用如下两套部署方案:

  • 伪集群部署方案 作为测试环境(stag)
  • 集群部署方案 作为线上环境(prod)

下文用stag和prod作为测试环境和线上环境标志。

源代码开发pom管理有两种方案:

  1. 升级版本信息3.2.1到3.2.2
  2. 使用snapshot版本

为了不跟主线混淆主版本,也是致敬经典,我就使用snapshot作为后续的开发迭代版本了。

修改pom版本

本文基于3.2.1版本统一改成了snapshot版本,这样我自己修改的代码,重新编译之后可以在测试或者生产环境生效。

<groupId>org.apache.dolphinscheduler</groupId>
<artifactId>dolphinscheduler</artifactId>
<version>3.2.100-SNAPSHOT</version>

备注:需要修改所有子模块的pom版本信息。

修改通用环境配置

目前环境需要的依赖或者配置信息目录在根目录下的script/env下,/script/env下保存了测试环境和线上环境都要求一致的配置信息。

如果确定使用mysql数据库,需要引入jar包mysql-connector-java-8.0.33.jar。可以把mysql-connector-java-8.0.33.jar放在/script/env目录下,这个测试和线上环境都是一致的配置和需求版本。

另外一个主要的配置信息是dolphinscheduler_env.sh文件。

dolphinscheduler_env.sh用来配置各种路径和环境变量信息。

如果线上有和测试环境配置不一样的配置信息,可以分别创建测试和线上目录,build的时候根据环境信息打包各自的配置文件:

  • /script/env/stag
  • /script/env/prod

将线上和测试环境不同的配置信息dolphinscheduler_env.sh文件copy到这两个目录下。

dolphinscheduler_env.sh文件包含的配置信息包括JAVA_HOMEPYTHON_LAUNCHERHADOOP_CLASSPATHSPARK_DIST_CLASSPATHHADOOP_CLIENT_OPTSSPARK_SUBMIT_OPTS等环境信息,根据实际情况配置好就ok了。

我的stag环境dolphinscheduler_env.sh配置信息包括如下(这个根据自己的情况配置,不能直接copy哦)

export HADOOP_CLASSPATH=`hadoop classpath`:${DOLPHINSCHEDULER_HOME}/tools/libs/*
export SPARK_DIST_CLASSPATH=$HADOOP_CLASSPATH:$SPARK_DIST_CLASS_PATH
export HADOOP_CLIENT_OPTS="-javaagent:${DOLPHINSCHEDULER_HOME}/tools/libs/aspectjweaver-1.9.7.jar":$HADOOP_CLIENT_OPTS
export SPARK_SUBMIT_OPTS="-javaagent:${DOLPHINSCHEDULER_HOME}/tools/libs/aspectjweaver-1.9.7.jar":$SPARK_SUBMIT_OPTS
export FLINK_ENV_JAVA_OPTS="-javaagent:${DOLPHINSCHEDULER_HOME}/tools/libs/aspectjweaver-1.9.7.jar":$FLINK_ENV_JAVA_OPTS
export JAVA_HOME=${JAVA_HOME:-/usr/java/jdk1.8.0_181-amd64/}
export PYTHON_LAUNCHER=${PYTHON_LAUNCHER:-/usr/local/python3.7.2/bin/python3}export SPRING_CACHE_TYPE=${SPRING_CACHE_TYPE:-none}
export SPRING_JACKSON_TIME_ZONE=${SPRING_JACKSON_TIME_ZONE:-UTC}
export MASTER_FETCH_COMMAND_NUM=${MASTER_FETCH_COMMAND_NUM:-10}export PATH=$PYTHON_LAUNCHER:$JAVA_HOME/bin:$HADOOP_CLASSPATH:$SPARK_DIST_CLASSPATH:$FLINK_ENV_JAVA_OPTS:$PATH

备注:jdk需要时1.8以上的版本

dolphinscheduler-api双环境部署方案改造

对于alert-server,master-server,worker-server改造和dolphinscheduler-api改造一样,这里就不都一一例举和分析了。

增加线上和测试环境配置信息

删除/dolphinscheduler-api/resources/application.yaml这个是配置样例,可以根据实际需要修改对应的配置信息。

添加测试环境配置信息 /dolphinscheduler-api/resources/stag/application.yaml

添加线上环境配置信息 /dolphinscheduler-api/resources/prod/application.yaml

application.yaml需要修改的内容包括(我列的这几个是需要修改的项,其他的可以留着不动)。

修改mysql对应配置

spring:profiles:active: mysqldatasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://ip:port/dolphinschedulerusername: userpassword: pass
quartz:properties:org.quartz.jobStore.driverDelegateClass:org.quartz.impl.jdbcjobstore.StdJDBCDelegate

修改zk对应的配置:

registry:type: zookeeperzookeeper:namespace: dolphinschedulerconnect-string: ip:portretry-policy:base-sleep-time: 60msmax-sleep: 300msmax-retries: 5session-timeout: 30sconnection-timeout: 9sblock-until-connected: 600msdigest: ~

增加双环境jvm启动参数信息

  • 创建dolphinscheduler-api/src/main/bin/stag目录,mv并修改jvm_args_env.sh配置信息。

修改jvm_args_env.sh

-Xms1g
-Xmx1g
-Xmn512m-XX:+IgnoreUnrecognizedVMOptions
-XX:+PrintGCDateStamps
-XX:+PrintGCDetails
-Xloggc:gc.log-XX:+ExitOnOutOfMemoryError
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=dump.hprof-Duser.timezone=${SPRING_JACKSON_TIME_ZONE}
  • 创建dolphinscheduler-api/src/main/bin/prod目录,mv并修改jvm_args_env.sh配置信息

修改jvm_args_env.sh

-Xms8g
-Xmx8g
-Xmn2g-XX:+IgnoreUnrecognizedVMOptions
-XX:+PrintGCDateStamps
-XX:+PrintGCDetails
-Xloggc:gc.log-XX:+ExitOnOutOfMemoryError
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=dump.hprof-Duser.timezone=${SPRING_JACKSON_TIME_ZONE}

start.sh文件不用做改动,直接copy到对应的目录即可。

  • 增加src/main/assembly/xml 线上和测试环境打包配置文件 dolphinscheduler-api-server-stag.xml dolphinscheduler-api-server-prod.xml

       <fileSet><directory>${basedir}/../../script/env</directory><outputDirectory>libs</outputDirectory><includes><include>mysql-connector-java-8.0.33.jar</include></includes><fileMode>0755</fileMode><directoryMode>0755</directoryMode></fileSet>

    线上和测试环境一般不同所以需要根据路径加载线上或者测试环境配置信息

对于测试环境:

    <fileSet><directory>${basedir}/src/main/resources/stag</directory><includes><include>*.yaml</include><include>*.xml</include></includes><outputDirectory>conf</outputDirectory></fileSet><fileSet><directory>${basedir}/src/main/bin/stag</directory><outputDirectory>bin</outputDirectory><fileMode>0755</fileMode><directoryMode>0755</directoryMode></fileSet>

线上环境:

    <fileSet><directory>${basedir}/src/main/resources/prod</directory><includes><include>*.yaml</include><include>*.xml</include></includes><outputDirectory>conf</outputDirectory></fileSet><fileSet><directory>${basedir}/src/main/bin/prod</directory><outputDirectory>bin</outputDirectory><fileMode>0755</fileMode><directoryMode>0755</directoryMode></fileSet>

修改pom文件

  • 增加profile信息
    <profiles><!--测试环境--><profile><id>stag</id><properties><spring.profiles.active>stag</spring.profiles.active></properties><activation><activeByDefault>true</activeByDefault></activation></profile><!--生产环境--><profile><id>prod</id><properties><spring.profiles.active>prod</spring.profiles.active></properties></profile></profiles>
  • 根据环境信息修改对应的assembly文件
           <plugin><artifactId>maven-assembly-plugin</artifactId><executions><execution><id>dolphinscheduler-api-server</id><goals><goal>single</goal></goals><phase>package</phase><configuration><finalName>api-server</finalName><descriptors><descriptor>src/main/assembly/dolphinscheduler-api-server-${spring.profiles.active}.xml</descriptor></descriptors><appendAssemblyId>false</appendAssemblyId></configuration></execution></executions></plugin>

配置完上述信息之后,可以通过根据命令打包。

线上: mvn clean install -P prod '-Dmaven.test.skip=true' '-Dcheckstyle.skip=true' '-Dmaven.javadoc.skip=true'

测试: mvn clean install -P stag '-Dmaven.test.skip=true' '-Dcheckstyle.skip=true' '-Dmaven.javadoc.skip=true'

如果需要根据pid文件判断程序的健康检查状态并支持故障自动拉起的功能,可以修改 ApiApplicationServer的main方法,支持生成pid文件信息

   public static void main(String[] args) {ApiServerMetrics.registerUncachedException(DefaultUncaughtExceptionHandler::getUncaughtExceptionCount);Thread.setDefaultUncaughtExceptionHandler(DefaultUncaughtExceptionHandler.getInstance());SpringApplication application = new SpringApplicationBuilder(ApiApplicationServer.class).application();application.addListeners(new ApplicationPidFileWriter("ApiServer.pid"));application.run(args);}

build之后,启动执行sh bin/start.sh.

如果启动报错mysql表找不到,可以下载一下二进制安装包,激活一下conf中的mysql数据库,执行tools/bin/upgrade-schema.sh即可完成数据库的初始化。

如果你修改代码,且引入了一些jar包,然后报一些莫名其妙的错误,十有八九是jar包依赖版本错乱了,将对应的jar包和官方代码依赖的重复jar包 exlude出去就可以了。(最后如果有其他问题可以留言)。

dolphinscheduler-ui部署方案

配置测试环境和线上环境后端接口api域名

修改.env.development 测试环境 VITE_APP_PROD_WEB_URL='https://stag.busi.com'

修改.env.production 测试环境 VITE_APP_PROD_WEB_URL='https://prod.busi.com'

这个地址是后端接口的域名前缀,也就是dolphinscheduler-api提供http接口的地址

修改package.json文件,在"build:prod"下面增加一行测试环境 build:stag命令

"build:prod": "vue-tsc --noEmit && vite build --mode production", "build:stag": "vue-tsc --noEmit && vite build --mode development",

修改router

二进制文件打包默认目录是/dolphinscheduler/ui,对于前后端分离部署,并没有这个必要。

修改src/router/index.ts代码:

const router = createRouter({history: createWebHistory(import.meta.env.MODE === 'production' ? '/' : '/'),routes
})

修改pom文件(增加build:stag)配置

                            <execution><id>pnpm run build:stag</id><goals><goal>pnpm</goal></goals><configuration><arguments>run build:stag</arguments></configuration></execution>

修改vite.config.ts文件中base目录信息

二进制文件打包默认目录是/dolphinscheduler/ui,对于前后端分离部署,并没有这个必要。

 base: process.env.NODE_ENV === 'production' ? '/' : '/',

nginx配置信息

对于测试环境

       server {listen 你的port; # 自定义接口server_name dolphinscheduler-test.buis.com;root /home/deploy/api-ui_stag; #本地网站文件路径index index.html;  #设置默认网页try_files $uri $uri/ /index.html;location /dolphinscheduler {proxy_pass http://api-server-ip:api-server-port;}}

对于线上环境

       server {listen 你的port; # 自定义接口server_name dolphinscheduler-prod.buis.com;root /home/deploy/api-ui_prod; #本地网站文件路径index index.html;  #设置默认网页try_files $uri $uri/ /index.html;location /dolphinscheduler {proxy_pass http://api-server-ip:api-server-port;}}

其中api-ui_prodapi-ui_stagdolphinscheduler-ui build之后的dist目录。

nginx有一个配置非常关键

try_files $uri $uri/ /index.html;

由于dolphinscheduler-ui的vue router 模式为history模式,所有页面的录入都是通过域名根目录进入的。

例如 访问https://dolphinscheduler-test.busi.com/目录会跳转到 https://dolphinscheduler-test.busi.com/home目录。

但是你如果直接请求https://dolphinscheduler-test.busi.com/home会报404错误。

解决的办法,就是增加配置try_files $uri $uri/ /index.html;

同时去掉

location / {}

配置

去掉location这个很关键.

关于try_files的语法

Checks the existence of files in the specified order and uses the first foundfile for request processing; the processing is performed in the current 
context. The path to a file is constructed from the file parameter accordingto the root and alias directives. It is possible to check directory’s 
existence by specifying a slash at the end of a name, e.g. “$uri/”. 
If none of the files were found, an internal redirect to the uri 
specified in the last parameter is made.
参考
https://juejin.cn/post/6844903856359342087

大意就是它会按照try_files后面的参数依次去匹配root中对应的文件或文件夹。如果匹配到的是一个文件,那么将返回这个文件;如果匹配到的是一个文件夹,那么将返回这个文件夹中index指令指定的文件。最后一个uri参数将作为前面没有匹配到的fallback。(注意try_files指令至少需要两个参数)

build命令

测试环境打包:pnpm run build:stag 线上环境打包:pnpm run build:prod

最后执行 nginx -s reload 使得nginx部署生效

看一下效果

  • 用户名:admin
  • 密码:dolphinscheduler123

file

钉钉报警和优化

目前我这报警主要是钉钉报警,钉钉报警可以发到群报警机器人,并且支持@owner的功能,好用且不收费。

原生的报警格式如下:

start process success
[{"projectCode":14285493640640,"projectName":"xxx_test","owner":"admin",
"processId":12,"processDefinitionCode":14285512555584,
"processName":"flow_test1-1-20240717191405669","processType":"START_PROCESS",
"processState":"SUCCESS","modifyBy":"admin","recovery":"NO",
"runTimes":1,"processStartTime":"2024-07-17 19:14:05",
"processEndTime":"2024-07-17 19:14:09","processHost":"10.76.6.66:5678"}]
@xxx

我看起来感觉不太易读,重新优化了一下报警格式,是不是看起来板正多了,后续可以考虑加一个钩子,做一下中英文替换,或者直接修改报警源内容,看起来就更方便了。

start process success
projectCode:14285493640640
projectName:xxx_test
owner:admin
processId:22
processDefinitionCode:14371091350208
processName:testflow123-1-20240723111659147
processType:START_PROCESS
processState:SUCCESS
modifyBy:admin
recovery:NO
runTimes:1
processStartTime:2024-07-23 11:16:59
processEndTime:2024-07-23 11:17:00
processHost:10.76.6.66:5678
@xxx

备注:本文的一些关键配置信息我这隐掉了,每个公司的配置不一样,参考自己公司的配置,比如机器部署目录,域名信息,mysql,zk配置信息,用户名,密码等。

本文由 白鲸开源科技 提供发布支持!

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

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

相关文章

【王树森】RNN模型与NLP应用(7/9):机器翻译与Seq2Seq模型(个人向笔记)

Machine Translation Data 做机器学习任务的第一步都是处理数据&#xff0c;我们首先需要准备机器翻译的数据。由于我们是学习用途&#xff0c;因此拿一个小规模数据集即可&#xff1a;http://www.manythings.org/anki/下面的数据集中&#xff1a;一个英语句子对应多个德语句子…

Sinc Function介绍

1、定义 Sinc函数全称&#xff1a;sine cardinal&#xff0c;也称作是sampling function&#xff08;采样函数&#xff09;。 2、分类 &#xff08;1&#xff09;归一化sinc函数&#xff1a; 这种定义在信号处理中被广泛采用&#xff0c;其中 x 是一个无量纲的变量&#xff0c;…

鸿蒙开发5.0【基于Swiper的页面布局】

场景一&#xff1a;Swiper页面支持自定义动画 方案&#xff1a; 给Swiper组件设置.nextMargin(50).prevMargin(50)属性。 给Swiper组件添加onChange事件&#xff0c;设置当前this.currentIndexindex&#xff0c;当currentIndex为首页或者尾页时&#xff0c;设置上一张以及下一…

生产环境中变态开启devtools(强制)

写到最前面 首先&#xff0c;你已经下载了google的插件【vue devtools】&#xff0c;不知道怎么下载&#xff0c;留言博主 如果你想看的项目中的vuetools插件打开是这样的 Vue.js is detected on this page. Devtools inspection is not available because it’s in product…

Unet改进14:添加SEAttention||减少冗余计算和同时存储访问

本文内容:在不同位置添加SEAttention注意力机制 目录 论文简介 1.步骤一 2.步骤二 3.步骤三 4.步骤四 论文简介 卷积算子是卷积神经网络(cnn)的核心组成部分,它使网络能够通过融合每层局部接受域内的空间和通道信息来构建信息特征。之前的广泛研究已经调查了这种关系的…

大模型之二十九-语音识别Whisper推理加速

在上一篇博客《大模型之二十八-语音识别Whisper进阶》中我们留了一个尾巴&#xff0c;就是在流式场景以及如何提升推理速度。 流式场景 流式场景分两种&#xff0c;一种是伪流式一种是真流式&#xff0c;伪流式就是bilibili或者YouTub&#xff0c;终端用户在观看视频的时候&a…

人工智能再次进化 善用AI提升营运效率

人工智能无疑为我们的生活带来不少便利&#xff0c;也为商界和社会发展作出了重大贡献。事实上&#xff0c;它的起源最早可以追溯到70年前&#xff0c;只可惜过往的 AI 技术尚未如现时般成熟&#xff0c;可以做到的事也远比现在少&#xff1b;直至近期的 AI 技术取得了重大突破…

人工智能领域正经历模型规模变革,小型语言模型(SLM)崛起,挑战“规模至上”观念。

在人工智能领域&#xff0c;一场关于模型规模的深刻变革正在悄然发生。长久以来&#xff0c;科技巨头们热衷于庞大语言模型&#xff08;LLM&#xff09;的开发竞赛&#xff0c;但如今&#xff0c;小型语言模型&#xff08;SLM&#xff09;正以其独特的优势逐步崭露头角&#xf…

【qt】qss使用

1.按钮设置颜色 ui->pushButton->setStyleSheet("QPushButton { color : red;}");也可以通过rgb来设置 ff表示红色拉满&#xff0c;gb为0当然是红色 这只是针对pushbutton对象的控件设置的&#xff0c;如果我想设置所有的按钮空间都是一个颜色 这是通过设置界…

dubbo:dubbo服务负载均衡、集群容错、服务降级、服务直连配置详解(五)

文章目录 0. 引言1. dubbo负载均衡1.1 负载均衡算法1.2. dubbo负载均衡使用1.3 自定义负载均衡策略 2. dubbo服务容错2.1 8种服务容错策略2.2 自定义容错策略 3. dubbo服务降级&#xff08;mock&#xff09;4. dubbo服务直连5. 总结 0. 引言 之前我们讲解了dubbo的基本使用&am…

使用 AI进行绘画初体验

大家好啊&#xff0c;我是董董灿。 AI 绘画的效果是真的不错&#xff0c;最近在查找AI相关技术文章时&#xff0c;总是会时不时的发现一些好玩的 AI 应用&#xff0c;而且大多数都是免费的。 今天就给大家介绍如何使用 MidJourney 来完成 AI 绘画的网站。 MidJourney 本身是…

6种有效的时间序列数据特征工程技术(使用Python)

在商业分析中&#xff0c;"时间"是一个核心概念。我们基于时间组件来分析销售数据、收入、利润、增长&#xff0c;甚至进行预测。然而&#xff0c;对于初学者来说&#xff0c;这可能是一个复杂的主题。在处理时间敏感的数据集时&#xff0c;需要考虑时间序列数据的多…

Unet改进12:添加PCONV||减少冗余计算和同时存储访问

本文内容:添加PCONV 目录 论文简介 1.步骤一 2.步骤二 3.步骤三 4.步骤四 论文简介 为了设计快速的神经网络,许多工作都集中在减少浮点运算(FLOPs)的数量上。然而,我们观察到FLOPs的这种减少并不一定会导致类似程度的延迟减少。这主要源于低效率的每秒浮点操作数(FLOP…

STM32——GPS模块(GY-NEO-6M)

1连接 1-1 使用 USB-TTL 工具&#xff0c;安装好驱动&#xff0c;可以在”设备管理器看到对应COM”按照如下链接测试模块&#xff1a; USB-TTL GPS 模块 3.3V--------------------------------->VCC GND------------------------------>GND RXD--------------------…

Linux安装Hadoop(单机版)详细教程

目录 一、JDK安装 1、下载JDK安装包 2、解压下载的JDK安装包 3、移动并重命名JDK包 4、配置Java环境变量 5、验证安装是否成功 二、Hadoop安装 1、下载Hadoop安装包 2、解压Hadoop安装包 3、配置Hadoop环境变量 4、修改配置文件 5、验证Hadoop是否安装成功 三&…

使用3D数字人做视频

用3D数字人做视频 漂亮精致 3D数字人定制4 动作流畅、音乐上的表现 thatgirl 支持私人定制模型 你愿意捐献所有的财产吗 想搭建这样的数字人的请和我们联系 使用3D数字人做视频https://www.jinshuangshi.com/forum.php?modviewthread&tid248 (出处: 金双石科技)

力扣经典题目之->二叉树的前序遍历(中序后序同理)

一&#xff1a;题目 解释&#xff1a; 1&#xff1a; 题目的要求就是我们return 一个数组&#xff0c;该数组里面的元素及其顺序就是 前序遍历二叉树 的元素及其顺序 比如&#xff1a;示例1的树&#xff0c;前序遍历的顺序应该是1 2 3&#xff0c;那么return 的数组里面的元素…

智慧高校迎新服务平台的设计与实现---附源码92489

摘要 随着高校规模的不断扩大和新生人数的增加&#xff0c;传统的手工登记和管理方式已经无法满足高效、准确的需求。为了提升高校新生报到迎新工作的效率和质量&#xff0c;本研究设计开发了一套基于SSM框架的智慧高校迎新服务平台的设计与实现。系统通过信息技术的应用&#…

12-使用gateway作为微服务网关

本文介绍spring gateway的使用&#xff0c;包括配置文件的使用和调试跟踪&#xff0c;让大家了解spring gateway的基本用法。如果不了解什么是微服务网关&#xff0c;就先查查资料&#xff0c;网关相对来说是比较重要的微服务组件。 0、环境 springboot 2.4.2springcloud gat…

Minkowski分形电路生成工具[程序附后]

此工具用于生成Minkowski分形电路&#xff0c;应用领域可参考分形电路的纪录片或CNKI论文。运行环境在Altium Designer中&#xff0c;可用于Altium Designer全系列的版本中。 程序界面如下图所示&#xff0c;可以支持外框和迭代次数的更改。 程序下载链接&#xff1a; Minkows…