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

从“分散”到“统一”,中控技术利用SeaTunnel构建高效数据采集框架,核心数据同步任务0故障运行!

作者 | 崔俊乐

引言:对企业而言,数据采集的核心挑战从来不仅仅是“同步”,而是如何在大规模、多元异构的复杂环境下,保障数据的准确性、完整性和时效性。本文将深入探讨中控技术基于 Apache SeaTunnel 构建企业级数据采集框架的实践,重点分享集群高可用配置、性能调优、容错机制及数据质量监控等方面的具体思考与方案。

1、困境:烟囱林立的采集架构与高昂的运维代价

作为深度赋能流程工业的工业AI平台型公司,中控技术的全球业务不断发展,目前已拥有近40多家全球子公司,服务超35000家全球客户。业务的不断扩张对数据工作提出了更高要求:数据不仅要“算得快”,更要“落得准”。为此,我们搭建了流批分离的大数据平台以应对复杂场景。然而,平台本身的复杂度却反向加剧了数据采集、开发和运维的难度,特别是在数据采集这一源头环节,我们面临着严峻挑战:

(1)架构复杂,烟囱林立:我们过去长期依赖多种工具拼凑的方案(如使用Sqoop进行批式数据同步至HDFS,借助Maxwell/StreamSets处理数据库增量日志并写入Kafka/Kudu)。这种“打补丁”式的架构使得技术栈碎片化,维护成本高昂。

(2)运维黑洞,疲于奔命:多套路线意味着双倍的运维监控压力。缺乏统一的监控告警机制,任何一方出现异常(如:同步延迟、资源耗尽),都需要投入大量人力进行排查和“救火”,稳定性难以保障。

(3)能力割裂,难以扩展:当面临新的数据源(国产数据库和SAP HANA等数据库),我们需要在不同的工具中寻找适配方案或自行开发插件,无法快速响应业务需求。

上图清晰地展示了过去分散的采集生态。 我们意识到,这种“各自为战”的模式已成为数据中最脆弱的一环,不仅无法匹配公司未来的发展速度,数据质量与时效性存在潜在威胁。打造一个统一、稳定、高效的数据采集框架,已变得至关重要且迫在眉睫。

2、破局:统一采集框架的思考与技术选型

经过深度的分析和思考,我们明确了新技术的五大核心选型标准:

(1) 全面的连接能力:能够完全覆盖公司当前与未来的所有数据源类型(从MySQL、Oracle、HANA到Kafka、StarRocks等),并同时支持离线与实时两种采集模式,从根本上解决技术栈统一的问题。

(2) 集群稳定性与高可用:框架本身必须是高可用的分布式集群,具备强大的容错能力。即使单个节点故障,整个服务也不应中断,且能够自动恢复,保障数据采集管道的持续运行。

(3) 可靠的数据一致性保障:在任务执行层面,必须提供精确一次(Exactly-Once)或至少一次(At-Least-Once)处理语义,确保在任务因异常中断后能够自动从断点恢复,杜绝数据重复或丢失,这是数据质量的基石。

(4) 强劲的吞吐性能: 必须能够轻松应对我们日均TB级的数据增量挑战,其架构应支持水平扩展,可通过增加节点来线性提升同步性能,满足业务高速发展带来的数据增长需求。

(5) 可观测的运维体验:必须提供完善的监控告警机制,能够对数据同步过程中的异常、延迟、吞吐量等关键指标进行实时追踪,并及时通知运维人员,变被动“救火”为主动“预警”。

基于这五大标准,我们对业界主流方案进行了深入的调研与对比测试。最终, Apache SeaTunnel 在所有维度上都表现出色,成为我们破局的最优解。

我们的核心诉求 Apache SeaTunnel 的解决方案
全面的连接能力 拥有极其丰富的 Connector 生态,官方支持上百种源库/目标库的读写,完全覆盖了我们所有数据类型,一套框架即可统一离线和实时采集。
集群稳定性与高可用 SeaTunnel Engine 分离模式架构,即使单个 Master 或者 Worker 节点异常,也不会影响采集任务的持续性。
可靠的数据一致性保障 提供了强大的容错机制,支持精确一次(Exactly-Once)语义,并能通过 Checkpoint 机制实现任务异常后的自动断点续传,确保数据不丢不重。
强劲的吞吐性能 具备出色的分布式数据处理能力,通过简单配置即可调整并行度,轻松实现水平扩展。
可观测的运维体验 提供了丰富的监控指标,并可无缝集成 Prometheus、Grafana 和 AlertManager 主流监控告警体系,让我们对数据采集过程了如指掌。

3、实践:具体实施方案与细节

我们的Apache SeaTunnel实践之路,也是项目的成长之路。早期,我们基于 Apache SeaTunnel v2.3.5 进行构建,当时为了满足一些特定的需求(如处理不同数据库表名或字段名的大小写敏感问题),我们进行了一些二次开发工作。

然而,随着SeaTunnel社区的飞速发展,新版本的功能和转换器日益完善。当我们将集群顺利升级至 Apache SeaTunnel v2.3.11时惊喜地发现,过去那些需要定制化开发的需求,在新版本中均已得到原生支持。

目前,我们所有的数据同步任务均基于官方版本实现,实现了零改造,这极大地降低了我们的长期维护成本,并能让我们无缝享受社区带来的最新功能和性能提升。

