hive 自动检测、自动重启、记录检测日志、自动清理日志

Hive实战之自动化处理日志 需求 网站运行过程中会产生日志,我们会按照某个日期分类的文件夹存储 定期分析该日志,产生结果 分析 日志存储的目录如下: /opt/modules/weblog -----20170724(日期文件夹) ---------2017072418(日志文件) ---------2017072419(日志文件) -----20170725(日期文件夹) ---------2017072518(日志文件... 阅读详情

最终效果

  • 定时检测hive运行状态,进程不存在、进程存在但是不监听端口、线程数超出上限的hiveserver2,自动重新拉起
  • 每次检测脚本执行的日志都会保存在log目录下.check文件,每一个月一个文件
  • 每月15日,删除2月前的检测日志
  • 开启hive自带日志输出后,日志不会删除,且较大,因此一并将过期的hive自带日志清空

注意

每次检测失败后,会自动重启,重启时会先关闭hive进程,重启过程大概2-5分钟左右,因此检测任务定时调度的间隔千万不要小于5分钟,如果配合zookeeper实现多hiveserver2提供服务,间隔可以设置为30分钟

https://blog.youkuaiyun.com/Brother_ning/article/details/127993943
从这个作者复制的,但是他的代码好像有点问题,修改后然后加以优化

定时检查脚本

vi $HIVE_HOME/hiveservice.sh

#!/bin/bash

HIVE_LOG_DIR=$HIVE_HOME/log
CURRENT_TIME=$(date +"%Y-%m-%d %H:%M:%S")
# 日志清理,如果与hive默认日志命名风格一样,也会自动清理hive的日志
DT=$(date)
DT_2M=$(date -d "2 month ago")
CHECK_LOG=$HIVE_LOG_DIR/hive.log.$(date "+%Y-%m").check
CHECK_LOG_REG=$HIVE_LOG_DIR/hive.log.$(date -d "2 month ago" +"%Y-%m")-*
METASTORE_PORT=9083
HIVESERVER2_PORT=10000
# 最大连接数,超过这个数,则重启hive
MAX_WORKS=1800
if [ ! -d $HIVE_LOG_DIR ]
then
    mkdir -p $HIVE_LOG_DIR
fi

check_works(){
    WORKS=$(netstat -anltp | grep 10000 | grep -v "TIME_WAIT" |  wc -l)
    if [ -n "$WORKS" ] && [ "$WORKS" -gt $MAX_WORKS ]; then
        echo "$CURRENT_TIME:链接数$WORKS异常,大于$MAX_WORKS,重启hive" | tee -a $CHECK_LOG
        hive_stop
    fi
}

check_process(){
    name=$1
    port=$2
    ppid=$(netstat -nltp 2>/dev/null | grep $port | awk '{print $7}' | cut -d '/' -f 1)
    pid=$(ps -ef 2>/dev/null | grep -v grep | grep -i $name | awk '{print $2}')
    if [ -n "$pid" ] && [ -n "$ppid" ] && [ "$pid" = "$ppid" ]; then
        echo $pid
        return 0 # 进程正在运行
    else
        return 1 # 进程未运行
    fi
}

kill_valid()
{
    PIDS=$(jps -m | grep $1 | awk '{print$1}')
    # 遍历所有PID并使用kill -9命令杀掉它们,防止hive挂掉,但是进程不退出
    for PID in $PIDS; do
        kill -9 $PID
        echo "$CURRENT_TIME:关闭$1进程 $PID" | tee -a $CHECK_LOG
        sleep 3
    done
}

hive_stop()
{
    kill_valid HiveMetaStore
    kill_valid HiveServer2
}

# wait方法不能随意使用,必须在启动执行后才能执行。
wait_start()
{
    local max_retries=40  # 设置最大重试次数 40次,重启时间400秒,如果200秒内没有启动成功,则认为启动失败。
    local retries=0       # 初始化重试计数器

    metapid=$(check_process HiveMetastore $METASTORE_PORT)
    server2pid=$(check_process HiveServer2 $HIVESERVER2_PORT)

    while { [ -z "$metapid" ] || [ -z "$server2pid" ]; } && [ $retries -lt $max_retries ]; do
        sleep 5
        echo "$CURRENT_TIME:启动中($retries)。。。" | tee -a $CHECK_LOG
        metapid=$(check_process HiveMetastore $METASTORE_PORT)
        server2pid=$(check_process HiveServer2 $HIVESERVER2_PORT)
        retries=$((retries + 1))
    done

    # 检查是否达到最大重试次数
    if [ $retries -ge $max_retries ]; then
        echo "$CURRENT_TIME:达到最大重试次数,后台等待" | tee -a $CHECK_LOG
        hive_stop
        sleep 10
        hive_start
    else
        echo "$CURRENT_TIME:HIVE状态正常" | tee -a $CHECK_LOG
    fi
}


hive_start()
{
    check_works
    metapid=$(check_process HiveMetastore $METASTORE_PORT)
    if [ -z "$metapid" ]; then
        kill_valid HiveMetaStore
        echo "$CURRENT_TIME:Metastore启动中" | tee -a $CHECK_LOG
        nohup hive --service metastore 2>$HIVE_LOG_DIR/metastore.log 1>/dev/null &
    fi
    server2pid=$(check_process HiveServer2 $HIVESERVER2_PORT)
    if [ -z "$server2pid" ]; then
        kill_valid HiveServer2
        echo "$CURRENT_TIME:HiveServer2启动中" | tee -a $CHECK_LOG
        nohup hive --service hiveserver2 2>$HIVE_LOG_DIR/hiveServer2.log 1>/dev/null &
    fi
}

status()
{
    metapid=$(check_process HiveMetastore $METASTORE_PORT)
    server2pid=$(check_process HiveServer2 $HIVESERVER2_PORT)

    if [ -n "$metapid" ] && [ -n "$server2pid" ]; then
        echo "$CURRENT_TIME:HIVE状态正常" | tee -a $CHECK_LOG
    else
        if [ -z "$metapid" ]; then
            echo "$CURRENT_TIME:Metastore未运行" | tee -a $CHECK_LOG
        fi
        if [ -z "$server2pid" ]; then
            echo "$CURRENT_TIME:HiveServer2未运行" | tee -a $CHECK_LOG
        fi
    fi
}

clean()
{
    echo "$CURRENT_TIME:清空日志 rm -rf $CHECK_LOG_REG" | tee -a $CHECK_LOG
    rm -rf $CHECK_LOG_REG
}


case $1 in
"start")
    hive_start
    wait_start
    ;;
