干货 | 日均TB级数据,携程支付统一日志框架

大数据时代数据仓库的构建策略与实践 在大数据洪流中,企业面临的核心困境不是“缺数据”,而是“不会用数据”:分散在 Kafka、MySQL、日志文件中的数据像一堆“数字垃圾”,想查个“上月全国电商销售额”要跑3小时,想做用户行为分析却发现“用户ID在三个系统里格式都不一样”。本文将以**“图书馆管理”为核心类比,用“一步步思考”的方式拆解大数据时代数据仓库的构建逻辑:从“为什么需要数据仓库”的底层逻辑,到“如何用维度建模整理数据”的具体方法,再到“分层架构+ETL 落地”的实战步骤,最后用一个电商销售数据仓库案例**还原完整构建流程。 阅读详情

作者简介

 

英明,携程数据研发专家,负责支付离线数据仓库建设及BI业务需求,对并行计算、大数据处理及建模等有浓厚兴趣。

一、背景

支付中心作为携程集团公共部门,主要负责的业务包括交易、实名绑卡、账户、收单等,由于涉及到交易相关的资金流转以及用户实名认证,部分用户操作环节的中间数据应内控/审计要求需要长时间保存。当前研发应用多,日志量大、格式各异,对于日志的存储和使用产生较大的挑战,故支付数据与研发团队群策群力,共同开发了一套统一日志框架。


二、总体架构图

核心模块包括:日志生产、日志采集、日志解析,其中调用流程如下:

1)研发应用/服务接入基于log4j2扩展的统一日志组件,将日志抛送至kafka。

2)周期性启动消费kafka topic的camus job将日志写入hdfs。

3)T+1启动MR job读取camus写入的hdfs内容并load到hive表。


三、日志生产-统一日志组件

支付研发基于log4j2自定义了多个Appender,将应用日志以服务调用形式抛送至kafka,并被log_process_service 服务统一处理并提交至携程常用基础日志框架如:CLOG、CAT、ES,各应用无需关心公司日志框架,统一由日志平台处理。

其优点:

  • 不同日志框架对应着不同的Appender,方便进行日志框架接入的扩展。

  • 采用AOP编程,对于接入的业务侵入性小,接入简单。

  • 定义了丰富的java注解,便于日志配置化输出,其中可打印日志包括但不限于:类名、方法名、方法入参、返回值、异常等,支持敏感字段脱敏。

存在的问题:

  • 日志格式不规范:研发应用数百个,研发人员较多,日志格式差异大,给数据分析和使用带来巨大挑战。

  • 存储时长短:当前公司在线CLOG存储系统只能查询最近几天数据、ES保存稍长一段时间数据且不支持批量查询,基础离线CLOG hive表由于数据量巨大,仅能做到T+2,无法满足T+1的报表需求。

故支付数据团队在研发团队统一日志组件的基础上,结合数据分析和数据存储生命周期开发了统一日志框架。

3.1 统一日志-埋点设计

支付研发团队负责数百个服务或应用,支持的业务包括:路由、鉴权、免密、卡服务、订单、钱包实名、电子支付等,不同的业务又可拆分app、h5、online、offline等项目,整合这些数据是个极大的挑战。如果各系统研发埋点任意指定,会给BI数据分析带来极大的困难,数据分析准确性难以得到保障,故支付数据基于业务特点定义了一套统一日志埋点规范。

字段定义主要是基于日常分析需求,致力于简化数据的使用,故总体原则为json形式,当前原始日志有两部分组成:tag/message,其中tag数据结构为Map,关键数据一般是通过tag内的数据进行检索,明细数据通过message进行检索,tag与message的组成格式为:[[$tag]]$message,目前标准字段包括两类:规范性字段和通用性字段。


3.1.1 规范性字段格式

规范性字段需要应用研发一定程度的参与,提供符合字段命名的类和方法。部分字段名称及定义如下:

字段名称字段类型描述
serviceNamestring调用服务名称
tagMapkeyvalue信息
messagestring原始日志
requeststring接口请求参数
responsestring接口返回值
requesttimestring日志请求时间
responsetimestring日志请求时间