以下是我们基于v2.3.11版本,经过生产环境TB级数据量验证的核心实施方案,为我们集群自搭建以来0故障的卓越表现,奠定了坚实基础。

(1)集群规划

为保障集群的高可用性,建议优先选择分离模式集群部署,以下是我们使用的资源。

节点 CPU 内存 磁盘 JVM Heap
Master-01 8C 32G 200G 30G
Master-02 8C 32G 200G 30G
Worker-01 16C 64G 500G 62G
Worker-02 16C 64G 500G 62G
Worker-03 16C 64G 500G 62G

(2)集群关键配置文件

  • seatunnel.yaml
    该配置文件主要用于定义作业的执行行为、容错机制和运维监控设置。它通过启用类加载缓存和动态资源分配来优化性能,并通过配置基于S3的检查点(Checkpoint)来保障作业的容错与数据一致性。此外,还可以开启指标收集、日志管理以及设置,从而为作业的稳定运行、监控和日常管理提供全面支持。
seatunnel:
engine:
# 类加载器缓存模式:开启后可显著提升作业频繁启停时的性能,减少类加载开销。生产环境建议开启。
classloader-cache-mode: true# 历史作业数据过期时间(单位:分钟): 3天。超过此时间的已完成作业历史信息将被自动清理。
history-job-expire-minutes: 4320# 数据备份数量
backup-count: 1# 队列类型:阻塞队列
queue-type: blockingqueue# 执行信息打印间隔(秒):每隔60秒在日志中打印一次作业执行信息。
print-execution-info-interval: 60# 作业指标信息打印间隔(秒):每隔60秒在日志中打印一次详细的指标信息。
print-job-metrics-info-interval: 60slot-service:
# 动态Slot管理:开启后,引擎会根据节点资源情况动态分配计算槽位(Slot),提高资源利用率。
dynamic-slot: true# 检查点(Checkpoint)配置。
checkpoint:
interval: 60000 # 两次Checkpoint之间的时间间隔,单位毫秒(ms)。此处为1分钟。
timeout: 600000 # 执行Checkpoint的超时时间,单位毫秒(ms)。此处为10分钟。
storage:
type: hdfs # 此处声明存储类型为HDFS,实际存储在下方的S3。
max-retained: 3 # 最多保留的Checkpoint历史数量。旧的Checkpoint会被自动删除以节省空间。
plugin-config:
storage.type: s3 # 实际配置存储类型为S3(或MinIO等兼容S3协议的对象存储)
fs.s3a.access.key: xxxxxxx # S3兼容存储的访问密钥(Access Key)
fs.s3a.secret.key: xxxxxxx # S3兼容存储的私有密钥(Secret Key)
fs.s3a.endpoint: http://xxxxxxxx:8060 # S3兼容存储的服务端点(Endpoint)地址
s3.bucket: s3a://seatunel-pro-bucket # 用于存储Checkpoint数据的桶(Bucket)名称
fs.s3a.aws.credentials.provider: org.apache.hadoop.fs.s3a.SimpleAWSCredentialsProvider # 认证凭证提供者
# 可观测性配置
telemetry:
metric:
enabled: true # 开启指标(Metrics)收集
logs:
# 启用日志定时删除:开启日志文件的自动清理功能,防止日志占满磁盘。
scheduled-deletion-enable: true# Web UI 和 REST API 配置
http:
enable-http: true # 启用Web UI和HTTP REST API服务
port: 8080 # Web服务绑定的端口号
enable-dynamic-port: false # 禁用动态端口。如果8080被占用,是否启用其他端口。
# 以下为Web UI基础认证配置
enable-basic-auth: true # 启用基础身份认证
basic-auth-username: admin # 登录用户名
basic-auth-password: xxxxxxx # 登录密码
  • jvm_master_options
    该JVM参数配置文件主要用于保障SeaTunnel引擎在大规模数据处理时的稳定性和性能。通过设定堆内存与元空间容量来提供基础内存保障,并专门针对G1垃圾回收器进行了系列优化,以有效管理内存垃圾、控制回收停顿时间并提升运行效率。
# JVM 堆内存
-Xms30g
-Xmx30g# 内存溢出诊断:当发生OOM时自动生成Heap Dump文件,保存至指定路径便于后续分析。
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/tmp/seatunnel/dump/zeta-server# 元空间:限制最大容量为5GB,防止元数据无限膨胀占用过多本地内存。
-XX:MaxMetaspaceSize=5g# G1垃圾回收器相关配置
-XX:+UseG1GC # 启用G1垃圾回收器
-XX:+PrintGCDetails # 在日志中打印详细的GC信息
-Xloggc:/path/to/gc.log # 将GC日志输出到指定文件
-XX:+PrintGCDateStamps # 在GC日志中打印时间戳
-XX:MaxGCPauseMillis=5000 # 目标最大GC暂停时间为5000毫秒(5秒)
-XX:InitiatingHeapOccupancyPercent=50 # 当堆内存使用率达到50%时启动并发GC周期
-XX:+UseStringDeduplication # 启用字符串去重,节省内存空间
-XX:GCTimeRatio=4 # 设置GC时间与应用时间的目标比例
-XX:G1ReservePercent=15 # 保留15%的堆内存
-XX:ConcGCThreads=6 # 设置并发GC阶段使用的线程数为6
-XX:G1HeapRegionSize=32m # 设置G1分区大小为32MB
  • hazelcast-master.yaml(iMap存储在自建对象存储)
    该配置文件定义了SeaTunnel引擎集群的底层分布式架构与协同机制。它主要用于建立和管理集群节点间的网络通信。配置还包含了高精度的故障检测心跳机制,以确保能快速发现并处理节点失效问题,保障集群的高可用性。同时,启用了基于S3兼容存储的分布式数据持久化功能,将关键状态信息可靠地保存到对象存储中。