"stop")
    hive_stop
    status
    ;;
"restart")
    hive_stop
    sleep 3
    hive_start
    wait_start
    ;;
"status")
    status
    ;;
"clean")
    clean
    ;;
*)
    echo Invalid Args!
    echo 'Usage: '$(basename $0)' start|stop|restart|status|clean'
    ;;
esac



#设置 HIVE_HOME 环境变量
HIVE_HOME=/data/soft/hive-3.1.2
# 每隔10分钟执行一次状态检测,有问题自动重启
*/10 * * * * sh $HIVE_HOME/hiveservice.sh start
# 每月15号清空2月前的hive日志
0 0 15 * * sh $HIVE_HOME/hiveservice.sh clean


定时调度

crontab -e
输入如下内容,注意修改环境变量,cron无法正常读取系统环境变量

#设置 HIVE_HOME 环境变量
HIVE_HOME=/data/soft/hive-3.1.2
# 每隔30分钟执行一次状态检测,有问题自动重启
*/30 * * * * sh $HIVE_HOME/hiveservice.sh start
# 每周天在0点01分执行一次 restart 任务
1 0 * * 0 sh $HIVE_HOME/hiveservice.sh restart >> $HIVE_HOME/log/cron.restart.log
# 每月15号清空2月前的hive日志
0 0 15 * * sh $HIVE_HOME/hiveservice.sh clean

crontab -l
检查crontab运行任务
tail -f /var/log/cron (centos)
cat /var/log/syslog (乌班图)

