专业手机网站制作哪家好/狼雨的seo教程
想要学习如何在Kubernetes上自动缩放您的Kinesis Data Streams消费者应用程序,以便节省成本并提高资源效率吗?本文提供了一个逐步指南,教您如何实现这一目标。
通过利用Kubernetes对Kinesis消费者应用程序进行自动缩放,您可以从其内置功能中受益,例如水平Pod自动缩放器(Horizontal Pod Autoscaler)。
▌什么是Amazon Kinesis和Kinesis Data Streams?
Amazon Kinesis是一个用于实时数据处理、摄取和分析的平台。Kinesis Data Streams是一个无服务器的流式数据服务(属于Kinesis流式数据平台的一部分),还包括Kinesis Data Firehose、Kinesis Video Streams和Kinesis Data Analytics。
Kinesis Data Streams可以弹性地扩展,并持续适应数据摄取速率和流消费速率的变化。它可用于构建实时数据分析应用程序、实时仪表板和实时数据管道。
让我们首先概述一些Kinesis Data Streams的关键概念。
▌Kinesis Data Streams:高级架构
-
Kinesis数据流由一组分片组成。每个分片包含一系列数据记录。
-
生产者持续将数据推送到Kinesis Data Streams,消费者实时处理数据。
-
分区键用于在流中按分片分组数据。
-
Kinesis Data Streams将属于流的数据记录分隔到多个分片中。
-
它使用与每个数据记录关联的分区键来确定给定数据记录属于哪个分片。
-
消费者从Amazon Kinesis Data Streams获取记录,对其进行处理,并将结果存储在Amazon DynamoDB、Amazon Redshift、Amazon S3等中。
-
这些消费者也被称为Amazon Kinesis Data Streams应用程序。
-
开发能够处理KDS数据流中的数据的自定义消费者应用程序的一种方法是使用Kinesis Client Library(KCL)。
Kinesis消费者应用程序是如何实现水平扩展的呢?
Kinesis Client Library确保每个分片都有一个记录处理器正在运行,并处理来自该分片的数据。KCL帮助您从Kinesis数据流中消费和处理数据,通过处理与分布式计算和可扩展性相关的许多复杂任务。它连接到数据流,枚举数据流中的分片,并使用租约来协调分片与其消费者应用程序之间的关联。
每个分片都会实例化一个记录处理器来管理。KCL从数据流中拉取数据记录,将记录推送给相应的记录处理器,并检查点处理过的记录。更重要的是,当工作实例数量发生变化或数据流重新分片(分片拆分或合并)时,它会平衡分片-工作器的关联(租约)。这意味着您可以通过添加更多实例来扩展Kinesis Data Streams应用程序,因为KCL会自动在实例之间平衡分片。
但是,当负载增加时,您仍然需要一种方法来扩展应用程序。当然,您可以手动进行操作或构建自定义解决方案来完成此操作。
这就是Kubernetes事件驱动自动缩放(KEDA)的用武之地。KEDA是基于Kubernetes的事件驱动自动缩放组件,它可以监视Kinesis等事件源,并根据需要处理的事件数量来调整底层的部署(和Pod)的规模。
为了观察自动扩展的过程,您将使用一个使用Kinesis Client Library(KCL)2.x从Kinesis数据流中消费数据的Java应用程序。它将部署到Amazon EKS上的Kubernetes集群,并将使用KEDA进行自动缩放。该应用程序包括一个ShardRecordProcessor的实现,该实现处理来自Kinesis流的数据,并将其持久化到DynamoDB表中。我们将使用AWS CLI向Kinesis流中产生数据,并观察应用程序的扩展情况。
在我们深入研究之前,这里是对KEDA的快速概述。
▌什么是KEDA?
KEDA是一个构建在原生Kubernetes原语(如Horizontal Pod Autoscaler)之上的开源CNCF项目,可以添加到任何Kubernetes集群中。以下是其关键组件的高级概述(您可以参考KEDA文档进行深入了解):
-
KEDA中的keda-operator-metrics-apiserver组件充当Kubernetes度量服务器,用于公开Horizontal Pod Autoscaler的度量指标。
-
KEDA Scaler与外部系统(如Redis)集成,以获取这些指标(例如列表长度),根据需要处理的事件数量来驱动Kubernetes中任何容器的自动扩展。
-
keda-operator组件的作用是激活和停用Deployment,即将其扩展到零或从零缩减。
您将看到Kinesis Stream KEDA Scaler的实际效果,它会根据AWS Kinesis Stream的分片数量进行自动扩展。
现在让我们继续进行本文的实际部分。
▌先决条件
除了一个AWS账户之外,您还需要安装AWS CLI、kubectl、Docker、Java 11和Maven。
设置一个EKS集群,创建一个DynamoDB表和一个Kinesis数据流
有多种方法可以创建Amazon EKS集群。我喜欢使用eksctl CLI,因为它提供了很多便利。使用eksctl创建EKS集群可以非常简单,就像这样:
eksctl create cluster --name <cluster name> --region <region e.g. us-east-1>
有关详细信息,请参阅Amazon EKS - eksctl文档中的入门指南。
创建一个DynamoDB表来持久化应用程序数据。您可以使用AWS CLI使用以下命令创建表格:
aws dynamodb create-table \
--table-name users \
--attribute-definitions AttributeName=email,AttributeType=S \
--key-schema AttributeName=email,KeyType=HASH \
--provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5
使用AWS CLI创建一个具有两个分片的Kinesis流,请执行以下命令:
aws kinesis create-stream --stream-name kinesis-keda-demo --shard-count 2
请克隆该GitHub仓库,并切换到正确的目录:
git clone https://github.com/abhirockzz/kinesis-keda-autoscaling
cd kinesis-keda-autoscaling
好的,让我们开始吧!
▌在EKS上设置和配置KEDA
在本教程中,您将使用YAML文件来部署KEDA。但是您也可以使用Helm charts。
安装KEDA:
# update version 2.8.2 if requiredkubectl apply -f https://github.com/kedacore/keda/releases/download/v2.8.2/keda-2.8.2.yaml
验证安装:
# check Custom Resource Definitions
kubectl get crd# check KEDA Deployments
kubectl get deployment -n keda# check KEDA operator logs
kubectl logs -f $(kubectl get pod -l=app=keda-operator -o jsonpath='{.items[0].metadata.name}' -n keda) -n keda
▌配置IAM角色
KEDA操作员和Kinesis消费应用程序需要调用AWS API。由于两者都将作为EKS中的部署运行,我们将使用服务账号的IAM角色(IRSA)来提供必要的权限。
在这种情况下:
-
KEDA操作员需要能够获取Kinesis流的分片数量:它通过使用DescribeStreamSummary API来实现。
-
应用程序(具体而言是KCL库)需要与Kinesis和DynamoDB进行交互:它需要一系列的IAM权限来实现这一点。
配置KEDA操作员的IRSA
将AWS帐户ID和OIDC身份提供者设置为环境变量:
ACCOUNT_ID=$(aws sts get-caller-identity --query "Account" --output text)#update the cluster name and region as required
export EKS_CLUSTER_NAME=demo-eks-cluster
export AWS_REGION=us-east-1OIDC_PROVIDER=$(aws eks describe-cluster --name $EKS_CLUSTER_NAME --query "cluster.identity.oidc.issuer" --output text | sed -e "s/^https:\/\///")
创建一个包含角色的受信任实体的JSON文件:
read -r -d '' TRUST_RELATIONSHIP <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::${ACCOUNT_ID}:oidc-provider/${OIDC_PROVIDER}"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"${OIDC_PROVIDER}:aud": "sts.amazonaws.com",
"${OIDC_PROVIDER}:sub": "system:serviceaccount:keda:keda-operator"
}
}
}
]
}
EOF
echo "${TRUST_RELATIONSHIP}" > trust_keda.json
现在,创建IAM角色并附加策略(请查看policy_kinesis_keda.json文件以获取详细信息):
export ROLE_NAME=keda-operator-kinesis-roleaws iam create-role --role-name $ROLE_NAME --assume-role-policy-document file://trust_keda.json --description "IRSA for kinesis KEDA scaler on EKS"aws iam create-policy --policy-name keda-kinesis-policy --policy-document file://policy_kinesis_keda.json
aws iam attach-role-policy --role-name $ROLE_NAME --policy-arn=arn:aws:iam::${ACCOUNT_ID}:policy/keda-kinesis-policy
关联IAM角色和服务账号:
kubectl annotate serviceaccount -n keda keda-operator eks.amazonaws.com/role-arn=arn:aws:iam::${ACCOUNT_ID}:role/${ROLE_NAME}# verify the annotation
kubectl describe serviceaccount/keda-operator -n keda
您需要重新启动KEDA操作员部署以使其生效:
kubectl rollout restart deployment.apps/keda-operator -n keda# to verify, confirm that the KEDA operator has the right environment variables
kubectl describe pod -n keda $(kubectl get po -l=app=keda-operator -n keda --output=jsonpath={.items..metadata.name}) | grep "^\s*AWS_"# expected outputAWS_STS_REGIONAL_ENDPOINTS: regional
AWS_DEFAULT_REGION: us-east-1
AWS_REGION: us-east-1
AWS_ROLE_ARN: arn:aws:iam::<AWS_ACCOUNT_ID>:role/keda-operator-kinesis-role
AWS_WEB_IDENTITY_TOKEN_FILE: /var/run/secrets/eks.amazonaws.com/serviceaccount/token
为KCL消费者应用程序配置IRSA
首先创建一个Kubernetes服务帐号:
kubectl apply -f - <<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
name: kcl-consumer-app-sa
EOF
创建一个包含角色的受信实体的JSON文件:
read -r -d '' TRUST_RELATIONSHIP <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::${ACCOUNT_ID}:oidc-provider/${OIDC_PROVIDER}"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"${OIDC_PROVIDER}:aud": "sts.amazonaws.com",
"${OIDC_PROVIDER}:sub": "system:serviceaccount:default:kcl-consumer-app-sa"
}
}
}
]
}
EOF
echo "${TRUST_RELATIONSHIP}" > trust.json
现在,创建IAM角色并附加策略(请查看policy.json文件以获取详细信息):
export ROLE_NAME=kcl-consumer-app-roleaws iam create-role --role-name $ROLE_NAME --assume-role-policy-document file://trust.json --description "IRSA for KCL consumer app on EKS"aws iam create-policy --policy-name kcl-consumer-app-policy --policy-document file://policy.jsonaws iam attach-role-policy --role-name $ROLE_NAME --policy-arn=arn:aws:iam::${ACCOUNT_ID}:policy/kcl-consumer-app-policy
关联IAM角色和服务账号:
kubectl annotate serviceaccount -n default kcl-consumer-app-sa eks.amazonaws.com/role-arn=arn:aws:iam::${ACCOUNT_ID}:role/${ROLE_NAME}# verify the annotation
kubectl describe serviceaccount/kcl-consumer-app-sa
核心基础架构已准备就绪。让我们准备并部署消费者应用程序。
▌将KCL消费者应用程序部署到EKS
首先,您需要构建Docker镜像并将其推送到Amazon Elastic Container Registry(ECR)(请参阅Dockerfile获取详细信息)。
构建并推送Docker镜像到ECR
# create runnable JAR file
mvn clean compile assembly\:single# build docker image
docker build -t kcl-consumer-app .AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query "Account" --output text)# create a private ECR repo
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.us-east-1.amazonaws.comaws ecr create-repository --repository-name kcl-consumer-app --region us-east-1# tag and push the image
docker tag kcl-consumer-app:latest $AWS_ACCOUNT_ID.dkr.ecr.us-east-1.amazonaws.com/kcl-consumer-app:latest
docker push $AWS_ACCOUNT_ID.dkr.ecr.us-east-1.amazonaws.com/kcl-consumer-app:latest
部署消费者应用程序
更新consumer.yaml文件,将刚刚推送到ECR的Docker镜像包含在内。其他部分的清单保持不变。
apiVersion: apps/v1
kind: Deployment
metadata:name: kcl-consumer
spec:replicas: 1selector:matchLabels:app: kcl-consumertemplate:metadata:labels:app: kcl-consumerspec:serviceAccountName: kcl-consumer-app-sacontainers:- name: kcl-consumerimage: AWS_ACCOUNT_ID.dkr.ecr.us-east-1.amazonaws.com/kcl-consumer-app:latestimagePullPolicy: Alwaysenv:- name: STREAM_NAMEvalue: kinesis-keda-demo- name: TABLE_NAMEvalue: users- name: APPLICATION_NAMEvalue: kinesis-keda-demo- name: AWS_REGIONvalue: us-east-1- name: INSTANCE_NAMEvalueFrom:fieldRef:fieldPath: metadata.name
创建部署(Deployment):
kubectl apply -f consumer.yaml# verify Pod transition to Running state
kubectl get pods -w
▌KEDA 中的 KCL 应用自动扩展
现在您已经部署了消费者应用程序,KCL 库应该开始运行了。它首先会在 DynamoDB 中创建一个“控制表”,这个表的名称应与 KCL 应用程序的名称相同(在本例中为 kinesis-keda-demo)。
初始的协调和表的创建可能需要几分钟时间。您可以查看消费者应用程序的日志来跟踪进展。
kubectl logs -f $(kubectl get po -l=app=kcl-consumer --output=jsonpath={.items..metadata.name})
完成租赁分配后,请检查表并注意 leaseOwner 属性:
aws dynamodb describe-table --table-name kinesis-keda-demo
aws dynamodb scan --table-name kinesis-keda-demo
现在,让我们使用 AWS CLI 向 Kinesis 流发送一些数据。
kubectl apply -f consumer.yaml# verify Pod transition to Running state
kubectl get pods -w
KCL 应用程序将每条记录持久化到目标 DynamoDB 表中(在本例中为 users)。您可以检查该表以验证记录。
aws dynamodb scan --table-name users
注意 processed_by 属性的值?它与 KCL 消费者 Pod 的名称相同。这将使我们更容易验证端到端的自动扩展过程。
创建 Kinesis 的 KEDA Scaler
以下是 ScaledObject 的定义。请注意,它针对的是 kcl-consumer Deployment(我们刚刚创建的那个),并且 shardCount 设置为 1:
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: aws-kinesis-stream-scaledobject
spec:
scaleTargetRef:
name: kcl-consumer
triggers:
- type: aws-kinesis-stream
metadata:
# Required
streamName: kinesis-keda-demo
# Required
awsRegion: "us-east-1"
shardCount: "1"
identityOwner: "operator"
创建 KEDA Kinesis Scaler:
kubectl apply -f keda-kinesis-scaler.yaml
验证 KCL 应用程序的自动伸缩
我们从一个 KCL 应用程序的 Pod 开始。但是,多亏了 KEDA,我们现在应该看到第二个 Pod 正在启动。
kubectl get pods -l=app=kcl-consumer -w# check logs of the new pod
kubectl logs -f <enter Pod name>
我们的应用程序能够根据 ScaledObject 定义中的 shardCount: "1" 自动扩展到两个 Pod。这意味着 Kinesis 流中的每个 shard 都会有一个 Pod。
在 DynamoDB 中检查 kinesis-keda-demo 控制表:您应该看到 leaseOwner 的更新。
让我们向 Kinesis 流发送更多的数据。
export KINESIS_STREAM=kinesis-keda-demoaws kinesis put-record --stream-name $KINESIS_STREAM --partition-key user5@foo.com --data $(echo -n '{"name":"user5", "city":"new york"}' | base64)
aws kinesis put-record --stream-name $KINESIS_STREAM --partition-key user6@foo.com --data $(echo -n '{"name":"user6", "city":"tel aviv"}' | base64)
aws kinesis put-record --stream-name $KINESIS_STREAM --partition-key user7@foo.com --data $(echo -n '{"name":"user7", "city":"new delhi"}' | base64)
aws kinesis put-record --stream-name $KINESIS_STREAM --partition-key user8@foo.com --data $(echo -n '{"name":"user8", "city":"seattle"}' | base64)
验证 "processed_by" 属性的值。由于我们已经扩展到两个 Pod,每条记录的值应该不同,因为每个 Pod 将处理 Kinesis 流的一部分记录。
增加 Kinesis 流容量
让我们将 shard 的数量从两个扩展到三个,并继续监视 KCL 应用程序的自动缩放。
aws kinesis update-shard-count --stream-name kinesis-keda-demo --target-shard-count 3 --scaling-type UNIFORM_SCALING
一旦 Kinesis 重新划分完成,KEDA 扩展器将开始工作,将 KCL 应用程序扩展到三个 Pod。
kubectl get pods -l=app=kcl-consumer -w
就像之前一样,确认在 DynamoDB 的 kinesis-keda-demo 控制表中,Kinesis shard 的租约已更新。检查 leaseOwner 属性。
继续向 Kinesis 流发送更多数据。正如预期的那样,Pod 将共享记录处理,并且在 users 表中的 processed_by 属性中会反映出来。
export KINESIS_STREAM=kinesis-keda-demoaws kinesis put-record --stream-name $KINESIS_STREAM --partition-key user9@foo.com --data $(echo -n '{"name":"user9", "city":"new york"}' | base64)
aws kinesis put-record --stream-name $KINESIS_STREAM --partition-key user10@foo.com --data $(echo -n '{"name":"user10", "city":"tel aviv"}' | base64)
aws kinesis put-record --stream-name $KINESIS_STREAM --partition-key user11@foo.com --data $(echo -n '{"name":"user11", "city":"new delhi"}' | base64)
aws kinesis put-record --stream-name $KINESIS_STREAM --partition-key user12@foo.com --data $(echo -n '{"name":"user12", "city":"seattle"}' | base64)
aws kinesis put-record --stream-name $KINESIS_STREAM --partition-key user14@foo.com --data $(echo -n '{"name":"user14", "city":"tel aviv"}' | base64)
aws kinesis put-record --stream-name $KINESIS_STREAM --partition-key user15@foo.com --data $(echo -n '{"name":"user15", "city":"new delhi"}' | base64)
aws kinesis put-record --stream-name $KINESIS_STREAM --partition-key user16@foo.com --data $(echo -n '{"name":"user16", "city":"seattle"}' | base64)
缩小规模
到目前为止,我们只进行了单向的扩展。当我们减少 Kinesis 流的分片容量时会发生什么?自己尝试一下:将分片数量从三个减少到两个,观察 KCL 应用的情况。
一旦您验证了端到端的解决方案,应清理资源,以避免产生额外的费用。
▌删除资源
删除 EKS 集群、Kinesis 流和 DynamoDB 表。
eksctl delete cluster --name keda-kinesis-demo
aws kinesis delete-stream --stream-name kinesis-keda-demo
aws dynamodb delete-table --table-name users
▌结论
在本文中,您学习了如何使用 KEDA 自动扩展从 Kinesis 流中消费数据的 KCL 应用程序。
您可以根据应用程序的要求配置 KEDA 扩展器。例如,您可以将 shardCount 设置为 3,并为 Kinesis 流中的每三个分片设置一个 Pod。但是,如果您希望保持一对一的映射关系,可以将 shardCount 设置为 1,KCL 将负责分布式协调和租约分配,确保每个 Pod 具有一个记录处理器的实例。这是一种有效的方法,可以根据应用程序的需求扩展 Kinesis 流处理管道,以满足需求。
作者:Abhishek Gupta
更多技术干货请关注公号“云原生数据库”
squids.cn,基于公有云基础资源,提供云上 RDS,云备份,云迁移,SQL 窗口门户企业功能,
帮助企业快速构建云上数据库融合生态。
相关文章:

自动缩放Kubernetes上的Kinesis Data Streams应用程序
想要学习如何在Kubernetes上自动缩放您的Kinesis Data Streams消费者应用程序,以便节省成本并提高资源效率吗?本文提供了一个逐步指南,教您如何实现这一目标。 通过利用Kubernetes对Kinesis消费者应用程序进行自动缩放,您可以从其…...

介绍js各种事件
目录 一、点击事件 二、鼠标移动事件 三、键盘事件 四、滚轮事件 五、拖放事件 六、窗口大小改变事件 一、点击事件 点击事件是指当用户单击页面上的某个元素时触发的事件。这是最常见和基础的事件之一,也是Web应用程序中最常用的交互之一。 以下是如何使用…...

Python 将 CSV 分割成多个文件
文章目录 使用 Pandas 在 Python 中创建 CSV 文件在 Python 中将 CSV 文件拆分为多个文件根据行拆分 CSV 文件根据列拆分 CSV 文件 总结 在本文中,我们将学习如何在 Python 中将一个 CSV 文件拆分为多个文件。 我们将使用 Pandas 创建一个 CSV 文件并将其拆分为多个…...

S32K144开发板
目录 一.S32K144开发板概述 二.产品技术和功能规格 三.开发环境 1.S32K144的开发环境主流是这么三种: 2.开发板Demo工程 四.S32K144开发板实物图 五、汽车大灯硬件架构 一.S32K144开发板概述 S32K14…...