hazelcast:
cluster-name: seatunnel # 集群名称,所有节点需保持一致
network:
rest-api:
enabled: true # 启用REST API
endpoint-groups:
CLUSTER_WRITE:
enabled: true
DATA:
enabled: true
join:
tcp-ip:
enabled: true # 使用TCP/IP发现机制
member-list: # 集群节点列表
- 10.xx.xx.xxx:5801
- 10.xx.xx.xxx:5801
- 10.xx.xx.xxx:5802
- 10.xx.xx.xxx:5802
- 10.xx.xx.xxx:5802
port:
auto-increment: false # 禁用端口自动递增
port: 5801 # 固定使用5801端口
properties:
hazelcast.invocation.max.retry.count: 20 # 调用最大重试次数
hazelcast.tcp.join.port.try.count: 30 # TCP连接端口尝试次数
hazelcast.logging.type: log4j2 # 使用log4j2日志框架
hazelcast.operation.generic.thread.count: 50 # 通用操作线程数
hazelcast.heartbeat.failuredetector.type: phi-accrual # 使用Phi-accrual故障检测器
hazelcast.heartbeat.interval.seconds: 2 # 心跳间隔(秒)
hazelcast.max.no.heartbeat.seconds: 180 # 无心跳超时时间(秒)
hazelcast.heartbeat.phiaccrual.failuredetector.threshold: 10 # 故障检测阈值
hazelcast.heartbeat.phiaccrual.failuredetector.sample.size: 200 # 检测样本大小
hazelcast.heartbeat.phiaccrual.failuredetector.min.std.dev.millis: 100 # 最小标准差(毫秒)
hazelcast.operation.call.timeout.millis: 150000 # 操作调用超时时间(毫秒)
map:
engine*:
map-store:
enabled: true # 启用Map存储持久化
initial-mode: EAGER # 启动时立即加载所有数据
factory-class-name: org.apache.seatunnel.engine.server.persistence.FileMapStoreFactory # 持久化工厂类
properties:
type: hdfs # 存储类型
namespace: /seatunnel/imap # 命名空间路径
clusterName: seatunnel-cluster # 集群名称
storage.type: s3 # 实际使用S3兼容存储
fs.s3a.access.key: xxxxxxxxxxxxxxxx # S3访问密钥
fs.s3a.secret.key: xxxxxxxxxxxxxxxx # S3私有密钥
fs.s3a.endpoint: http://xxxxxxx:8060 # S3端点地址
s3.bucket: s3a://seatunel-pro-bucket # S3存储桶名称
fs.s3a.aws.credentials.provider: org.apache.hadoop.fs.s3a.SimpleAWSCredentialsProvider # 认证提供者

(3)采集任务示例

① MySQL-CDC到StarRocks

采集MySQL-CDC数据需要确保源数据库需要开启了Binlog,格式为ROW,需要用户拥有相关权限,并且把对应的Mysql Jar包放入 ${SEATUNNEL_HOME}/lib目录。详情可以参考官网:https://seatunnel.apache.org/zh-CN/docs/2.3.11/connector-v2/source/MySQL-CDC。

下方是我们采集MySQL-CDC的配置样例。

env {
parallelism = 1 # 并行度设置为1,流式采集只能是1
job.mode = "STREAMING" # 流式作业模式
job.name = cdh2sr # 作业名称标识
job.retry.times = 3 # 作业失败重试次数
job.retry.interval.seconds=180 # 重试间隔时间(秒)
}source {
MySQL-CDC {
base-url = "jdbc:mysql://xxxxxxx:3306/databasename" # MySQL连接地址
username = "xxxxxxr" # 数据库用户名
password = "xxxxxx" # 数据库密码
table-names = ["databasename.table1","databasename_pro.table2"] # 需要同步的表列表,格式:数据库.表名
startup.mode = "latest" # 从最新位点开始同步
exactly_once = true # 启用精确一次语义
debezium {
include.schema.changes = "false" # 不包含Schema变更
snapshot.mode = when_needed # 按需进行快照
}
}
}transform {
TableRename {
plugin_input = "cdc" # 输入插件标识
plugin_output = "rs" # 输出插件标识
convert_case = "LOWER" # 表名转换为小写
prefix = "ods_cdh_databasename_" # 添加表名前缀
}
}sink {
StarRocks {
plugin_input = "rs" # 输入插件标识(与transform输出一致)
nodeUrls = ["xxxxxxx:8030","xxxxxxx:8030","xxxxxxx:8030"] # StarRocks FE节点地址
base-url = "jdbc:mysql://xxxxxxx:3307" # StarRocks MySQL协议地址
username = "xxxx" # StarRocks用户名
password ="xxxxxxx" # StarRocks密码
database = "ods" # 目标数据库
enable_upsert_delete = true # 启用更新删除功能
max_retries = 3 # 写入失败重试次数
http_socket_timeout_ms = 360000 # HTTP超时时间(毫秒)
retry_backoff_multiplier_ms = 2000 # 重试退避乘数
max_retry_backoff_ms = 20000 # 最大重试退避时间
batch_max_rows = 2048 # 单批次最大行数
batch_max_bytes = 50000000 # 单批次最大字节数
}
}