其中tag可以灵活填充,主要扩展字段如下:

名称字段类型描述
versionstringapp版本号
platstring平台信息
refnostring流水号

3.1.2 通用字段格式


日志框架能够自动获取属性,无需研发编码,即可打印。

字段名称字段类型描述
applicationidstring携程应用唯一识别号
logtimestring日志生成时间

3.2 分区/分桶字段的定义

当前离线数据分析基于hive引擎,hive的分区分桶设计极大的影响了查询性能,特别是在日志量巨大的场景下,分区字段的选择尤为关键。如:用户进入支付收银台可能会有上百个场景,而每种场景下会有多次服务调用,其中不同场景下服务调用频率差异很大,占用的空间差异也较大,故针对每种场景分配一个唯一的场景号,通过场景号进行分区,可以高效的进行数据分析,而过多的分区也可能导致较多的小文件,对hadoop namenode产生较大的影响,此时结合分桶能够达到优化查询效率且避免分区无限制野蛮增长产生众多过多小文件的问题。

四、日志采集

日志采集框架基于LinkedIn的开源项目Camus,Camus使用MapReduce读取kafka数据然后写入hdfs,由于无reduce阶端,所有数据处理及写入都在Map侧,很少会发生数据倾斜,Camus具有接入简单,方便扩展,故我们进行了二次开发,以满足当前业务的需要:

  • 自定义decoder/partitioner,原生的decoder/partitioner支持的hdfs落地路径主要基于日期,较为粗糙,无法适应业务的需要。故自定义decoder 抽取原始日志分区字段,然后代入partitioner中,生成具有业务含义的hdfs输出路径,为特定时间范围数据回刷提供了高效的解决方案。

  • 自定义provider,原生的StringRecordWriterProver仅支持text文件方式落地,占用空间大、压缩后无法并行切分,容易错列错行,而orc格式数据,有效的节约了hdfs占用空间,查询效率高且可以切分,有利于日志解析job的高效执行。其中在配置Camus job过程中需要关注如下问题:


4.1 camus 任务执行

  • 执行频率设置

The earliest offset was found to be more than the current offset

由于kafka消息保存天数有限和单个分区size有限(Server 配置:log.retention.bytes),携程侧为3天和10G,如果camus同步kafka频率较低时,可能会出现数据丢失,故需要根据日志量大小,设置camus 调度任务的执行频率,防止数据丢失。

  • 任务重叠执行

Error: java.io.IOException: target exists.the file size(614490 vs 616553) is not the same.

camus从kafka 读取数据,任务要以单例形式执行,任务执行完成后才会更新kafka的offset,若一个任务执行了多次,就会导致数据大小无法对齐,此时需要删除配置路径下的所有数据后重新启动任务,即可完成修复。


4.2 如何控制camus落地文件的大小

当kafka各partition数据写入量不平衡时,由于各partition会写入一个hdfs文件中,如果研发日志集中写入kafka某个partition,会导致这个partition对应的hdfs文件占用空间特别大,如果恰巧这个文件是不可切分的,极端情况下会导致只有一个线程去解析这个大文件,降低了数据读写的并发度,拉长了数据解析时间,遇到这种问题的解决办法是:

  • 临时解决方案:研发日志分散写入kafka partition,不要导致某类数据集中写入一个partition;

  • 高效解决方案:数据侧采用可切分的输入格式,进行数据切分;


4.3 写入orc文件格式注意事项

  • orc写入timeout

AttemptID:attempt_1587545556983_2611216_m_000001_0 Timed out after 600 secs

orc文件写入速度较text文件会慢很多,如果同时写入的的文件较多或者内存回收占用时间较长,会导致map方法在600秒内没有读、写或状态更新,job会被尝试终结,解决方法是调高默认的task超时时间,由10分钟调高到20分钟。

mapreduce.task.timeout=1200000
  • OOM 内存溢出

beyond physical memory limits. Current usage: 2.5 GB of 2.5 GB physical memory used; 4.2 GB of 5.3 GB virtual memory used. Killing container.

在orc写文件的时候如果出行较多的OOM,此时需要加大map执行的内存。