Windows C盘空间管理底层逻辑:TEMP、存储感知与系统还原点协同治理 Windows磁盘空间管理不是简单的文件删除,而是围绕TEMP临时目录、存储感知、系统还原点和磁盘清理四大机制构成的动态平衡系统。TEMP本质是进程级缓存通道,其生命周期受NTFS权限、文件锁及服务账户影响;存储感知作为后台自动化调度器,需定制策略避免误删关键缓存;系统还原点采用卷影副本技术,以块级差异存储保障恢复能力,但默认配额易失控。技术价值在于通过注册表调控、符号链接重定向、PowerShell精准清理与NTFS压缩等手段,实现C盘空间的可持续健康。典型应用场景包括开发环境临时文件暴涨、Windows 阅读详情

相关推荐

Cloudera Hadoop企业级故障排查与调优实战指南

Cloudera Hadoop是企业级大数据平台的核心发行版,其本质是Hadoop生态在生产环境中的深度封装与工程化落地。理解其运行原理,关键在于掌握配置驱动的服务协同机制、Kerberos与Ranger构成的多层安全模型,以及YARN资源调度与Hive/Impala性能调优的数据闭环方法论。它不仅涉及HDFS高可用、HiveServer2故障定位等典型场景,更要求运维与数据工程师具备从Cloudera Manager配置继承链、TLS证书SAN字段校验到LLAP缓存命中率分析的全栈排障能力。本指南聚焦CD

606

CDH集群日志定时清理脚本

脚本功能: 实现对CDH版本中 hadoop-yarn、 hadoop-hdfs、hive、oozie日志的定时清理。 #!/bin/bash ## 01-Handle logic of clean YARN RESOURCEMANAGER & NODEMANAGER logs. ######################################################## su - yarn -c ' YARN_PATH=/var/log/hadoop-y

liuwei0376的专栏 760

Hadoop高可用架构实战:NameNode与ResourceManager双活方案全解析

高可用(HA)是分布式系统设计的核心话题,核心目标是消除单点故障对集群稳定性的影响。在Hadoop生态中,NameNode和ResourceManager分别承担HDFS元数据管理与YARN资源调度职责,一旦发生故障,整个数据链路和计算服务都会面临中断风险。通过引入QJM(Quorum Journal Manager)实现元数据日志的多数派持久化,结合ZooKeeper协调自动故障转移,可以构建无单点的双活架构。该方案能有效缩短RTO,保障实时采集、离线调度、即席查询等生产场景的持续可用。本文从工程实践角度

weixin_34038293的博客 491

记一次CDH集群节点日志文件清理

