Flink SQL 优化方案总结

Flink优化及相关 Flink优化、反压、关联 阅读详情

Flink SQL 优化是一个多方面的工程,涉及资源利用、状态管理、计算效率、数据倾斜处理等多个维度。以下是一些关键的优化方案总结,帮助你提升 Flink SQL 作业的性能和稳定性:

一、 基础设施与资源配置优化

  1. 合理设置并行度:

    • 原则: 与 Source 分区数、KeyBy 后的 Key 基数、Sink 的吞吐能力匹配。避免过小(资源不足)或过大(额外开销)。
    • 关键点: GROUP BY、JOIN(特别是 Regular Join)、窗口操作通常需要根据 Key 设置并行度。
    • 调整: 通过 SET 'parallelism.default' = xx; 或在提交作业时设置。观察反压情况调整。
  2. 选择合适的状态后端:

    • RocksDBStateBackend (推荐生产环境): 适用于状态非常大(远超内存)的场景。利用磁盘存储,支持增量 Checkpoint。优化点:调整 state.backend.rocksdb.memory.managed (Flink 管理 RocksDB 内存),配置 RocksDB 参数 (state.backend.rocksdb.options / tuner)。
    • HashMapStateBackend: 状态完全在 TM JVM 堆内存中。适用于状态较小或对延迟要求极高的场景。需警惕 GC 问题和 OOM。
  3. 优化 Checkpoint/Savepoint:

    • 调整间隔: execution.checkpointing.interval。权衡故障恢复时间和开销。通常秒级到分钟级。
    • 对齐超时: execution.checkpointing.aligned-checkpoint-timeout。如果对齐耗时过长(数据倾斜或反压),可设置超时自动降级为未对齐 Checkpoint (Unaligned Checkpoint),避免 Checkpoint 卡住。
    • 启用增量 Checkpoint (仅 RocksDB): state.backend.incremental: true。显著减少大状态场景下的 Checkpoint 时间和存储。
    • 设置最小暂停间隔: execution.checkpointing.min-pause。避免连续 Checkpoint 占用过多资源。
  4. 优化网络缓冲区:

    • 增加 taskmanager.memory.network.fraction / min / max。在反压严重或高吞吐场景下,适当增加网络缓冲区大小有助于缓解反压。

二、 SQL 编写与逻辑优化

  1. 谓词下推:

    • Flink 会自动将 WHERE 条件尽可能地推送到 Source 端(如果 Source Connector 支持,如 Kafka, JDBC)或靠近源算子的地方,减少后续处理的数据量。确保 WHERE 条件写对位置。
  2. 投影下推:

    • Flink 会自动只读取查询实际需要的字段,减少不必要的数据传输和序列化开销。避免 SELECT *,明确列出所需字段。
  3. 避免/优化 CROSS JOIN:

    • CROSS JOIN (笛卡尔积) 会产生爆炸性的数据量,性能极差。除非绝对必要,否则避免使用。 如果必须使用,确保其中一张表非常小(如配置表),并考虑结合 LIMIT。
  4. 维表 Join 优化:

    • 使用 LOOKUP JOIN: 专门为访问外部维表设计的语法。
    • 开启异步查询: 'lookup.async' = 'true'。避免同步 IO 阻塞算子处理,大幅提升吞吐。强烈推荐。
    • 合理配置缓存:
      • 'lookup.cache' = 'PARTIAL':缓存部分维表数据(如 LRU 策略)。
      • 'lookup.cache.max-rows' / 'lookup.cache.ttl':控制缓存大小和过期时间。
      • 'lookup.cache' = 'FULL':全量缓存(适用于小维表)。权衡缓存一致性和内存消耗。
    • 设置重试: 'lookup.max-retries'。处理维表查询偶尔失败。
  5. 窗口聚合优化:

    • 使用 GROUPING SETS、ROLLUP、CUBE: 避免对相同窗口和 Key 进行多次扫描计算不同的聚合指标。
    • 使用 DISTINCT 聚合优化: 对于 COUNT(DISTINCT),如果基数非常高,考虑使用 HLL (HyperLogLog) 等近似算法(如 APPROX_COUNT_DISTINCT)牺牲一点精度换取大幅性能提升。
    • TUMBLE/HOP/SESSION 窗口函数: 使用内置窗口函数而非自定义 ProcessFunction,通常更高效。
  6. Top-N 优化:

    • 使用 ROW_NUMBER() 窗口函数配合 WHERE rn <= N 来实现 Top-N 是 Flink SQL 推荐的方式。
    • 优化器会尝试优化计算过程。确保 OVER 子句中的 PARTITION BY 和 ORDER BY 合理。
  7. 处理数据倾斜:

    • 识别: 观察 Web UI 中算子 subtask 的 numRecordsIn/Out 或 busyTimeMs 差异巨大。
    • 常用方法:
      • 两阶段聚合: 先加随机前缀进行局部聚合,再去掉前缀进行全局聚合(对 COUNT, SUM 等有效)。
      • 打散倾斜 Key: 对特定高频 Key 添加随机后缀,分散到不同子任务处理,后续再合并(适用于 JOIN, GROUP BY)。
      • 使用 DISTINCT + FILTER (Flink 1.16+): 在某些场景下可优化 COUNT(DISTINCT) 的倾斜。
      • 调整分区策略: 如果允许,尝试不同的 Key 组合或使用 rebalance() 强制轮询分区(可能破坏语义,慎用)。
  8. 利用时态表 Join:

    • 当需要根据事件时间关联一个版本化的表(如汇率表、商品价格表)时,使用 FOR SYSTEM_TIME AS OF 的时态表 Join 是正确且高效的方式。

