当前位置: 首页 > news >正文

Flink on K8S集群搭建及StreamPark平台安装

1.环境准备

1.1 介绍

在使用 Flink&Spark 时发现从编程模型, 启动配置到运维管理都有很多可以抽象共用的地方, 目前streampark提供了一个flink一站式的流处理作业开发管理平台, 从流处理作业开发到上线全生命周期都做了支持, 是一个一站式的流出来计算平台。
未来spark开发也在规划范围内,目前还不支持

1.2 下载

StreamPark安装包下载:https://streampark.apache.org/download
StreamPark官网:https://streampark.apache.org/docs/intro
最新版为2.1.2,本次安装为2.1.2版本

1.3 已有组件及版本

序号名称配置
1K8S(TEK)CPU:316,Me:361.57G,Storage:349.1G,Pods:3253,IP:3*273 (v1.26.1)
2NFS(CFS)40G磁盘(目前,可扩充)
3Harbor(容器仓库)未知
4flinkflink-(1.13.0/1.14.4/1.16.2)
5StreamPark2.1.2
6Mysql5.7

2.挂载与权限

2.1 k8s挂载

找运维开通权限,主要是kubectl的权限

下载kubectl
权限文件:/root/.kube/config

2.2 nfs挂载

找运维要服务ip

#挂载前,请确保系统中已经安装了nfs-utils或nfs-common
sudo yum install nfs-utils
#创建待挂载目标目录
mkdir <待挂载目标目录>   mkdir /localfolder/
#挂载文件系统
#挂载 CFS 根目录
#以下命令可以到 CFS 控制台-文件系统详情-挂载点详情中获取,由于部分旧版本文件系统不支持 noresvport 参数,具体挂载命令请以控制台建议命令为主。配置 norevsport 参数后,在网络重连时使用新的 TCP 端口,可以保障在网络异常到恢复期间、客户端和文件系统的连接不会中断,建议启用该参数。
#另,部分旧版本 Linux 内核需要使用 vers=4 挂载,若使用 vers=4.0 挂载有异常,可以尝试修改为 vers=4。
sudo mount -t nfs -o vers=4.0,noresvport <挂载点 IP>:/ <待挂载目录>
sudo mount -t nfs -o vers=4.0,noresvport 10.0.24.4:/ /localfolder
#挂载 CFS 子目录
#以下命令可以到 CFS 控制台-文件系统详情-挂载点详情中获取,由于部分旧版本文件系统不支持 noresvport 参数,具体挂载命令请以控制台建议命令为主。配置 norevsport 参数后,在网络重连时使用新的 TCP 端口,可以保障在网络异常到恢复期间、客户端和文件系统的连接不会中断,建议启用该参数。
#另,部分旧版本 Linux 内核需要使用 vers=4 挂载,若使用 vers=4.0 挂载有异常,可以尝试修改为 vers=4。
sudo mount -t nfs -o vers=4.0,noresvport 10.0.24.4:/subfolder /localfolder 

腾讯nfs(CFS)使用文档:https://cloud.tencent.com/document/product/582/11523

2.3 Harbor

需要找运维开通权限

此处注意:项目库要公开才可以使用

3.测试Flink

在k8s为flink单独开通命名空间,并创建相应账户

kubectl create clusterrolebinding flink-role-bind --clusterrole=edit --serviceaccount=flink:flink

在有k8s操作权限的节点运行flink-session

bin/flink run \
-e kubernetes-session \
-Dkubernetes.namespace=flink \
-Dkubernetes.rest-service.exposed.type=NodePort \
-Dkubernetes.cluster-id=flink-cluster \
-c WordCount1 \
/data/package/jar/flink_test-1.0-SNAPSHOT.jar#参考配置
bin/kubernetes-session.sh \
-Dkubernetes.namespace=flink \
-Dkubernetes.jobmanager.service-account=flink \
-Dkubernetes.rest-service.exposed.type=NodePort \
-Dkubernetes.cluster-id=flink-cluster \
-Dkubernetes.jobmanager.cpu=0.2 \
-Djobmanager.memory.process.size=1024m \
-Dresourcemanager.taskmanager-timeout=3600000 \
-Dkubernetes.taskmanager.cpu=0.2 \
-Dtaskmanager.memory.process.size=1024m \
-Dtaskmanager.numberOfTaskSlots=1