mapreduce.map.memory.mb=8096mapreduce.map.java.opts=-Xmx6000m

五、统一日志-解析

鉴于日志解析工作主要集中在MapReduce的Map侧,而Map侧通过参数调整能够很容易控制map的个数,以提高数据解析的并发度,MapReduce主要分为:intputformat、map、shuffle、reduce等几个核心阶段,通过优化各阶段的执行时间,可以显著提高日志解析的速度。


5.1 inputsplit优化

MR job中影响map的个数主要有:

  • 文件个数:如果不采用CombineFileInputFormat,那么不会进行小文件合并,每个文件至少有一个map处理,当小文件太多时,频繁启动和回收线程也会对性能产生影响,同时对集群其它job资源分配产生影响。

  • 文件属性:当文件较大且可切分时,系统会生成多个map处理大文件,inputsplit块按照MR最小单元进行文件切割(split),并且一个split对应一个MapTask。

前期日志解析程序的性能较高,一天的全量日志解析约25分钟,中间有段时间任务执行时间从25分钟延迟到4个小时,原因是研发将大量订单号为空的日志写入到指定的partition中,日志量巨大,导致其中少量map在读取大文件时执行时间特别长。

经过分析发现text+snappy 文件无法切分,只能够被一个map处理,将camus落地数据格式从text+snappy换为orc+snappy格式,同时开发了支持orc文件格式的CombineFileInputFormat,既减少了小文件对hadoop计算资源果断的占用也提高了job的并发程度。


5.2 shuffle优化

使map的输出能够更加均匀的映射到reduce侧,由于默认的分区策略是对map的输出key hash取reduce个数的模,容易导致数据倾斜,解决办法是在key上面增加时间戳或者重写partition函数。

5.3 批量日志解析

当前MR的输出会作为hive外表的数据源,hive表会按照业务过程进行分区,所有数据的解析结果路径为:日期+业务过程,而业务过程可能有数百个,采用了MultipleInputs/MultipleOutputs 能够在一个mapreduce job中实现多输入多输出的功能,以适应业务自定义解析,并归一化后统一抛送到reduce侧。


5.3.1 空文件生产

在使用的过程中会出现生成众多临时小文件及生成size 为0的小文件,增加了hdfs namenode内存压力,同时空文件也会导致spark表查询失败,可通过LazyOutputFormat进行修复。


5.3.2 文件重复创建

MultipleOutputs输出文件一般以name-r-nnnnn的格式进行命名,其中name与程序指定的文件名有关,nnnnn表示reduce任务号。在处理数据较多时,可能会存在reduce侧反复创建已存在的文件,导致任务长时间运行而不能成功,中间生成了大量小文件,对hadoop namenode产生较大压力,影响整个集群响应时间。

解决方案为:在reduce侧进行数据写入时,需要对exception进行捕捉,一旦出现数据写入exception,即将对应的写入reduce文件删除并终止程序,由于MR支持高可用,当一个reduce taks 失败后会自动重试,重试一定次数依然不能够成功就会导致整个任务失败,每次重试避免了不停的重复创建已存在的文件,引起NN响应时间极速下降。

 


5.4 reduce个数调整

目前日志解析的reduce侧主要用于orc数据写入,当reduce个数较少时,会导致reduce内存溢出,而reduce个数较多时,可能会导致非常多的小文件且占用集群过多资源,可以通过计算map侧输入文件的个数及总占用空间,动态计算需要的reduce个数,以达到合理利用资源的目的。


六、日志治理

日志落地导致的一个问题是存储空间增长迅速,当前支付中心日均新增ORC压缩原始数据量TB级别且还在持续增长中。

支付数据侧根据研发、产品的需求对不同类型日志进行分级,对于不同类别的日志设置不同的存储周期,主要划分为:研发排障日志、审计日志、数据分析日志等;同时在camus将日志写入hdfs时,由于按照业务分区进行落地,导致生成了大量小文件,需要对这些小文件进行合并并且设置TTL,避免对hadoop namenode产生较大的影响。


七、总结与展望

目前日均TB级数据解析时间在30分钟内完成,后期计划将日志系统导入clickhouse等对实时要求高的场景共运营使用,以支持业务精细化运营和分析。