三、 Connector 与格式优化

  1. Source Connector 优化:

    • Kafka: 合理设置 scan.startup.mode, properties.fetch.min.bytes, properties.max.poll.records 等参数。确保分区数与 Flink Source 并行度匹配(通常 1:1 或整数倍)。
    • JDBC: 使用分区扫描 (scan.partition.column, scan.partition.num, scan.partition.lower-bound, scan.partition.upper-bound) 并行读取。scan.fetch-size 调整批量读取大小。
  2. Sink Connector 优化:

    • 文件 Sink (HDFS/S3): 启用小文件合并 (auto-compaction = true, compaction.file-size)。合理设置滚动策略 (rolling-policy.*)。
    • Kafka: 启用事务保证 Exactly-Once (sink.delivery-guarantee = exactly-once)。调整 batch.size, linger.ms 等 Kafka Producer 参数提高吞吐。设置 sink.parallelism。
    • JDBC: 开启 Batch 写入: sink.batch.interval, sink.batch.size, sink.max-retries。使用 UPSERT 模式避免先查后写。对写入性能影响巨大。
    • Doris/StarRocks: 利用 sink.buffer-flush.* 参数控制批量提交。
  3. 序列化/反序列化格式:

    • 选择高效的二进制格式(如 Avro, Parquet, Arrow)通常比文本格式(JSON, CSV)性能更好,CPU 开销更低。权衡可读性和性能。

四、 表与 Catalog 管理优化

  1. 使用 Hive Catalog 管理元数据: 方便表管理,便于与其他引擎(如 Hive, Spark)共享元数据。

  2. 合理定义表属性: 如 Connector 参数、计算列、Watermark 策略、主键约束(某些优化如 Upsert 需要)等。

五、 诊断与监控

  1. 利用 Flink Web UI:

    • 检查反压: BackPressure 选项卡。持续反压是主要性能瓶颈标志。
    • 检查 Checkpoint: Checkpoints 选项卡。关注时长、对齐时间、失败原因。
    • 算子指标: Task Metrics 选项卡。关注 numRecordsIn/OutPerSecond, busyTimeMs, idleTimeMs, backPressuredTimeMs, stateSize 等。
    • Watermark 延迟: 在算子指标中查看 currentOutputWatermark 和 currentInputWatermark 的差距。
  2. 使用 EXPLAIN PLAN:

    • 执行 EXPLAIN PLAN FOR <your_sql_statement>。仔细阅读优化后的执行计划,理解算子顺序、交换策略 (Exchange)、资源使用估算(如果有)等。检查是否存在意外的 Calc、Join 顺序不佳等问题。
  3. 日志与指标系统:

    • 将 Flink 日志和 Metrics 集成到外部系统(如 ELK, Prometheus + Grafana),方便长期监控、告警和性能分析。
    • 关注 GC 日志,频繁 Full GC 通常是堆内存不足或状态后端配置不当的信号。
  4. 使用 Profiling 工具:

    • 火焰图 (Async Profiler): 分析 JVM CPU 热点,定位耗时代码路径。
    • JVM 内存分析工具 (MAT, jmap, jstat): 诊断内存泄漏或 OOM 问题。