4.安装StreamPark

4.1 streampark(k8s)镜像打包


#编译
./build #注意maven 镜像配置,要不找不到依赖包同时要安装npm
#测试npm是否安装
npm -v#streampark安装包添加mysql连接包
cp /data/module/streampart_2.12-2.1.2/lib/mysql-connector-java-8.0.30.jar lib/
#配置maven配置拷贝
cp /data/module/maven-3.6.3/conf/settings.xml /data/module/docker/streampark-docker/
#修改application.yml
profiles.active: mysql #[h2,pgsql,mysql]
lark-url: https://open.feishu.cn
workspace:local: /opt/streampark_workspace
#配置application-mysql.yml
tee /data/module/docker/streampark-docker/streampark-2.1.2/conf/application-mysql.yml <<-'EOF'
spring.datasource.driver-class-name: com.mysql.cj.jdbc.Driver
streampark.docker.http-client.docker-host: ${DOCKER_HOST:}
streampark.maven.settings: ${MAVEN_SETTINGS_PATH:/root/.m2/settings.xml}
streampark.workspace.local: ${WORKSPACE_PATH:/opt/streampark_workspace}
EOF# 编写Dockerfile
#需要提前准备kubectl、settings.xml 、config(kubectl的密钥)
tee docker<<-'EOF'
FROM flink:1.17.1-scala_2.12-java8
WORKDIR /opt/streampark/
ADD ./streampark-2.1.2/ /opt/streampark/
ADD ./kubectl /opt/streampark/
ADD ./settings.xml /root/.m2/
USER root
RUN sed -i -e 's/eval $NOHUP/eval/' bin/streampark.sh \&& sed -i -e 's/>> "$APP_OUT" 2>&1 "&"//' bin/streampark.sh \&& install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl \&& mkdir -p ~/.kube
WORKDIR /opt/streampark/
ADD ./config /root/.kube/
RUN chown -R flink /opt/streampark/EXPOSE 10000
EOF
#构建镜像
docker build -f Dockerfile -t apache/streampark-flink:2.1.2 .
#推送镜像到仓库
docker tag apache/streampark-flink:2.1.2 storage/bigdata/streampark-flink:2.1.2
docker push  storage/bigdata/streampark-flink:2.1.2docker tag apache/streampark-flink:2.1.2-rc4 storage/bigdata/streampark-flink:2.1.2-rc4
docker push  storage/bigdata/streampark-flink:2.1.2-rc4

4.2部署MySQL的pod