【推荐阅读】

“携程技术”公众号后台回复“新书”,

可免费获得两本书的试读样章~

《携程架构实践》

京东

当当

《携程人工智能实践》

京东

当当

 “携程技术”公众号

  分享,交流,成长

【管理科学】第六十三篇 企业管理者招聘与人才博弈战略02 编号类型领域问题问题的数学分析(含逐步推理与数值范围)方法/手段/步骤/流程/话术/策略/行为/时序的所有内容和步骤(含数学表达式与数值分析)时序数学表达式及周期行动的数学表达式(含数值范围)关联知识和法律法规651组织博弈成本控制如何在保证质量的前提下有效控制成本?逐步推理: 1. 成本控制模型:成本每降低10%,利润可提升15%~25%。但过度降本可能影响质量和员工士气。 2. 控制效果:有效的成本控制可使利润率提升5%~10%。 3. 法律风险:需遵守劳动法和产品质量法。步骤与数学表 阅读详情

相关推荐

【毕业设计参考】基于yolov8+pyqt5自适应界面设计的锂电池表面缺陷检测系统

基于YOLOv8+PyQt5的锂电池表面缺陷检测系统结合了先进的目标检测技术与友好的用户界面设计,为锂电池质量检测提供了一种高效、准确的解决方案。未来,随着深度学习技术的不断发展,我们可以进一步优化模型,提高检测精度和速度,同时拓展系统功能,如实现实时视频流检测、与生产系统的深度集成等,为锂电池产业的发展注入新的活力。希望本文对大家在相关领域的研究和实践有所帮助,欢迎大家在评论区交流讨论。

1182

日志存储与分析

日志存储与分析

qq_36070104的博客 2494

跨平台烧录实战:RKDevTool在Windows/Linux/MacOS下的统一与差异

本文详细解析了RKDevTool在Windows、Linux和macOS三大操作系统下的固件烧录实践,重点介绍了RK3576开发板的环境配置、工具链选择、烧录模式切换及常见问题解决方案,帮助开发者构建稳定可靠的跨平台烧录工作流。

cnn8visionary的博客 206

京东App秒级百G日志传输存储架构设计与实战

本文作者:平台业务研发部-武伟峰,数据与智能部-李阳 背景 在日常工作中,我们通常需要存储一些日志,譬如用户请求的出入参、系统运行时打印的一些info、error之类的日志,从而对系统在运行时出现的问题有排查的依据。 日志存储和检索是个很常见且简单的工作,市面也有很多关于日志搜集、存储、检索的框架可供使用。 譬如我们只有个位数机器时,可以通过登录服务器,查看log4j之类的框架打印到本地文件的日志。当日志多起来后,可以用elk三剑客处理日志。 当日志量进一步增多,我们可以上消息队列,譬如kafka

tianyaleixiaowu的专栏 4981

Pytorch学习笔记(III)——提取特征

目录一、引言二、具体步骤1、参数模型2、网络结构3、参数载入4、特征提取器5、读取图片三、完整代码 一、引言   深度学习在许多任务中主要充当着特征学习的作用,而学习完的特征才是后续应用的一个关键。本文将主要介绍,如何提取任意目标层的特征图。   本文以输入数据为图片为例。 二、具体步骤 1、参数模型 博主使用了ResNet50训练了一个人脸识别的网络   训练完成的深度学习模型,我们会保存一...

lockonlxf的博客 2643

Anaconda离线创建python环境

既然是离线创建python环境,就需要有一个已经创建好的python环境。所以我们有两台win10的机器,分别是A和B。两台机器都安装了anaconda。其中A可以连网,因此我们在A上创建好一个python2.7的环境py27,然后将py27移植(安装)到B上。B连不连网都无所谓。 一、机器上A上创建python2.7的环境py27 有两种方法: 方法1:使用Anaconda的图形界面。首先,点击Environments->Create,然后输入要创建的环境名称"py27",然后选择2.7,如图

FY_2018的博客 6787

为了处理日均 TB 级数据量,金山云选择用 Pulsar 实现日志服务