总结优化步骤

  1. 监控定位瓶颈: 利用 Web UI、Metrics、日志确定是 CPU、内存、网络 IO、磁盘 IO 还是反压问题,具体是哪个算子。
  2. 检查基础配置: 并行度、状态后端、Checkpoint 配置、网络缓冲是否合理?
  3. 审视 SQL 逻辑:
    • 是否存在数据膨胀(如 CROSS JOIN)?
    • 是否可下推更多过滤/投影?
    • 维表 Join 是否开启异步和缓存?
    • 窗口/Top-N 写法是否标准高效?
    • 是否存在明显的数据倾斜?
    • Sink 是否开启批处理?
  4. 检查 Connector 配置: Source/Sink 的参数(如 Kafka, JDBC batch)是否针对吞吐优化?序列化格式是否高效?
  5. 查看执行计划: EXPLAIN PLAN 输出是否符合预期?有无优化空间?
  6. 迭代调整与验证: 修改配置或 SQL -> 重新部署 -> 监控效果 -> 重复步骤 1-5。

重要原则:

  • 测试驱动优化: 在预发或测试环境充分测试优化效果,再上生产。
  • 循序渐进: 每次修改一个或少量配置/逻辑,便于定位效果和问题。
  • 权衡取舍: 优化往往是资源(CPU、内存、网络、磁盘)、延迟、吞吐、准确性之间做权衡。明确业务优先级。
  • 关注版本特性: 新版本的 Flink SQL 通常包含更多优化器和 Connector 的改进。关注 Release Notes。

通过系统地应用以上优化方案,并结合实际的监控数据进行针对性调整,可以显著提升 Flink SQL 作业的性能和资源利用率。

Flink优化有史以来最详细版 我将为你提供最全面、最详细的 Flink 优化方案,包括性能优化、资源优化、状态管理优化、窗口和水位线优化、运维优化、SQL & Table API 优化等方面,并结合具体场景来说明优化策略。我会整理所有相关信息,并尽快反馈给你。1. 性能优化:优化Flink作业的吞吐和延迟需从数据流设计和算子配置入手。首先,在数据处理速度方面充分利用批流一体的架构:对于有历史数据和实时增量的数据分析场景,可采用“先批后流”的方式,即先用Flink批处理模式处理历史数据,再无缝切换到流模式处理实时数据,以减少重复计算和延迟 阅读详情

相关推荐

大数据Flink(一百零五):SQL性能调优

因此如果你要做这个优化,需要提前做一下吞吐量和延迟之间的权衡,但是大多数情况下,buffer 数据的延迟都是可以被接受的。:其核心思想在于按照 distinct 的 key,即 user_id,先做数据的分桶,将数据打散,分散到 Flink 的多个 TM 上进行计算,然后再将数据合桶计算。:在聚合数据处理场景中,很可能会由于热点数据导致数据倾斜,如下 SQL 所示,当 color = RED 为 50000w 条,而 color = BLUE 为 5 条,就产生了数据倾斜,而器数据处理的算子产生性能瓶颈。

Lansonli(蓝深李)的博客 1043

flinkcdc的lookup表详解(look.up.cache和buffer的理解)