#k8s上创建mysql的namespace
#含义:kubectl create clusterrolebinding ClusterRoleBinding名 --clusterrole=绑定的Role serviceaccount=被绑定的SA -n 命名空间
kubectl create namespace mysql
kubectl create serviceaccount mysql
kubectl create clusterrolebinding mysql-role-bind --clusterrole=edit --serviceaccount=mysql:mysql -n mysql
clusterrolebinding.rbac.authorization.k8s.io/mysql-role-bind created
#查看角色绑定
kubectl get clusterrolebinding flink-role-bind -n flink -o yaml
kubectl get clusterrolebinding mysql-role-bind -n mysql -o yaml
kubectl get clusterrolebinding mysql-role-bind -n flink -o yaml
#配置pvc和pv和nfs指定(腾讯nfs可直接使用)
apiVersion: v1
kind: PersistentVolume
metadata:name: data-mysql
spec:accessModes:- ReadWriteManycapacity:storage: 10Gicsi:driver: com.tencent.cloud.csi.cfsvolumeAttributes:host: x x xpath: /data_mysqlvers: "4"volumeHandle: cfs   #此处需要每个pv都不相同,否则挂载两个pvc会报错persistentVolumeReclaimPolicy: RetainstorageClassName: data-mysqlvolumeMode: Filesystem
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: data-mysqlnamespace: mysql
spec:accessModes:- ReadWriteManyresources:requests:storage: 10GistorageClassName: data-mysql
#docker拉去mysql镜像并上传至镜像库
docker tag mysql:5.7 storage/bigdata/mysql:5.7
docker push storage/bigdata/mysql:5.7
#查看集群的node ip
kubectl get node
# 编写mysql的yaml文件,并做配置
sudo mkdir -p /data/module/docker/mysql/{conf,data}/
sudo tee /data/module/docker/mysql/conf/pod-db-mysql.yaml <<-'EOF'
apiVersion: v1
kind: ConfigMap
metadata:name: conf-mysqlnamespace: mysql
data:mysql.cnf: |[mysqld]#Mysql服务的唯一编号 每个mysql服务Id需唯一server-id=1# 允许访问的IP网段bind-address=0.0.0.0#设置时区default-time_zone='+8:00'#数据库默认字符集,主流字符集支持一些特殊表情符号(特殊表情符占用4个字节)character-set-server=utf8mb4#数据库字符集对应一些排序等规则,注意要和character-set-server对应collation-server=utf8mb4_general_ci#设置client连接mysql时的字符集,防止乱码init_connect='SET NAMES utf8mb4'#是否对sql语句大小写敏感,1表示不敏感lower_case_table_names=1#最大连接数max_connections=400#最大错误连接数max_connect_errors=1000#TIMESTAMP如果没有显示声明NOT NULL,允许NULL值explicit_defaults_for_timestamp=true#SQL数据包发送的大小,如果有BLOB对象建议修改成1Gmax_allowed_packet=128M#MySQL连接闲置超过一定时间后(单位:秒)将会被强行关闭#MySQL默认的wait_timeout  值为8个小时, interactive_timeout参数需要同时配置才能生效interactive_timeout=3600wait_timeout=3600
---
apiVersion: v1
kind: Pod
metadata:name: pod-db-mysqlnamespace: mysql
spec:#serviceAccount: mysqlnodeName: xxxhostNetwork: true #主机网络可见(会占用node端口)containers:- name: mysql-k8simage: storage/bigdata/mysql:5.7env:- name: TZvalue: "Asia/Shanghai"- name: LANGvalue: "zh_CN.UTF-8"- name: MYSQL_ROOT_PASSWORDvalue: "xxxx"ports:#- containerPort: 3306volumeMounts:- mountPath: /var/lib/mysqlsubPath: mysqlname: data-mysql- mountPath: /etc/mysql/conf.dname: conf-volumereadOnly: truevolumes:- name: data-mysqlpersistentVolumeClaim:claimName: data-mysql- name: conf-volumeconfigMap:name: conf-mysql
EOF#kubectl delete -f /opt/module/k3s/conf/pod-db-mysql-k3s100.yaml
#启动pod
kubectl apply -f /data/module/docker/mysql/conf/pod-db-mysql.yaml
kubectl delete -f /data/module/docker/mysql/conf/pod-db-mysql.yaml
# 稍等片刻
kubectl get pod -A -owide
kubectl describe pod pod-db-mysql
kubectl logs --tail=100 -f pod-db-mysql -n mysql

4.3 mysql 数据库初始化

# 复制数据库文件
cp -r /data/software/incubator-streampark-2.1.2-rc3/streampark-console/streampark-console-service/src/main/assembly/script/ /localnfs/data_mysql/mysql/streampark-sql/
cp -r /data/module/docker/streampark-docker/streampark-2.2.0/script/ /localnfs/data_mysql/mysql/streampark-sql/
# 创建用户及数据库
# 进入mysql容器
kubectl exec -n mysql -it pod-db-mysql  -- bash
#------------------------进入mysql容器----------------------------
mysql -uroot -proot
create database if not exists `streampark` character set utf8mb4 collate utf8mb4_general_ci;
create user 'xxxx'@'%' IDENTIFIED WITH mysql_native_password by 'xxx';
grant ALL PRIVILEGES ON streampark.* to 'xxxx'@'%';
flush privileges;
-- 导入数据文件
use streampark;
source /var/lib/mysql/streampark-sql/schema/mysql-schema.sql
source /var/lib/mysql/streampark-sql/data/mysql-data.sql
-- 退出mysql
quit
#------------------------退出mysql容器------------------------
exit#查看mysql 的建表
vim /data/module/docker/streampark-docker/streampark-2.2.0/script/schema/mysql-schema.sql
vim /data/module/docker/streampark-docker/streampark-2.2.0/script/data/mysql-data.sql