作者 | 刘彬策划 | Tina金山云创立于 2012 年,是中国前三的互联网云服务商,2020 年 5 月在美国纳斯达克上市,业务范围遍及全球多个国家和地区。成立 8 年以来,金山云始终...

http://www.54tianzhisheng.cn/ 488

Python多版本共存指南:用CMD命令一键切换3.6和3.8解释器(含pip使用技巧)

本文详细介绍了在Windows CMD环境下实现Python多版本(如3.6和3.8)共存与一键切换的完整方案。通过文件重命名策略、环境变量优化和自定义脚本,开发者可快速切换Python解释器版本,并管理各版本独立的pip依赖库,确保项目环境隔离与兼容性。

weixin_29035405的博客 423

企业级安全日志分析工具实战指南:从GB级日志到智能威胁狩猎

摘要: 在零信任架构和隐蔽攻击盛行的背景下,传统日志分析工具面临性能不足、部署复杂等痛点。基于Go语言开发的轻量级日志分析工具凭借协程并发、单二进制部署等优势,成为安全运维的高效解决方案。本文从行业痛点出发,提出Go语言在日志分析中的技术优势,并通过实测数据对比验证其性能领先性。进一步升级工具架构,覆盖云原生、AI检测、威胁情报联动等企业级需求,提供动态协程调度、正则预编译等性能优化方案,同时引入AI模型实现智能威胁检测。最终形成从设计到落地的全生命周期指南,助力企业构建高效日志威胁狩猎体系。

从零开始,掌握网络安全。提供全面的网络安全教程、攻防演练技巧和行业动态。 733

爬取Unsplash高清壁纸:Python爬虫实战教程(最新技术)

在当今数字化时代,高清壁纸已经成为人们个性化设备的重要元素。Unsplash作为全球最知名的免费高质量图片网站,汇集了数百万张由全球摄影师贡献的高清图片。然而,Unsplash官网的下载方式需要手动操作,对于需要批量下载壁纸的用户来说效率较低。本文将带你深入探索如何使用Python爬虫技术高效爬取Unsplash高清壁纸,从基础到进阶,全面掌握图片爬取的核心技术。Unsplash成立于2013年,是一个完全免费的图片分享平台。高质量内容:所有图片均由专业摄影师上传,分辨率普遍达到4K以上免费商用。

2201_76125261的博客 935

EDEM-FLUENT耦合报错几大原因总结(持续更新)

EDEM-FLUENT耦合报错几大原因总结(持续更新)

zheaa的博客 2760

es审计日志_干货 | 日均TB级数据,携程支付统一日志框架

作者简介英明,携程数据研发专家,负责支付离线数据仓库建设及BI业务需求,对并行计算、大数据处理及建模等有浓厚兴趣。一、背景支付中心作为携程集团公共部门,主要负责的业务包括交易、实名绑卡、账户、收单等,由于涉及到交易相关的资金流转以及用户实名认证,部分用户操作环节的中间数据应内控/审计要求需要长时间保存。当前研发应用多,日志量大、格式各异,对于日志的存储和使用产生较大的挑战,故支付数据与...

weixin_35935264的博客 285

CloudCompare 二次开发(36)——非均匀体素降采样

使用CloudCompare与PCL编程实现的非均匀体素降采样。

点云侠的博客 746

干货 | 性能提升400%,ClickHouse在携程酒店数仓的实践

作者简介小琴,携程高级数据经理,负责酒店BI、数仓工作,专注于大数据应用领域多年。一、背景随着时间推移和业务的快速发展,携程酒店数据累积越来越多。目前流量日数据在3T左右,再加上各种订...

携程技术 1606

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

《携程技术2020年度合辑》,送给爱学习的你

01序言 2020年跌宕起伏,突如其来的疫情对旅游行业造成了前所未有的冲击,也让更多人进一步感受到技术互联互通的重要性。对于旅游业技术人而言,外部的不可控因素让我们更加聚焦于系...

携程技术 728

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

AI-调查研究-54-大数据调研报告 行业应用场景+技术选型趋势全解析