在流式计算中,维表是一个很常见的概念,一般用于sql的join中,对流式数据进行数据补全,比如我们的source stream是来自日志的订单数据,但是日志中我们只是记录了订单商品的id,并没有其他的信息,但是我们把数据存入数仓进行数据分析的时候,却需要商品名称、价格等等其他的信息,这种问题我们可以在进行流处理的时候通过查询维表的方式对数据进行数据补全。首先查询的是缓存,缓存有数据就直接返回,缓存没有的话再去查询数据库,然后再将查询的结果返回并放入缓存,下次查询的时候直接查询缓存。具体的怎么开启缓存呢?

weixin_51981189的博客 3065

Flink系列之:使用Flink Mysql CDC基于Flink SQL同步mysql数据到StarRocks数据库

Flink系列之:使用Flink Mysql CDC基于Flink SQL同步mysql数据到StarRocks数据库

zhengzaifeidelushang的博客 1893

精通Flink项目优化(五.FlinkSQL 调优)

1. Group Aggregate 优化 1.1 开启 MiniBatch(提升吞吐) MiniBatch 是微批处理,原理是缓存一定的数据后再触发处理,以减少对 State 的访问,从而提升吞吐并减少数据的输出量。MiniBatch 主要依靠在每个 Task 上注册的 Timer 线程来触发微批,需要消耗一定的线程调度性能。 MiniBatch 默认关闭,开启方式如下: // 初始化 table environment TableEnvironment tEnv = ... // 获取 tableEnv

wenqi 2504

基于Flink SQL CDC的实时数据同步方案

Flink SQL CDC是Apache Flink生态系统中的一个组件,用于捕获数据源中的变化,并以表格格式进行表示。基于Flink SQL CDC的实时数据同步方案可以帮助企业轻松地实现数据库之间的数据同步。通过捕获源数据库中的数据变化,并将其实时地同步到目标数据库中,我们能够保证数据的一致性和实时性。启动后,任务将实时地捕获源数据库中的数据变化,并将其同步到目标数据库中。基于Flink SQL CDC,我们可以构建一个实时数据同步方案,该方案能够将源数据库中的数据变化实时地同步到目标数据库中。

TechWhiz的博客 534

高性能FlinkSQL优化技巧

MicroBatch和MiniBatch都是微批处理,只是微批的触发机制略有不同。原理同样是缓存一定的数据后再触发处理,以减少对State的访问,从而提升吞吐并减少数据的输出量。MiniBatch主要依靠在每个Task上注册的Timer线程来触发微批,需要消耗一定的线程调度性能。MicroBatch是MiniBatch的升级版,主要基于事件消息来触发微批,事件消息会按您指定的时间间隔在源头插入。MicroBatch在元素序列化效率、反压表现、吞吐和延迟性能上都要优于MiniBatch。微批处理通过增加延迟换取高吞吐,如果您有超低延迟的要求,不建议开启微批处理。通常对于聚合的场景,微批处理可以显

Flink使用指南:Flink SQL聚合场景下的优化方案,一定要收藏!

系列文章目录 Flink使用指南: 教你Flink SQL自定义Connector开发,使用SQL入库更方便! Flink使用指南:Flink设置全局变量,并在函数中获取,让你的代码更加优雅! Flink使用指南:Checkpoint机制,完全搞懂了,你就是大佬! Flink使用指南: 面试必问内存管理模型,进大厂一定要知道! Flink使用指南: Kafka流表关联HBase维度表 Flink使用指南: Watermark新版本使用 Flink使用指南: Flink SQL自定义函数 ..

徐腾瑞的博客 2146

新手避坑指南:用PIC16F15355开发板和MCC完成第一个UART通信项目

本文为新手提供了使用PIC16F15355开发板和MPLAB代码配置器(MCC)实现首个UART通信项目的完整指南。通过图形化配置系统时钟、UART参数并自动生成驱动代码,手把手教学如何避开常见陷阱,快速完成从环境搭建、代码编写到调试输出的全流程,助力开发者高效入门PIC单片机开发。

bash7scripter的博客 727

Flink/flinksql 语法 窗口与join 一文全 相关概念api汇总总结,底层process算子总结,与数据延迟处理,超时场景解决方案