② Oracle-CDC到StarRocks

采集Oracle-CDC数据需要确保源数据库需要开启了Logminer,用户拥有相关权限,并且把对应的OJDBC.Jar和Orai18n.jar包放入 ${SEATUNNEL_HOME}/lib目录。详情可以参考官网:https://seatunnel.apache.org/zh-CN/docs/2.3.11/connector-v2/source/Oracle-CDC。

值得一提的是,我们采集Oracle-CDC过程中遇到的延迟问题,可以优先让DBA查询Logminer日志切换的次数是否很频繁,官方建议控制在每小时在十次左右,太频繁的切换会导致发生长时间延迟情况的可能。如果次数过大,可以加大单个日志文件大小。其次考虑把QPS值极高的表拆分到新的SeaTunel任务中。

-- 查询日志切换次数
SELECT GROUP#, THREAD#, BYTES/1024/1024 || 'MB' "SIZE", ARCHIVED, STATUS FROM V$LOG;
SELECT
TO_CHAR(first_time, 'YYYY-MM-DD HH24') AS hour,
COUNT(*) AS switch_count
FROM
v$log_history
WHERE
first_time >= TRUNC(SYSDATE) - 1 -- 过去一天的数据
GROUP BY
TO_CHAR(first_time, 'YYYY-MM-DD HH24')
ORDER BY
hour;-- 查询日志文件大小
SELECT F.MEMBER, L.GROUP#, L.THREAD#, L.SEQUENCE#, L.BYTES/1024/1024 AS SIZE_MB, L.ARCHIVED, L.STATUS, L.FIRST_CHANGE#, L.NEXT_CHANGE#
FROM V$LOG L, V$LOGFILE F
WHERE F.GROUP# = L.GROUP#
ORDER BY L.GROUP#;

下方是我们采集Oracle-CDC的配置样例。

env {
parallelism = 1 # 并行度为1,流式采集只能是1
job.mode = "STREAMING" # 流式作业模式
job.name = bpm2sr # 作业名称标识
job.retry.times = 3 # 作业失败重试次数
job.retry.interval.seconds=180 # 重试间隔时间(秒)
}source {
Oracle-CDC {
plugin_output = "cdc" # 输出插件标识
base-url = "jdbc:oracle:thin:@xxxxxx:1521:DB" # Oracle连接地址
username = "xxxxxx" # 数据库用户名
password = "xxxxxx" # 数据库密码
table-names = ["DB.SC.TABLE1","DB.SC.TABLE2"] # 需要同步的表,格式:数据库.模式.表名
startup.mode = "latest" # 从最新位点开始同步
database-names = ["DB"] # 数据库名
schema-names = ["SC"] # 模式名
skip_analyze = true # 跳过表分析
use_select_count = true # 使用统计
exactly_once = true # 启用精确一次语义
connection.pool.size = 20 # 连接池大小
debezium {
log.mining.strategy = "online_catalog" # 日志挖掘策略
log.mining.continuous.mine = true # 持续挖掘日志
lob.enabled = false # 禁用LOB支持
internal.log.mining.dml.parser ="legacy" # 使用传统DML解析器
}
}
}transform {
TableRename {
plugin_input = "cdc" # 输入插件标识
plugin_output = "rs" # 输出插件标识
convert_case = "LOWER" # 表名转换为小写
prefix = "ods_crm_db_" # 添加表名前缀
}
}sink {
StarRocks {
plugin_input = "rs" # 输入插件标识
nodeUrls = ["xxxxxxx:8030","xxxxxxx:8030","xxxxxxx:8030"] # StarRocks FE节点
base-url = "jdbc:mysql://xxxxxxx:3307" # JDBC连接地址
username = "xxxx" # 用户名
password ="xxxxxxx" # 密码
database = "ods" # 目标数据库
enable_upsert_delete = true # 启用更新删除
max_retries = 3 # 最大重试次数
http_socket_timeout_ms = 360000 # HTTP超时时间
retry_backoff_multiplier_ms = 2000 # 重试退避乘数
max_retry_backoff_ms = 20000 # 最大重试退避时间
batch_max_rows = 2048 # 批次最大行数
batch_max_bytes = 50000000 # 批次最大字节数
}
}

(4)可观测的监控

得益于SeaTunnel新版本提供的强大监控指标(Metrics)和我们构建的完善监控体系,我们能够从集群全局和任务粒度两个层面,对数据采集平台的状态了如指掌。我们的监控体系主要包含以下两个维度:

① 集群监控

  • 节点状态:实时监控集群节点个数与存活状态,确保Worker节点无异常下线,保障集群处理能力。
  • 集群吞吐:监控集群整体的SourceReceivedQPS和SinkWriteQPS,掌控全局数据流入与流出速率,评估集群负载。
  • 资源状态:监控集群节点的CPU、内存,为资源扩容或优化提供依据。
  • 网络健康度:通过监控内部心跳与通信延迟,确保集群网络状况良好。