大数据在金融、电商、互联网、通信、制造、医疗、教育等行业中实现深度融合,成为业务创新的核心引擎。金融领域以风险管理、智能投顾和保险科技为重点,构建Kafka+Flink等高实时架构。电商侧重推荐系统、库存预测和精细化营销,架构向云原生与AI驱动演进。互联网行业则聚焦社交推荐、搜索引擎、O2O调度等场景,全面推进Kappa架构与智能增强。其他行业如通信、制造和医疗亦在网络优化、预测性维护、精准医疗等方面加速部署大数据方案。Lakehouse、联邦学习、数据中台等新技术加快落地,推动数据驱动从支撑系统迈向业务

谢谢你的喜欢 我们一起无限进步 1260

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

腾讯,排行前10的开源项目

1、Tars Tars是腾讯从2008年到今天一直在使用的后台逻辑层的统一应用框架TAF(Total Application Framework),目前支持C++和Java两种语言。该框架为用户提供了涉及到开发、运维、以及测试的一整套解决方案,帮助一个产品或者服务快速开发、部署、测试、上线。 它集可扩展协议编解码、高性能RPC通信框架、名字路由与发现、发布监控、日志统计、配置管理等于一体,通过它...

SurpassLi的专栏 74

生产级多维聚合:金融场景下的pandas高可靠聚合实践

多维聚合是数据分析的核心操作,指在单一计算流程中同步完成多个维度交叉与多种统计指标的联合计算。其底层原理涉及分组键哈希优化、向量化函数调度、内存局部性控制及时间窗口锚定等关键技术。相比简单groupby,它能显著提升计算确定性、结果一致性与系统稳定性,避免因分步执行导致的幽灵偏差和重复IO开销。典型应用场景包括银行客户分群、风控指标计算、监管报送生成及运营归因分析。本文聚焦真实金融系统中的落地挑战,详解pandas原生生态下兼顾性能、精度与可审计性的多维聚合工程实践。

weixin_38166557的博客 425

ClickHouse数仓全量更新和增量更新思路

【代码】Clickhouse数仓全量更新和增量更新思路。

weixin_44830864的博客 3235

hive 查看 job 日志_大数据hive,storm小知识(干货)

Hive简介定义Facebook为了解决海量日志数据的分析而开发了hive,后来开源给了Apache基金会组织。 hive是一种用SQL语句来协助读写、管理存储在HDFS上的大数据集的数据仓库软件。为什么要使用Hive? 1) 从SQL角度,简单、容易上手、使用方便。 2) 从Hadoop角度,可以操作大规模的数据集,可以作为大数据的引擎。 3) 从MetaStore角度:有了这个之后,这些框架...

weixin_39637260的博客 861

0698-6.2.0-Navigator审计日志查看对应用户的操作

Fayson的github: https://github.com/fayson/cdhproject 推荐关注微信公众号:“Hadoop实操”,ID:gh_c4c535955d0f 1 文档编写目的 CDH集群中有数据管理的组件Cloudera Navigator,本文档主要介绍这个组件的其中一个功能:审计,Cloudera Navigator审计可以从选定的集群服务收集一些事件,用户可以在...

Hadoop_SC的博客 995

如何用ELK搭建TB级微服务海量日志监控系统?

本文主要介绍怎么使用 ELK Stack 帮助我们打造一个支撑起日产 TB 级的日志监控系统。很多细节知识,一篇文章是不够的,本文主要介绍了核心知识点。 在企业级的微服务环境中,跑着成百上千个服务都算是比较小的规模了。在生产环境上,日志扮演着很重要的角色,排查异常需要日志,性能优化需要日志,业务排查需要业务等等。然而在生产上跑着成百上千个服务,每个服务都只会简单的本地化存储,当需要日志协助排查问题时,很难找到日志所在的节点。也很难挖掘业务日志的数据价值。那么将日志统一输出到一个地方集中管理,然后将日志处理化

weixin_47067712的博客 662
上一篇: 干货 | 携程是如何在测试时做精准流量筛选的
下一篇: 干货 | Trip.com 机票React Native整洁架构2.0实践
携程技术
博客等级 码龄10年 3716粉丝 324原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值