三波混频下的相位失配原理
原理推导 在四波混频情况下,实现零相位失配是一件很困难的事情。因为在四波混频中,相位调制和增益都依赖于相同的参数,即克尔非线性 γ \gamma γ。这个问题可以用嵌入在传输线上的辅助共振元件的复杂色散工程来部分解决。 但是在三波混频中…...

软考A计划-试题模拟含答案解析-卷一
点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…...

Ubuntu下编译运行MicroPython Unix版本
文章目录 github拉取源码更新模块编译运行 github拉取源码 到Github(https://github.com/micropython/micropython)上下载源码 终端输入,如果提示识别不到gh命令,就sudo apt-get install gc安装一下。 再根据提示在终端里登录自己的github账号。 再次…...

实现用QCustomPlot封装的插件,放到绘图软件中可以点击和移动
首先,我们需要在绘图软件中创建一个插件,并将QCustomPlot控件添加到插件中。QCustomPlot是一个功能强大的绘图控件,可以轻松创建各种类型的图表,包括折线图、散点图、柱状图等等。 接下来,我们需要为QCustomPlot控件添加鼠标事件处理函数,以实现点击和移动的功能。QCust…...

【源码解析】Nacos配置热更新的实现原理
使用入门 使用RefreshScopeValue,实现动态刷新 RestController RefreshScope public class TestController {Value("${cls.name}")private String clsName;}使用ConfigurationProperties,通过Autowired注入使用 Data ConfigurationProperti…...

界面组件DevExpress ASP.NET Core v22.2 - UI组件升级
DevExpress ASP.NET Core Controls使用强大的混合方法,结合现代企业Web开发工具所期望的所有功能。该套件通过ASP.NET Razor标记和服务器端ASP.NET Core Web API的生产力和简便性,提供客户端JavaScript的性能和灵活性。ThemeBuilder工具和集成的Material…...

阿里系文生图(PAI+通义)
PAI-Diffusion模型来了!阿里云机器学习团队带您徜徉中文艺术海洋 - 知乎作者:汪诚愚、段忠杰、朱祥茹、黄俊导读近年来,随着海量多模态数据在互联网的爆炸性增长和训练深度学习大模型的算力大幅提升,AI生成内容(AI Gen…...

Netty概述及Hello word入门
目录 概述 Netty是什么 Netty的地位 Netty的优势 HelloWord入门程序 目标 pom依赖 服务器端 客户端 运行结果 入门把握理解 概述 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable hi…...

汇编寄存器之内存访问
1.内存中字的存储: 在CPU中用一个16位寄存器来存储一个字, 高8位存高字节,低8位存低字节 如AX寄存器存在一个字,那么AH存高字节,AL存低字节 在内存中存储字时是用两个连续的字节来存储字的, 这个字的低字节存在低单元,高字节存在高单元. 如下表示: 内存单元编号 单元中…...

C++进阶 —— lambda表达式(C++11新特性)
目录 一,模板函数sort 二,lambda表达式 一,模板函数sort 在C98中,如对一个数据集合中的元素进行排序,可使用模板函数sort,如元素为自定义类型,需定义排序时的比较规则;随着C的发展…...

数据结构04:串的存储结构与KMP算法
前言 参考用书:王道考研《2024年 数据结构考研复习指导》 参考用书配套视频:4.1_1_串的定义和基本操作_哔哩哔哩_bilibili 特别感谢: Google Bard老师[解释KMP,修改BUG]、Chat GPT老师[修改BUG]、BING老师[封面图]~ 当我请求BI…...

零基础快速搭建私人影音媒体平台
目录 1. 前言 2. Jellyfin服务网站搭建 2.1. Jellyfin下载和安装 2.2. Jellyfin网页测试 3.本地网页发布 3.1 cpolar的安装和注册 3.2 Cpolar云端设置 3.3 Cpolar本地设置 4.公网访问测试 5. 结语 转载自cpolar极点云的文章:零基础搭建私人影音媒体平台【…...

C++map和set
目录: 什么是关联式容器?键值对树形结构的关联式容器 set的概念multiset的使用pair和make_pair map的概念用“[]”实现统计水果的次数 multimap的使用 什么是关联式容器? 在初阶阶段,我们已经接触过STL中的部分容器,比…...

python接口测试之测试报告
在本文章中,主要使用jenkins和编写的自动化测试代码,来生成漂亮的测试报告,关于什么是CI这些我就不详细的介绍了,这里我们主要是实战为主。 首先搭建java的环境,这个这里不做介绍。搭建好java的环境后,在h…...

HGFormer:用于领域广义语义分割的层级式分组Transformer
文章目录 HGFormer: Hierarchical Grouping Transformer for Domain Generalized Semantic Segmentation摘要本文方法实验结果 HGFormer: Hierarchical Grouping Transformer for Domain Generalized Semantic Segmentation 摘要 目前的语义分割模型在独立同分布条件下取得了…...

async函数用法
目录 1.概念 2.本质 3.语法 4.特点 5.async基本使用 6.async里的await普通函数返回值 7.async里的await Promise函数成功返回值 8.async里的await Promise函数失败返回值 9.解决async里的await Promise函数失败后不执行下面内容 1.概念 真正意义上解决异步回调的问题&am…...

简谈软件版本周期 | Alpha、Beta、RC、Stable版本之间的区别
目录 💌 引言 ⭕ 软件版本周期 🛠️ 软件开发期 ⚖️ 软件完成期 💰 商业软件版本 💌 引言 定义好版本号,对于产品的版本发布与持续更新很重要;但是对于版本怎么定义,规则如何确定&#x…...

VS2022发布独立部署的.net程序
.net core支持依赖框架部署和独立部署两种方式,之前学习时是在VSCode中使用dotnet命令发布的。但是在VS2022中却不知道该如何设置。以获取PDF文件使用字体的项目为例,VS2022中默认编译的是依赖框架部署方式(编译的结果如下图所示)…...

5-网络初识——封装和分用
目录 1.数据封装的过程 2.数据分用的过程 PS:网络数据传输的基本流程(以QQ为例,A给B发送一个hello): 一、发送方: 二、接收方: 不同的协议层对数据包有不同的称谓,在传输层叫做…...

机器学习——特征工程
对于机器学习特征工程的知识,你是怎样理解“特征” 在机器学习中,特征(Feature)是指从原始数据中提取出来的、用于训练和测试机器学习模型的各种属性、变量或特点。特征可以是任何类型的数据,例如数字、文本、图像、音…...

ubuntu安装搜狗输入法,图文详解+踩坑解决
搜狗输入法已支持Ubuntu16.04、18.04、19.10、20.04、20.10,本教程系统是基于ubuntu18.04 一、添加中文语言支持 系统设置—>区域和语言—>管理已安装的语言—>在“语言”tab下—>点击“添加或删除语言”。 弹出“已安装语言”窗口,勾选中文…...

docker 数据持久化
目录 一、将本地目录直接映射到容器里(运行成容器时候进行映射) 二、数据卷模式 1、创建数据卷 2、查看数据卷列表,有哪些数据卷 3、查看某个数据卷 4、容器目录挂载到数据卷 5、数据卷的优势:多个容器共享一个数据卷 默认…...

Pytest运行指定的case,这个方法真的很高效……
Pytest运行指定的case 在测试工作中,当我们写了较多的cases时,如果每次都要全部运行一遍,无疑是很浪费时间的,而且效率低下。 但是有一种方法可以帮助你快速地运行指定的测试用例,提高测试效率,那就是使用…...

操作系统复习2.3.4-进程同步问题
生产者-消费者 系统中有一组生产者进程和一组消费者进程 两者共享一个初始为空,大小为n的缓冲区 缓冲区没满,生产者才能放入 缓冲区没空,消费者才能取出 互斥地访问缓冲区 互斥要在同步之后,不然会导致想要同步,但由…...

3ds MAX 基本体建模,长方体、圆柱体和球体
3ds MAX基本页面如下: 生成新的几何体在右侧: 选择生成的对象类型即可,以下为例子: 1、长方体建模 选择建立的对象类型为长方形 在 任意一个窗口绘制,鼠标滑动 这里选择左上角的俯视图 松开鼠标后,可以…...

搭建个人博客
个人网站用处有很多,可以写博客来记录学习过程中的各种事,不管是新知识还是踩坑记录,写完就丢在网站上,方便日后复习,也可以共享给他人,让其他人避免踩雷。 当然也不仅限于技术性的文章,生活中有…...