② 任务监控

  • 任务运行状况:实时检查所有任务的运行状态(Running/Failed/Finished),是监控的最基本要求。
  • 数据同步量:监控每个任务的SourceReceivedCount和SinkWriteCount,实时掌握每条数据流水线的吞吐量。
  • 延迟时间:这是CDC任务最关键的指标之一,当采集端发生持续发生延迟时发送告警。

4、成效:可衡量收益

经过一段时间的稳定运行,基于Apache SeaTunnel构建的新一代数据采集框架为我们带来了显著且可量化的收益,主要体现在以下几个方面:

(1)稳定性:从“疲于奔命”到“高枕无忧”

  • 任务故障率降低超99%: 旧方案下,每月需处理1-3次同步异常。新集群上线至今,核心数据同步任务保持0故障运行,未发生因框架本身导致的数据服务中断。
  • 数据一致性达到100%:依托Apache SeaTunnel的Exactly-Once语义和强大的Checkpoint机制,实现了端到端的精确一次处理,彻底解决了之前可能存在的微量数据重复或丢失问题,数据质量得到根本保障。
  • 可用性大幅提升: 集群的高可用设计确保了服务99.99% 的可用性,任何单点故障均可在分钟级内自动恢复,对业务透明无感。

(2)效率:开发运维效能的倍增

  • 开发效率提升50%: 从过去编写维护多套脚本,转变为统一的配置化开发。新数据源的接入从原来的1-2人天缩短至1分钟内即可完成,效率提升显著。
  • 运维成本降低70%: 现在仅需通过Grafana监控大屏即可掌控全局状态,日均主动运维投入小于0.5人时。
  • 数据时效性优化: 数据端到端延迟从分钟级优化至秒级,为实时数据分析和决策提供了坚实基础。

(3)架构:资源优化与统一框架

  • 技术栈统一: 成功将Sqoop、StreamSets等多种技术栈统一收口至Apache SeaTunnel,极大降低了技术复杂度和长期维护成本。

5、展望:未来规划

  • (1)全面云原生化: 我们将积极探索Apache SeaTunnel在Kubernetes上的原生部署与调度能力,利用其弹性伸缩的特性,实现计算资源的按需分配,进一步优化成本与效率,更好地拥抱混合云与多云战略。
  • (2)智能化运维: 基于已收集的丰富Metrics数据,构建AIOps能力,实现任务性能的智能预测、故障的根因分析自动定位与智能调参。

6、致谢

在此,我们由衷地感谢 Apache SeaTunnel 开源社区。同时,也要感谢公司内部项目团队的每一位成员,你们的辛勤付出与勇于探索,是此次架构升级得以成功实施的关键。最后,我们衷心祝愿Apache SeaTunnel项目未来越来越好,生态愈发繁荣!

相关文章:

从“分散”到“统一”,中控技术利用SeaTunnel构建高效数据采集框架,核心数据同步任务0故障运行!

本文将深入探讨中控技术基于 Apache SeaTunnel 构建企业级数据采集框架的实践,重点分享集群高可用配置、性能调优、容错机制及数据质量监控等方面的具体思考与方案。作者 | 崔俊乐引言:对企业而言,数据采集的核心挑战从来不仅仅是“同步”,而是如何在大规模、多元异构的复杂…...

再见 Cursor,Qoder 真香!这波要改写 AI 编程格局

如果把未来 AI 编程工具的核心竞争力用一句话总结,那就是:能不能让开发者在透明化的协作中,信任它、依赖它,并且和它一起把项目养大。作者:loonggg 真心建议大家去使用一下这段时间最新推出的一款 AI 编程工具:Qoder 。 真的是太好用了,一点也不比 Cursor 差。 为什么这…...

T/B cell subtype marker - un

B cell ref: https://www.abcam.cn/primary-antibodies/b-cells-basic-immunophenotypingT cell ref: https://www.abcam.cn/primary-antibodies/t-cells-basic-immunophenotyping作者:un-define出处:https://www.cnblogs.com/mmtinfo/p/19099331本文版权归作者和博客园共有,…...

SAP FICO 完全凭证替代

GGB1 这个参数是获取所有行项目的关键USING bool_data TYPE gb002_015*&---------------------------------------------------------------------* *& Form u902 *&---------------------------------------------------------------------* * text *…...

K8s Application模式下的flink任务执行精要

本文分享自天翼云开发者社区《K8s Application模式下的flink任务执行精要》,作者:l****n 构键k8s集群在这里,我们需要搭建一个K8S环境用于提供flink任务的运行时环境。在这里推荐使用kubeadm或者一些脚本工具搭建,可参考本自动k8s脚本工具。具体过程在这里省略,可以参考上…...

从0打造一个TTS语音合成引擎:原理与实现

语音合成技术(Text-to-Speech, TTS)近年来发展迅猛,从早期机械感十足的合成音到如今几乎可以以假乱真的人声,背后是深度学习技术的巨大进步。本文将带你了解现代语音合成的基本原理,并尝试用Python实现一个简易版的TTS系统。 语音合成技术演进图1:语音合成技术发展历程,…...

莫队