4.4 创建StreamPark的pod


#k8s上创建mysql的namespace
#含义:kubectl create clusterrolebinding ClusterRoleBinding名 --clusterrole=绑定的Role serviceaccount=被绑定的SA -n 命名空间
kubectl create namespace streampark
kubectl create serviceaccount streampark
kubectl create clusterrolebinding streampark-role-bind --clusterrole=edit --serviceaccount=streampark:streampark -n streampark
clusterrolebinding.rbac.authorization.k8s.io/mysql-role-bind created#配置pvc和pv和nfs指定
vim pv-pvc-streampark.yamlapiVersion: v1
kind: PersistentVolume
metadata:name: data-streampark
spec:accessModes:- ReadWriteManycapacity:storage: 10Gicsi:driver: com.tencent.cloud.csi.cfsvolumeAttributes:host: xxxpath: /data_streamparkvers: "4"volumeHandle: cfs    #此处需要每个pv都不相同,否则挂载两个pvc会报错persistentVolumeReclaimPolicy: RetainstorageClassName: data-streamparkvolumeMode: Filesystem
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: data-streamparknamespace: streampark
spec:accessModes:- ReadWriteManyresources:requests:storage: 10GistorageClassName: data-streampark#执行
kubectl apply -f /data/module/docker/k8s/pv-pvc-streampark.yaml
kubectl delete -f /data/module/docker/k8s/pv-pvc-streampark.yaml
# 在xxx 上执行,在指定 节点 xxx 安装StreamPark
sudo tee /data/pod-app-streampark.yaml <<-'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: pod-app-streamparkname: pod-app-streamparknamespace: streampark
spec:replicas: 1selector:matchLabels:app: pod-app-streamparktemplate:metadata:labels:app: pod-app-streamparkspec:nodeName: xxxhostNetwork: true #主机网络可见(会占用node端口)containers:- name: streamparkimage: storage/bigdata/streampark-flink:2.1.2-rc4imagePullPolicy: Alwaysenv:- name: TZvalue: "Asia/Shanghai"- name: LANGvalue: "zh_CN.UTF-8"- name: SPRING_PROFILES_ACTIVEvalue: "mysql"- name: SPRING_DATASOURCE_URLvalue: "jdbc:mysql://xxx:3306/streampark?useSSL=false&useUnicode=true&characterEncoding=UTF-8&allowPublicKeyRetrieval=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8"- name: SPRING_DATASOURCE_USERNAMEvalue: "xxxx"- name: SPRING_DATASOURCE_PASSWORDvalue: "xxxx"- name: DOCKER_HOSTvalue: "tcp://xxx:2375"- name: DEBUG_OPTS #调试端口参数value: "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:10001"ports:#- containerPort: 10000volumeMounts:- mountPath: /root/.kubesubPath: .kubename: conf-volume- mountPath: /opt/streampark_workspacesubPath: streampark_workspacename: data-volumecommand: ["sh","-c","bash bin/startup.sh debug"]volumes:- name: conf-volumehostPath:path: /roottype: DirectoryOrCreate- name: data-volumenfs:path: /data_streamparkserver: xxxEOF#kubectl delete -f /opt/module/k3s/conf/pod-app-streampark-k3s100.yaml
#启动pod
kubectl apply -f /data/pod-app-streampark.yaml
kubectl delete -f /data/pod-app-streampark.yaml
# 稍等片刻
kubectl get pod -A -o wide -n mysql
kubectl describe pod pod-app-streampark-k3s100
kubectl logs --tail=1000 -f pod-app-streampark -n mysql
# 进入mysql容器中创建用户及数据库
kubectl exec -n mysql -it pod-app-streampark  -- bash
#-c streampark-k3s100# 为默认命名空间添加权限 kubectl create clusterrolebinding flink-role-binding-default --clusterrole=edit --serviceaccount=flink_dev:default
kubectl create clusterrolebinding flink-role-binding-default --clusterrole=edit --serviceaccount=default:default