集群运行一段时间(大概一月多)后,cloudera manager管理界面出现爆红,爆红的组件有hdfs、zookeeper,后续出现集群卡顿宕死。 发现问题 点击详细内容查看,报日志空间不够的错误。初步判断是各个组件的日志数据把空间占满了。因系统设置日志存储盘符50G。 查看各个目录下磁盘占用情况 df -h cdh的各组件的日志一般在/var/log目录下,因此主要关注“/” 查看/var/log下使用空间较大的文件夹,并由大到小排列 cd /var/log/ du -s ./* | sort -nr

萌兔兔MMQ!! 1021

Cloudera CDP 7.1.7企业级平台实战:从CM部署到Kerberos安全运维

Cloudera不是Hadoop的简单封装,而是面向PB级数据治理的企业级平台操作系统。其核心在于Cloudera Manager(CM)驱动的声明式编排能力、Kerberos深度集成的安全模型,以及Parcel机制保障的版本一致性与可回滚性。理解CM如何替代手工配置、Kerberos如何成为服务间信任根、CDP 7.1.x相比CDH 6.3在Parcel回滚与数据库兼容性上的工程优势,是构建高可用、可审计、可运维大数据平台的技术前提。本内容聚焦真实生产环境中的集群筑基、安全启用、故障三角定位(认证/存储/

weixin_34204722的博客 528

驱动与固件排错全指南:从显卡黑屏到数据库报错一次讲清

从软件与硬件交互的基础概念出发,区分驱动与固件的职责边界。固件是设备出厂内置的程序,驱动则是操作系统与硬件对话的翻译层,理解这一分层是高效排查故障的前提。文章围绕显卡驱动(如nvidia-smi失败)、数据库JDBC/ODBC报错、虚拟显示驱动(spacedesk、Virtual Display Driver)以及UFS底层驱动解析等典型场景,总结出“判断层次—确认状态—查看日志”的系统化排错思路。同时介绍DDU等工具的使用价值,帮助读者在Windows与Linux下安全清理和重装驱动。无论你是遇到黑屏、驱

weixin_34161083的博客 299

hiveserver2高可用+故障重启(失败重启)应用总结

为解决实际生产中HiveServer2故障问题,笔者多方查阅资料研究,总结以下方法,提高HiveServer2的高可用和失败自动重启

Brother_ning的博客 2354

Windows提权实战:20种核心思路与防御体系构建

权限提升是网络安全攻防中的核心环节,它允许攻击者从低权限账户获取系统管理员或SYSTEM权限。其原理在于利用系统漏洞、配置缺陷或权限继承机制,突破操作系统的安全边界。从技术价值看,掌握提权技术不仅能深化对Windows安全模型的理解,更是渗透测试、红队评估中横向移动与深度渗透的关键。常见的应用场景包括系统内核漏洞利用、服务配置滥用、凭证窃取以及第三方软件漏洞利用。本文聚焦Windows环境,系统梳理了包括内核漏洞利用、服务路径权限滥用、Mimikatz凭证提取及DLL劫持在内的二十种实战提权方法,并深入探讨

weixin_30417487的博客 320

安装CDH平台的服务器磁盘满了,磁盘清理过程记录

网上查到/tmp文件是临时文件,由于hiveserver2任务运行异常导致缓存未删除,正常情况下是会自动删除的。2.我的服务器上显示/tmp/hive/hive文件夹下的,一串字符串命名的文件特别大几乎把磁盘占满了。1.使用hdfs命令查看哪个文件占用最大。

小晨同学的博客 743

Flink原理与实战(java版)#第11章Flink的应用(整章)

分别介绍了Flink的CDC及与Flink集成、通过Flink CDC将MySQL数据实时同步到Elasticsearch和Table API & SQL的外部连接器Hive的应用。

alanchanchn的专栏 8423

Windows 10/11下Drive Composer Pro 2.9.0完整安装与连接ACS880变频器实战教程

本文详细介绍了在Windows 10/11系统上安装Drive Composer Pro 2.9.0并连接ACS880变频器的完整教程。从系统环境准备、软件安装到许可证配置,再到USB、蓝牙和以太网三种连接方式的实战操作,帮助工业自动化工程师快速掌握ABB变频器的调试技巧。

weixin_32956805的博客 528

驱动与固件排查实战:从NVIDIA安装到DDU清理的完整指南

在计算机系统中,驱动(driver)与固件(firmware)是两个常被混淆却又密切相关的底层机制。固件是硬件出厂时烧录的“出厂系统”,决定设备基础行为;驱动则是操作系统与硬件之间的“翻译官”,负责指令转换。理解二者边界,是解决硬件兼容性问题的第一步。在Linux环境下,安装NVIDIA显卡驱动常遇到“ubuntu装显卡驱动driver”的困境,Secure Boot、nouveau冲突、内核头文件缺失都是典型坑点;Windows用户则依赖“display driver uninstaller”(DDU)在

weixin_34268169的博客 313

Ubuntu22.04下ROS2与PX4仿真环境搭建全流程解析

本文详细解析了在Ubuntu22.04系统下搭建ROS2与PX4仿真环境的全流程,包括系统准备、ROS2 Humble安装、PX4飞控环境部署、ROS2与PX4通信桥梁搭建等关键步骤。针对常见问题提供了解决方案,并分享了性能优化和开发调试技巧,帮助开发者快速构建无人机仿真开发环境。

weixin_29248653的博客 607

Windows系统清理终极指南:彻底卸载Microsoft Edge的技术深度剖析

在Windows系统管理中,Microsoft Edge浏览器的强制预装一直困扰着追求纯净环境的用户和系统管理员。面对这一技术挑战,一个开源解决方案应运而生,为专业人士提供了彻底清理Edge及其WebView组件的强大工具。本文将深入解析这一工具的技术实现、应用场景和最佳实践,帮助您掌握Windows系统组件管理的核心技术。 ## 系统清理的挑战与解决方案 Windows系统的组件管理历来是技

gitblog_00213的博客 868

别再只会插卡了!用示波器实测SIM卡上电时序与通信波形(附故障排查)

本文深入解析了SIM卡通信的电气信号与时序规则,通过示波器实测波形揭示SIM卡上电时序与通信协议的关键细节。从VCC、CLK、RST、DATA四路信号的协同工作,到ATR(Answer to Reset)的解析,再到常见故障的波形诊断与排查方法,为硬件工程师提供了实用的调试指南。文章还分享了高级调试技巧与现代化工具链搭建建议,帮助提升物联网设备SIM卡通信的可靠性与效率。

weixin_42567279的博客 328

ADI恒流驱动芯片LT3763调试心得(25A恒流驱动)

看似很简单的一个电路,调了好几版硬件,中间还出现过一个插曲,就是电感,我用的是27A,1.5uH的,贴片封装,由于频繁试板,电感来回用热风枪拆了3次,结果上电空载到3A都没有问题,但是以上10A以上,就出现烧LT3763和mos的情况,一连烧了8片,搞得有点怀疑人生,一度觉得我的电路设计有问题,邮件咨询ADI的FAE后,确认电路设计没有问题。1、大功率同步整流的Nmos管都是取不同的型号,就是厂家推荐的主开关管和续流管的型号往往都不一样,这个里面有什么讲究,我没有整明白,暂时也不需要弄明白。

liming98lm的博客 3922

显卡驱动残留终结方案:Display Driver Uninstaller全解析

当你升级显卡驱动后遭遇游戏帧率骤降、新驱动安装反复失败或系统频繁蓝屏时,很可能是显卡驱动残留引发的"隐形故障"。这些散落在系统深处的驱动碎片如同未清理的装修垃圾,不仅占用资源,还会严重影响硬件性能。Display Driver Uninstaller(DDU)作为专业级驱动清理工具,能够深度清除各类显卡驱动残留,为硬件性能释放扫清障碍。本文将通过"问题发现→原理剖析→实战指南→场景适配→深度拓展"

gitblog_00896的博客 443

DDPG算法实战:用Python一步步实现深度强化学习中的连续动作控制

本文详细介绍了DDPG算法在深度强化学习中的连续动作控制应用,通过Python和PyTorch实现从零构建智能体。内容涵盖环境搭建、网络架构设计、经验回放、OU噪声实现及训练流程优化,帮助开发者掌握DDPG在机械臂控制等场景的核心技术。

weixin_30335575的博客 416

BrewUI实战:给Homebrew加上图形界面,让包管理更直观高效

包管理器是现代开发环境中不可或缺的基础设施,它通过命令行方式完成软件的安装、升级与依赖解析。然而,对于依赖关系复杂、输出信息冗长的场景,纯命令行交互往往带来较高的认知负担。将包管理能力与图形用户界面结合,能够显著降低操作门槛,提升日常维护效率。Homebrew作为macOS上最流行的包管理器,其强大的formula与cask生态覆盖了几乎所有开发工具。通过图形化外壳,用户可以在可视化界面中查看依赖树、批量执行升级、清理旧版本缓存,并在操作前后获得清晰的反馈。这种设计既保留了命令行底层能力,又获得了直观的交互

weixin_34049948的博客 378

uniapp - Invalid value “iife” for option “output.format” - UMD and IIFE output formats are not suppo

Invalid value “iife” for option “output.format” - UMD and IIFE output formats are not supported for code-splitting builds. uniapp 编译报错,vite vue3 Hbuilder 中编译报错,uniapp 打包 App 报错(vue3)hbuilder提示错误,uniapp运行到手机/模拟器 App 报错(vue3)uniapp项目启动报错,如何解决这个问题,安卓app,苹果app

🏆 前端领域优质创作者 3967

基于Simulink的四足机器人楼梯攀爬仿真模型

构建一个基于Simulink的四足机器人楼梯攀爬仿真模型,旨在模拟四足机器人在面对楼梯等障碍时的运动控制和稳定性调整。以下是一个详细的步骤指南,帮助你从零开始创建这样一个仿真模型。

xiaoheshang_123的博客 247

驱动与固件:从显卡驱动到WUDFRd报错的排查全攻略

在计算机系统中,驱动与固件常被混为一谈,但两者在架构层级、风险等级上截然不同:驱动是操作系统与硬件之间的翻译层,固件则是烧录于硬件中的底层逻辑。正确区分两者,是排查问题的基础。以用户高频搜索的“ubuntu装显卡驱动driver”为例,显卡驱动的安装与内核模块、Secure Boot等机制紧密相关;而“nvidia displayport firmware”则涉及显卡固件层面的缺陷修复,刷写错误可能导致硬件变砖。此外,Windows系统中常见的“wudfrd加载失败”报错,往往只是虚拟显示设备驱动加载失败的

cqwmy840702的博客 384

5.1 直流无刷电机(BLDC):基本控制概念

本文系统介绍了直流无刷电机(BLDC)控制系统的核心概念与技术。主要内容包括:控制系统的分层结构设计,开环与闭环控制的原理及特点,PWM调速技术及其调制方式,PID控制算法及其数字化实现方法,以及控制系统的性能评估指标。同时探讨了现代BLDC控制器硬件实现方案,并介绍了磁场定向控制(FOC)、直接转矩控制(DTC)等先进控制策略。文章全面阐述了BLDC电机控制从基本原理到前沿技术的知识体系,为相关应用提供了理论指导和技术参考。

技术工作者 492

Spark作业存档实战:构建可追溯的大数据任务管理体系

在大数据处理领域,任务的可追溯性与事后分析是保障系统稳定性和运维效率的关键。Apache Spark作为主流计算框架,其作业执行过程中的日志、配置与中间状态的有效管理,直接影响问题排查与性能优化的效率。通过事件日志机制与自定义监听器,可以实现对Spark应用全生命周期的系统化记录,将分散的运行时信息归档为结构化的工程资产。这一实践不仅解决了任务失败后难以定位根因、性能波动无法对比分析等常见痛点,还为团队知识沉淀、合规审计提供了可靠基础。本文聚焦于Spark作业存档的具体实现,涵盖从基础配置、脚本封装到自定义

weixin_33796177的博客 453

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Java-153 深入浅出 MongoDB 全面的适用场景分析与选型指南 场景应用指南

MongoDB 是现代高性能 NoSQL 数据库的代表,凭借其灵活的文档模型和出色的扩展能力,被广泛应用于网站数据存储、缓存系统、大数据分析、物联网、社交媒体、直播平台等多种场景。它以 BSON(二进制 JSON)格式存储数据,支持嵌套文档和动态字段,特别适合快速迭代与多变的数据结构需求。通过复制集、分片集群和 TTL 索引,MongoDB 实现了高可用、高可扩展和自动化的数据管理能力。在性能方面,MongoDB 在高并发写入、实时查询、地理位置计算和聚合分析中表现优异。相比传统关系型数据库,它无需预定义表

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

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

驱动与固件详解:从概念到排查实战指南

驱动(Driver)与固件(Firmware)是计算机硬件正常工作的两大基石,前者是操作系统与硬件间通信的桥梁,后者则固化在芯片中负责底层逻辑。理解两者的区别至关重要:很多硬件故障表面上像驱动问题,实则是固件缺陷,例如NVIDIA DisplayPort固件导致的黑屏。针对常见场景,Ubuntu装显卡驱动driver需利用附加驱动工具,而非盲目禁用nouveau;当显示器DP接口无信号时,应检查是否需要更新nvidia displayport firmware。此外,虚拟显示驱动、通用打印驱动、数据库驱动等

weixin_34290631的博客 433

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

上一篇: paimon中的Tag
下一篇: mysql mvvc 实现方案
JNWsong
博客等级 码龄9年 287粉丝 204原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值