Argvchs 说我不会根号算法,把之前的博客搬过来,然后再补点东西。 一种离线算法,可以用 \(O(n\sqrt n)\) 的复杂度处理区间查询问题,当然,也可以带修,下文也会提到。 关于复杂度 莫队优化的关键是排序 + 分块,将每个询问离线下来,按照左端点所在块从小到大排序,假如左端…...

0voice-2.1.1-网络io与io多路复用select/poll/epoll

测试...

Java基本语句-分支语句

Java基本语句-分支语句Day05 如何在API字典中寻找自己想要的Scanner类型 1.点击搜索 输入Scanner 2.字典中回显示各种类型的获取方式: nextByte()、nextShort()、nextInt()、nextLong()、nextdouble()、nextFloat()、next()多种引用使用。 3.调用Scanner类的相关方法,来获取指定…...

丘成桐谈AI

很多重要的科学发现,是在平凡的事情里面突然有个突破。 观念上的突破,在我看人工智能有困难做不到,现在全民学人工智能, 听起来很好听,但是师资不够, 跟数学的整个合作是刚开始, AI看见万千数据 记者:您第一次感觉到AI的冲击时什么时候 Yau:哈哈我坦白跟你讲,我从来没…...

异常检测在网络安全中的应用 - 实践

异常检测在网络安全中的应用 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; …...

大文件分片上传

分片:// 获取文件对象const inputFile = document.querySelector(input[type="file"]);// 设置分片大小:5MBconst CHUNK_SIZE = 5 * 1024 * 1024;// 文件上传事件inputFile.onchange = async (e) => {// 获取文件信息const file = e.target.files[0];// 获取文件…...

人小鼠免疫细胞maker基因 - un

人小鼠ref:https://www.abcam.cn/primary-antibodies/immune-cell-markers-poster作者:un-define出处:https://www.cnblogs.com/mmtinfo/p/19099316本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究…...

HyperWorks许可配置

在工程设计和仿真领域,正确的软件许可配置是确保工作流程顺畅、提高生产效率和实现最佳投资回报的关键。HyperWorks作为业界领先的工程仿真软件,其灵活的许可配置功能为用户提供了广泛的定制选项,确保软件能够完全满足各种业务需求。 什么是HyperWorks许可配置? HyperWorks…...

国标GB28181视频平台EasyGBS如何解决安防视频融合与级联管理的核心痛点?

国标GB28181视频平台EasyGBS如何解决安防视频融合与级联管理的核心痛点?在平安城市、雪亮工程等大型安防项目中,如何解决不同品牌设备与平台之间的互联互通难题?本文深度解析基于国标GB/T28181协议的EasyGBS视频平台的核心特点与技术优势,阐述其如何通过标准化协议,实现大…...

python基础-推导式