相关文章:

Flink on K8S集群搭建及StreamPark平台安装

1.环境准备 1.1 介绍 在使用 Flink&Spark 时发现从编程模型, 启动配置到运维管理都有很多可以抽象共用的地方, 目前streampark提供了一个flink一站式的流处理作业开发管理平台, 从流处理作业开发到上线全生命周期都做了支持, 是一个一站式的流出来计算平台。 未来spark开…...

SpringBoot如何优雅的处理免登录接口

在项目开发过程中&#xff0c;会有很多API接口不需要登录就能直接访问&#xff0c;比如公开数据查询之类的 ~ 常规处理方法基本是 使用拦截器或过滤器&#xff0c;拦截需要认证的请求路径。在拦截器中判断session或token信息&#xff0c;如果存在则放行&#xff0c;否则跳转到…...

元旦档首日票房超4.69亿,“下雪场尴尬”上热搜!

哇塞&#xff0c;元旦假期终于来啦&#xff01;&#x1f389;在这个喜庆的时刻&#xff0c;电影院也热闹非凡&#xff0c;据猫眼专业版数据显示&#xff0c;截至12月30日&#xff0c;2023年元旦档首日票房竟然超过了4.69亿&#xff01;这简直是个天文数字啊&#xff01;&#x…...

CentOS系统中设置IP地址的方式和存在的问题

在CentOS系统中设置IP地址通常涉及以下步骤&#xff1a; 打开网络接口配置文件&#xff1a; 使用文本编辑器&#xff08;如vi、nano或emacs&#xff09;打开 /etc/sysconfig/network-scripts/ifcfg-eth0 文件。这里的"eth0"是网卡的名称&#xff0c;如果你的系统中有…...

使用vmware,在ubuntu18.04中使用笔记本的摄像头

步骤1&#xff1a;在windows中检查相机状态 win10系统中&#xff0c;在左下的搜索栏&#xff0c;搜索“相机”&#xff0c;点击进入即可打开相机&#xff0c;并正常显示图像。 注意&#xff1a;如果相机连接到了虚拟机&#xff0c;则不能显示正常。 步骤2&#xff1a;在ubuntu…...

中间件系列 - Redis入门到实战(高级篇-分布式缓存)

前言 学习视频&#xff1a; 黑马程序员Redis入门到实战教程&#xff0c;深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目 中间件系列 - Redis入门到实战 本内容仅用于个人学习笔记&#xff0c;如有侵扰&#xff0c;联系删除 学习目标 Redis持久化Redis主从…...

使用Visual Studio调试VisionPro脚本

使用Visual Studio调试VisionPro脚本 方法一 &#xff1a; 修改项目文件 csproj步骤&#xff1a; 方法二 &#xff1a; Visual Studio附加功能步骤&#xff1a; 方法一 &#xff1a; 修改项目文件 csproj 步骤&#xff1a; 开启VisionPro脚本调试功能 创建一个VisionPro程序…...

Ubuntu安装K8S的dashboard(管理页面)

原文网址&#xff1a;Ubuntu安装k8s的dashboard&#xff08;管理页面&#xff09;-CSDN博客 简介 本文介绍Ubuntu安装k8s的dashboard&#xff08;管理页面&#xff09;的方法。 Dashboard的作用有&#xff1a;便捷操作、监控、分析、概览。 相关网址 官网地址&#xff1a;…...

zookeeper之集群搭建

1. 集群角色 zookeeper集群下&#xff0c;有3种角色&#xff0c;分别是领导者(Leader)、跟随着(Follower)、观察者(Observer)。接下来我们分别看一下这三种角色的作用。 领导者(Leader)&#xff1a; 事务请求&#xff08;写操作&#xff09;的唯一调度者和处理者&#xff0c;保…...

从0开始界面设计师 Qt Designer