常规 join,flink 底层是会对两个参与 join 的输入流中的数据进行状态存储的;所以,随着时间的推进,状态中的数据量会持续膨胀,可能会导致过于庞大,从而降低系统的整体效 率;可以如何去缓解:自己根据自己业务系统数据特性(估算能产生关联的左表数据和右表数据到达的最 大时间差),根据这个最大时间差,去设置 ttl 时长;

Direction_Wind的博客 1837

启动盘安装Win10完整指南:U盘制作、BIOS设置与分区排错

系统重装是解决电脑卡顿、系统崩溃、病毒残留等问题的基础操作,而U盘启动盘则是目前最主流的安装介质。其核心原理在于通过Rufus等工具,将原版ISO镜像写入U盘,并依据主板固件类型(UEFI或Legacy)选择对应的GPT或MBR分区表,确保引导程序能正确加载。掌握这些底层概念,不仅能提升安装成功率,还能避免因引导模式不匹配导致的黑屏、无法启动等问题。在实际应用中,无论是老旧电脑升级、硬盘更换,还是需要纯净的系统环境,制作一个可靠的启动盘都是必备技能。本文从备份数据、下载官方镜像讲起,逐步演示U盘制作、启动快

weixin_32667955的博客 343

Microchip Studio 7.0 从下载到项目调试:AVR开发者的完整入门指南(附常见问题解决)

本文为AVR开发者提供了Microchip Studio 7.0从下载安装到项目调试的完整入门指南。详细介绍了如何获取安装包、创建第一个AVR工程项目,并配置编译与调试环境。同时,文章重点解决了开发过程中常见的编译错误和仿真问题,帮助开发者快速上手并高效使用这一官方集成开发环境。

joy55的博客 336

Flink SQL 中的数据倾斜解决方案

‌监控定位‌:通过 Web UI 确认是否存在倾斜,识别是哪个算子(Source, Join, Agg)出问题。‌参数调优‌:优先开启mini-batch和,这是成本最低且效果显著的手段。‌SQL 改写‌:若是,确保开启 distinct split。若是普通GROUP BY倾斜,尝试手动加盐两阶段聚合。若是JOIN倾斜,判断是否可用 Broadcast Join,否则采用分流或加盐策略。‌资源调整‌:检查并行度设置,确保数据源分区与算子并行度匹配,必要时增加并行度。‌源头治理。

zhengxxm的博客 371

详解从无人机倾斜实景三维建模→模型修复→成果网络发布展示分享全流程

1、倾斜实景三维建模软件:CC(Smart3D)软件2、实景三维模型网页在线发布展示、分享平台:图新地球网页端(Wish3D·Earth平台)图新地球网页端(Wish3D·Earth平台)是基于 WebGL技术研发的国产实景三维模型Web端发布展示平台,可实现TB级倾斜实景三维数据快速加载,支持多种格式的三维模型,如OSGB实景模型、OBJ人工模型、SKP人工模型、RVT格式BIM模型等,同时支持模型单体化、三维模型测量分析、水面特效、日照分析等特殊效果呈现,此外也可以根据您的需要进行本地化部署级功能定制。

GISWorld3D的博客 4379

基于 Flink SQL CDC的实时数据同步方案

Flink 1.11 引入了 Flink SQL CDC,CDC 能给我们数据和业务间能带来什么变化?本文由 Apache Flink PMC,阿里巴巴技术专家伍翀 (云邪)分享,内容将从传统的数据同步方案,基于 Flink CDC 同步的解决方案以及更多的应用场景和 CDC 未来开发规划等方面进行介绍和演示。 传统数据同步方案 基于 Flink SQL CDC 的数据同步方案(Demo) Flink SQL CDC 的更多应用场景 Flink SQL CDC 的未来规划 直播回顾: ht...

u011250186的博客 1192

费斯托SPAN压力传感器的调试

本体为压力传感器,检测气压大小,通过设置参数,在上电上气时对气压进行判断,进而通过自身逻辑的判断,控制传感器的通断,进而控制机械部位的工作与运行;通电之后为如下图所示的样子有三个按键ABEdit键(编辑键、确认键)两步即可轻松连接。

大小曲奇的博客 1万+

《Sigrity SystemSI 2023+LPDDR4仿真自学笔记》(一)创建工程(Part1)