1.列表推导式 : 有规律的快速创建或者控制列表1.1 创建列表 eg: list1 = [ i for i in range(10)]1.2 带条件判断的列表推导式eg: list1 = [ i for i in range(50) if i % 3 == 0]3.多个for循环实现的列表推导式eg: list1 = [(item1, item2) for item1 in list2 for item2 in…...

人 CD 抗原完全指南 - un

设立分化簇 (CD) 命名系统的目的是对白细胞表面抗原进行分类。 最初,表面抗原是根据与它们结合的对应单克隆抗体进行命名。随着各实验室逐渐发现抗原常能刺激产生多种单克隆抗体,因此需要采用一种统一的命名系统。1982 年于巴黎举行的第 1 届国际人类白细胞分化抗原专题讨论会…...

Java入门知识

Java的特性和优势 简单性 面向对象 可移植性 (“Write once ,run anywhere”) 高性能 分布式 动态性 (反射机制) 多线程 (同时进行) 安全性 (异常机制,防病毒防篡改) 健壮性 在学习过程中爱上它,能够不断主动学习 在机遇来临之前,不断健壮自己 Java的三大版本 “Wri…...

AUTOSAR网络管理

汽车行业的网络管理一般有两种,一种是AutoSar另一种是OSEK,为啥汽车要网络管理,其实是为了降低车辆电池消耗,当车辆不工作时所有总线上的ECU通讯模块或整个ECU处于低功耗状态。网络管理一般用在电池供电的ECU,比如车上CAN上的ECU。为了避免通讯错误,需要网络管理来协调网…...

写用例注意点

写用例注意点: 1、测试标题 明确测试点 2、写用例的前几条用例都是主要场景的用例先写 微信个人能发微信红包 微信群发能发拼手气红包 微信群发能发拼手气红包 微信群发能发专属气红包 3、测试标题尽量写内容不要写案例: 例如验证标题能修改密码为:6666 4、相同的模块可以进…...

12 路低延迟推流!米尔 RK3576 赋能智能安防 360 环视

在智慧城市建设加速与社区安防需求升级的双重驱动下,“360 无死角监控 + 实时响应” 已成为安防领域的核心诉求。传统监控方案常受限于摄像头接入数量不足、编解码效率低、推流延迟高三大痛点,难以覆盖社区、园区等复杂场景的全点位监控,更无法满足应急事件 “毫秒级响应” …...

A公司一面:类加载的过程是怎么样的? 双亲委派的优点和缺点? 产生fullGC的情况有哪些? spring的动态代理有哪些?区别是什么? 如何排查CPU使用率过高?

A公司一面:类加载的过程是怎么样的? 双亲委派的优点和缺点? 产生fullGC的情况有哪些? spring的动态代理有哪些?区别是什么? 如何排查CPU使用率过高?摘要 A公司的面经JVM的类加载的过程是怎么样的? 双亲委派模型的优点和缺点? 产生fullGC的情况有哪些? spring的动态代…...

Alternating Subsequence

CF1343C Alternating Subsequence 题目描述 回忆一下,如果序列 \(b\) 是序列 \(a\) 的一个子序列,那么 \(b\) 可以通过从 \(a\) 中删除零个或多个元素(不改变剩余元素的顺序)得到。例如,如果 \(a=[1, 2, 1, 3, 1, 2, 1]\),那么可能的子序列有:\([1, 1, 1, 1]\),\([3]\)…...

白鲸开源“创客北京2025”再摘殊荣,聚焦Agentic AI时代数据基础设施建设

近日,“创客北京2025”创新创业大赛海淀区级赛圆满落幕,经过最终比拼,北京白鲸开源科技有限公司凭借 「Agentic AI时代下的数据基础设施平台」(白鲸数据集成调度平台/WhaleStudio) 脱颖而出,荣获企业组二等奖。近日,“创客北京2025”创新创业大赛海淀区级赛圆满落幕,经…...

python基础-公共操作

数据类型间公共支持的操作符运算: + ,* ,in , not in‘+’ :支持的容器类型 字符串、列表、元组 ,实现两个容器的合并‘*’ : 支持的容器类型 字符串、列表、元组, 赋值容器内容str1 = q str1* 5 =qqqqqlist1 = [hello] list1*5 = [hello, hello, hello,…...

天翼云第九代弹性云主机:让每一次计算快人一步

随着数字化转型进程不断深入,云计算已成为推动千行百业智能化升级的核心引擎。弹性计算服务凭借其灵活扩展、高可用和高性能等特点,正持续为企业提供关键基础设施支持。面对日益复杂的业务场景与持续增长的计算需求,天翼云始终致力于通过持续创新和技术升级,推动弹性计算服…...

若依(RuoYi)框架漏洞总结

0x01 特征 绿若依 icon_hash=”706913071”蓝若依 icon_hash=” -1231872293”0x02 漏洞 弱口令 用户:admin ruoyi druid 密码:123456 admin druid admin123 admin888若依前台默认shiro key命令执行漏洞 若依默认使用shiro组件,所以可以试试shiro经典的remember…...

第一次个人项目作业_论文查重

第一次项目作业这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience/homework/13477这个作业的目标 实现一个3000字以上论文查重程序github连接:…...

2025年版《中科院期刊分区表》与2023年版对比表,附名单可直接查阅

2025年版《中科院期刊分区表》与2023年版相比,主要有以下几个变化‌: ‌1、发布时间提前‌:2025年版分区表从12月提前至3月发布,与投稿周期同步,学者可以尽早锁定期刊最新分区,避免“投稿后降区”的风险‌。 ‌2、增加ESCI期刊收录‌:2025年版分区表增加了ESCI期刊的收录…...

对马岛之魂

护身符 稻荷神护身符----增加资源的获取 aa...

2019年双因素认证最佳实践指南

本文深入探讨2019年双因素认证的正确实现方式,对比TOTP与WebAuthn技术优劣,分析用户行为模式,并提供实际部署建议,帮助开发者构建更安全的认证系统。2019年正确实现双因素认证 - Trail of Bits博客 自3月起,Trail of Bits一直与Python软件基金会合作,为Warehouse(PyPI的…...

Account Kit(华为账号服务)再进化,开发者接入效率飙升!

Hi 各位开发者朋友~👋 为持续优化开发体验,提升集成效率,Account Kit接入体验再升级,助力构建更流畅、更安全的登录体验,让开发效率火力全开!😎 【体验升级】华为账号相关权益申请入口统一迁移至AGC华为账号一键登录权益实时审批华为账号一键登录支持三方开发框架01 …...

软件工程个人项目

软件工程个人项目3123004548软件工程个人项目这个作业属于哪个课程 <https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024>这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience/homework/13477这个作业的目标 <设计一个…...

学习道路道阻且长 希望自己坚持下去

本人是一名专升本的大三学生 现在专业是软件工程专业 从今天开始学习java 翻了一下资料 发现很多人建议从前端开始学习 在专科学习中 也学过相应的基础知识,不过遗忘程度可能有点严重。对于语言的基本语法掌握需要加强巩固,希望自己好好坚持下去,努力学习。...

2025/9/18 总结

A 用时:2h 预期:100pts 实际:100pts 求出前缀和,\(s_k+s_i \text{xor} s_k\),考虑从高到低贪心,如果 \(s_i\) 的 \(j\) 位为 \(1\),不管如何贡献都有 \(2^j\),如果 \(s_i\) 的第 \(j\) 位为 \(0\),则 \(s_k\) 的第 \(j\) 位为 \(1\) 有 \(2_{j+1}\) 贡献,用高维前缀和…...

P2216 [HAOI2007] 理想的正方形

P2216 [HAOI2007] 理想的正方形#include <bits/stdc++.h> using namespace std;const int maxn = 1e3 + 10; int a,b,n; int c[maxn][maxn]; deque <int> dq1,dq2; int max1[maxn][maxn],min1[maxn][maxn]; int max2[maxn][maxn],min2[maxn][maxn];int ans = 2e9;i…...

PuTTY下载和安装

下载地址: https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html更改安装路径创建桌面快捷方式...

数据通路-单总线结构(最头晕的一集)

数据通路就是数据在各个部件之间传输的路径(包括路径上的部件) 控制信号是有控制部件产生的 数据通路的结构 1cpu内部单总线方式 2cpu内部多总线方式 3专用数据通路方式 内部总线 是指同一个部件,如cpu内部链接各寄存器以及运算部件之间的总线; 系统总线 是指同一台计算机系…...

python基础篇-集合

集合 :集合内的数据不重复,但是数据是无序的创建集合 {} 或者set()注: 创建空集合只能用set(), 因为{}已经被字典占用了eg: s1 = {10, 20 ,40,30 }eg: s2 = set(abcdefg) :用set创建,序列会被拆开 = 》 {’a, b, c, d, e, f, g}集合的操作:1.增加s1.add() 增加单个数据…...

#egsg:在同一程序中比较-计算圆的面积

以下是一个同时使用easygui和pysimplegui实现的圆形面积计算程序,通过菜单让用户选择使用哪种GUI库: import math import easygui import PySimpleGUI as sgdef easygui_calculator():"""使用easygui实现的版本"""title = "圆形面积计算器…...

282 项多模态胃肠病学数据集:适配 VLM 与 MLLM 微调,融合医学图像与临床文本的医疗 AI 训练数据

​ 获取更多高质量数据集,请访问典枢数据交易平台:https://dianshudata.com一、引言与背景 在医疗人工智能领域,胃肠病学的智能化诊断与分析始终依赖高质量数据的支撑,而视觉语言模型(VLM)与多模态大型语言模型(MLLM)的崛起,为整合医学图像与文本信息、提升临床决策效…...

2-sat板子

vector<int>e[maxn]; int n,m; int inscc[maxn]; int low[maxn],dfn[maxn]; stack<int>stk; int instk[maxn]; int tot,cnt; vector<int>scc[maxn];void dfs(int u,int fa){low[u]=dfn[u]=++tot;stk.push(u);instk[u]=1;for(int v:e[u]){if(!dfn[v]){//树边d…...

centos 7中安装jenkins

1.安装java11 [root@localhost ~]# yum install -y java-11-openjdk-devel [root@localhost ~]# java --version openjdk 11.0.23 2024-04-16 LTS OpenJDK Runtime Environment (Red_Hat-11.0.23.0.9-2.el7_9) (build 11.0.23+9-LTS) OpenJDK 64-Bit Server VM (Red_Hat-11.0.2…...

pythonjs逆向 破解滑动验证码 - hello-*

现在的滑动验证码防盗等级都比较高,之前的是一张完整的图片带缺口,现在返回的图片是打乱顺序拼接而成的,所以现在破解不仅要识别滑块的缺口,同时还需要复原完整的图片一.伪造请求获取验证码图片可以看到请求中主要的两个参数ctxid和request,所以我们只需要找到这两个参数的…...

解决 pandas.to_csv 乱码、丢失行和自动换行问题 时间转换

解决 pandas.to_csv 乱码、丢失行和自动换行问题-百度开发者中心 https://developer.baidu.com/article/details/2792989 在使用 pandas.to_csv 函数时,可能会遇到一些问题,如乱码、丢失行和自动换行等。这些问题通常是由于编码格式、数据类型或文件写入方式不当引起的。下面…...

JavaDay7

数组 数组的定义数组是相同类型数据的有序集合。 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。 其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们。数组声明创建首先必须声明数组变量,才能在程序中使用数组。下面是声明数组…...

前端场景题笔记

先说背景再说方案 1. js超过number最大值的数怎么处理? 换数据类型。 2. 如何解决页面请求接口大规模并发问题? 请求队列,Push,shift。防抖节流。 3. 大文件上传? 前端切片,标记唯一值,后端整合。 4. 前端怎么实现截图? Canvas(基于html的绘图工具)(…...

P3934 [Ynoi Easy Round 2016] 炸脖龙 I 做题记录

欧拉函数前置芝士:扩展欧拉定理 题目大意 给一个长为 \(n\) 的序列,\(m\) 次操作,每次操作:区间 \([l,r]\) 加 \(x\); 对于区间 \([l,r]\),查询:\[{a_l}^{{a_{l+1}}^{{a_{l+2}}^{{\dots} ^{a{r}}}}} \mod p \]思路 首先我们有: \[a^k\equiv \left\{\begin{matrix}a^k, …...

【CompletableFuture 核心操作全解】详细注释版

一、任务创建操作 1. runAsync() - 执行无返回值的异步任务 /*** 创建并执行无返回值的异步任务* * @param runnable 要执行的任务逻辑(无返回值)* @return CompletableFuture<Void> 表示任务执行状态的Future对象* * 特点:* - 任务在ForkJoinPool.commonPool()中执行…...

关于学术不端的一些思考

前言 由图书馆性骚扰事件,牵扯出学术不端行为,最后撤销硕士学位。正应了那句“来说是非者,便是是非人”。学术不端 中华人民共和国学术不端问题包括论文抄袭、洗稿、代写、造假、买卖、学历学位认证失信行为、掠夺性开放获取出版、批量引进海外“速成博士”等。 国际上一般指…...