QT程序界面的 一个个窗口、控件&#xff0c;就是像上面那样用相应的代码创建出来的。 但是&#xff0c;把你的脑海里的界面&#xff0c;用代码直接写出来&#xff0c;是有些困难的。 很多时候&#xff0c;运行时呈现的样子&#xff0c;不是我们要的。我们经常还要修改代码调整界…...

Html / CSS刷题笔记

WebKit是一个开源的浏览器引擎&#xff0c;它最初是由苹果公司开发的&#xff0c;并且被广泛用于Safari浏览器和其他基于WebKit的浏览器&#xff0c;比如Google Chrome的早期版本。它也是构建许多移动设备浏览器的基础。WebKit的主要功能是解析HTML和CSS&#xff0c;并将其渲染…...

关于“Python”的核心知识点整理大全51

目录 17.2.2 添加自定义工具提示 bar_descriptions.py 17.2.3 根据数据绘图 python_repos.py 17.2.4 在图表中添加可单击的链接 python_repos.py 17.3 Hacker News API hn_submissions.py 17.4 小结 往期快速传送门&#x1f446;&#xff08;在文章最后&#xff09;&a…...

Termius for Mac/Win:一站式终端模拟器、SSH 和 SFTP 客户端软件的卓越选择

随着远程工作和云技术的普及&#xff0c;对于高效安全的远程访问和管理服务器变得至关重要。Termius&#xff0c;一款强大且易用的终端模拟器、SSH 和 SFTP 客户端软件&#xff0c;正是满足这一需求的理想选择。 Termius 提供了一站式的解决方案&#xff0c;允许用户通过单一平…...

vr体验馆用什么软件计时计费,如遇到停电软件程序如何恢复时间

vr体验馆用什么软件计时计费&#xff0c;如遇到停电软件程序如何恢复时间 一、软件程序问答 如下图&#xff0c;软件以 佳易王vr体验馆计时计费软件V17.9为例说明 1、软件如何计时间&#xff1f; 点击相应编号的开始计时按钮即可 2、遇到停电再打开软件时间可以恢复吗&…...

HTML---JavaScript基础

文章目录 目录 文章目录 本章目标 一.JavaScript基础 概述 特点 JavaScript 基本机构 语法 网页中引用JavaScript的方式 二. JavaScript核心语法 变量 ​编辑 数据类型 数组 练习 本章目标 掌握JavaScript的组成掌握JavaScript的基本语法会定义和使用函数会使用工具进行…...

2023年03月17日_微软和谷歌办公AI的感慨

2023年3月17日 最近这个科技圈的消息 有点爆炸的让人应接不暇了 各种大公司简直就是神仙打架 你从来没有见过这么密集的 这么高频的产品发布 昨天微软是发布了Office 365 Copilot 在里边提供了大量的AI的功能 然后谷歌呢也发布了这个Google Workspace AI 也是跟365 Cop…...

2023年新一代开发者工具 Vue ,正式开源!

以下文章来源于前端充电宝 &#xff0c;作者CUGGZ 近日&#xff0c;Vue 新一代开发者工具&#xff08;DevTools&#xff09;正式开源&#xff01;Vue DevTools 是一个旨在增强 Vue 开发人员体验的工具&#xff0c;它提供了一些功能来帮助开发者更好地了解 Vue 应用。下面就来看…...

springboot(ssm校园组团平台 高校组团系统 Java系统

springboot(ssm校园组团平台 高校组团系统 Java系统 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或8.0&#xff09; 数据库…...

QT 利用开源7z 实现解压各种压缩包,包括进度条和文件名的显示(zip,7z,rar,iso等50多种格式)

想做一个winRAR一样的解压软件吗?很简单,利用开源的7z库就能实现。我看网上其他人说的方法不敢苟同,误人子弟。以前自己在项目中使用过7z,这次又有需要,就想记录下来。如果你研究过如何用7z的话,一定知道7z的每一个GUID都代表了一种格式,50多种GUID也就有50多个格式,最…...

androidStudio 没有新建flutter工程的入口?

装了flutter dart 插件 执行了 flutter doctor 也执行了 flutter doctor --android-license 最后重启了 androidStudio 还是没发现在哪新建flutter项目工程 原来 plugins 下的 Android APK Support没有勾选...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...