为了加强SystemSI 2023软件的熟悉度,咱们完整的走一个仿真全流程。

weixin_45199544的博客 6338

字节跳动 Flink 状态查询实践与优化

本篇文章介绍了字节跳动在 Flink 状态查询方面所进行的优化,解决了查询 Flink 任务状态时开发成本高及无法查询状态元信息等问题,提出了 State Query on Flink SQL 的解决方案,让用户使用 Flink Batch SQL 就可以快速查询 Flink 任务状态。

字节跳动云原生计算官方账号 504

果蔬及菜品识别系统

果蔬及菜品识别系统

我的博客 2122

Flink反压的解决以及Flink SQL的优化

利用 Flink Web UI 定位,通过查看subtask的反压监控,反压状态为HIGH红色的subtask即处于反压。​ 解决: ​ 方法一:直接聚合。​ 发现二:通过Flink Web UI查看任务的反压情况,如果只有个别Subtask呈现反压情况,有红有绿,可以推断出数据倾斜。​ 设置参数:开启MiniBatch,设置批量输出的间隔时间,设置每个批次最多缓存数据的条数(可以设置为两万条)。如果通过Flink Web UI查看subtask的反压情况有红有绿 ----> 原因:数据倾斜。

2302_76749443的博客 1208

从0到全栈:C#/.NET/.NET Core终极学习路线——2025年开发者必修的12个阶段与30个实战项目

【代码】从0到全栈:C#/.NET/.NET Core终极学习路线——2024年开发者必修的12个阶段与30个实战项目。

墨夶的博客 2042

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Flink反压排查及解决方案

利用 Flink Web UI 定位,通过查看subtask的反压监控,反压状态为HIGH红色的subtask即处于反压。​ 解决: ​ 方法一:直接聚合。​ 发现二:通过Flink Web UI查看任务的反压情况,如果只有个别Subtask呈现反压情况,有红有绿,可以推断出数据倾斜。​ 设置参数:开启MiniBatch,设置批量输出的间隔时间,设置每个批次最多缓存数据的条数(可以设置为两万条)。如果通过Flink Web UI查看subtask的反压情况有红有绿 ----> 原因:数据倾斜。

weixin_46856219的博客 2313

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Flink入坑指南 第四章:SQL中的经典操作Group By+Agg

Group By + Agg这个最经典的SQL使用方式。Group By是SQL中最基础的分组操作,agg的全称是aggregation(聚合操作),是一类SQL的统称,Flink中最常用的Agg操作有COUNT/SUM/AVG等,详情参见。在实际使用中,Group By+Agg绝大部分场景下都会一起出现。作为最常用的SQL模式,学习好这种模式的最优写法,也就非常重要了。

大JAVA解决方案 2302

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

flink sql 部署_京东Flink优化与技术实践

分享嘉宾:付海涛 京东 高级技术专家编辑整理:刘明明来源:微信公众号:DataFunTalk出处:https://mp.weixin.qq.com/s?__biz=MzU1NTMyOTI4Mw==&mid=2247515115&idx=1&sn=4a66938e452ba489cab72171d3ec902a导读: Flink是目前流式处理领域的热门引擎,具备高吞吐、低延迟...

weixin_30684945的博客 717

深入分析 Flink SQL 工作机制

精选30+云产品,助力企业轻松上云!>>> ...

程序员小陶的大数据分享 445

大数据开发之Flink SQL建设实时数仓实践

个推Flink SQL使用现状 在SQL模式下,个推通过jar+SQL文件+配置参数的方式使用Flink。其中jar是基于Flink封装的执行SQL文件的执行jar,提交命令示例如下: /opt/flink/bin/flink run -m yarn-cluster -ynm KafkaSourceHbaseSinkCaseTestSql \ -c ${mainClassName} \ ${jarPath} \ --flink.parallelism 40 \ --mode stream \ --sq

m0_58371965的博客 942
上一篇: Spark SQL优化方案总结
下一篇: Hadoop HDFS NameNode HA自动故障转移原理
走过冬季
博客等级 码龄9年 1609粉丝 341原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

走过冬季

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值