Kylin修改默认hbase namespace命名空间default的解决方案

【云原生 从零开始学Kubernetes】七、资源清单与Namespace_managedfields 这里就只展示一个的查看方法,可以自己尝试一下去查看各种字段下的各种信息,不然篇幅太长!KIND: Pod# metadata 是对象,下面可以有多个字段FIELDS:# annotations 是注解,map 类型表示对应的值是 key-value 键值对,表示 key 和value 都是 String 类型的。 阅读详情

问题及背景:同一用户的三家公司的物理集群合并,合并后用dataspace+kerberos控制不同公司对集群资料的访问权限,三家公司分别使用独立的kerberos票据访问,特定的namespace,而生产环境部署的kylin-2.0/2.1只能保存cuboid到hbase 的 default namespace。

解决的过程及方案:
1、经多方查找发现, Kylin源码github项目,最新的master分支已经支持更改存储的hbase的默认namespace,但是官方对外发布的最新安装包才更新到Kylin-2.1版本,且最新源码并没有经过生产的验证,不敢冒然部署,于是想办法在现有的版本上重新编译源码、打包。
2、经多方搜索确认更改hbase namespace的commit是kylin-2846,于是查找相关实现的细节。

解决思路:
1、首先按照github上提供的修改方法更改了https://github.com/apache/kylin/commit/ffcbdb7f4288fa6011f018163bdce9602415cf10
中的五个类,重新编译打包,执行到convert cuboid Data to HFile这一步的时候抛出异常,找不到Hbase表

org.apache.hadoop.hbase.TableNotFoundException:ISW:KYLIN_F3KD3ZC1LU 
at org.apache.hadoop.hbase.client.HBaseAdmin.getTableDescriptor(HBaseAdmin.java:575)

而这时,我在hbase shell指定的namespace查看,已经生成了hbase表,为什么会找不到呢?继续查找原因
2、继续找Kylin-2846相关的内容,发现有人遇到同样的问题,地址:https://issues.apache.org/jira/browse/KYLIN-2846
原来github上给出的代码少了很关键的一步:

---
 .../main/java/org/apache/kylin/storage/hbase/steps/CubeHFileJob.java    | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/steps/CubeHFileJob.java b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/steps/CubeHFileJob.java
index 9f9b382..7a583ca 100644
--- a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/steps/CubeHFileJob.java
+++ b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/steps/CubeHFileJob.java
@@ -92,7 +92,7 @@ public class CubeHFileJob extends AbstractHadoopJob {
             attachCubeMetadata(cube, job.getConfiguration());

             Configuration hbaseConf = HBaseConfiguration.create(getConf());
-            HTable htable = new HTable(hbaseConf, getOptionValue(OPTION_HTABLE_NAME).toUpperCase());
+            HTable htable = new HTable(hbaseConf, getOptionValue(OPTION_HTABLE_NAME));

             // Automatic config !
             HFileOutputFormat.configureIncrementalLoad(job, htable);
-- 
1.9.1
具体的修改步骤如下:

From 004e1bcb983442a1a2c69f7d1d6c09dc29d4301e Mon Sep 17 00:00:00 2001
From: Liu Shaohui <liushaohui@xiaomi.com>
Date: Tue, 5 Sep 2017 15:50:29 +0800
Subject: [PATCH] Add a config of hbase namespace for cube storage

---
 .../src/main/java/org/apache/kylin/common/KylinConfigBase.java        | 4 ++++
 core-common/src/main/resources/kylin-defaults.properties              | 3 +++
 core-cube/src/main/java/org/apache/kylin/cube/CubeManager.java        | 2 ++
 .../main/java/org/apache/kylin/storage/hbase/steps/BulkLoadJob.java   | 2 +-
 .../main/java/org/apache/kylin/storage/hbase/steps/CubeHFileJob.java  | 2 +-
 5 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java b/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java
index 749b515..3f53023 100644
--- a/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java
+++ b/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java
@@ -712,6 +712,10 @@ abstract public class KylinConfigBase implements Serializable {
         return StorageURL.valueOf(url);
     }

+    public String getHBaseStorageNameSpace() {
+        return getOptional("kylin.storage.hbase.namespace", "default");
+    }
+
     public String getHBaseClusterFs() {
         return getOptional("kylin.storage.hbase.cluster-fs", "");
     }
diff --git a/core-common/src/main/resources/kylin-defaults.properties b/core-common/src/main/resources/kylin-defaults.properties
index a3277ce..34fb5a0 100644
--- a/core-common/src/main/resources/kylin-defaults.properties
+++ b/core-common/src/main/resources/kylin-defaults.properties
@@ -65,6 +65,9 @@ kylin.source.hive.redistribute-flat-table=true
 # The storage for final cube file in hbase
 kylin.storage.url=hbase

+# The namespace for hbase storage
+kylin.storage.hbase.namespace=default
+
 # Compression codec for htable, valid value [none, snappy, lzo, gzip, lz4]
 kylin.storage.hbase.compression-codec=none

diff --git a/core-cube/src/main/java/org/apache/kylin/cube/CubeManager.java b/core-cube/src/main/java/org/apache/kylin/cube/CubeManager.java
index 043993c..484b977 100644
--- a/core-cube/src/main/java/org/apache/kylin/cube/CubeManager.java
+++ b/core-cube/src/main/java/org/apache/kylin/cube/CubeManager.java
@@ -684,11 +684,13 @@ public class CubeManager implements IRealizationProvider {
     }

     private String generateStorageLocation() {
+        String namespace = config.getHBaseStorageNameSpace();
         String namePrefix = IRealizationConstants.CubeHbaseStorageLocationPrefix;
         String tableName = "";
         Random ran = new Random();
         do {
             StringBuffer sb = new StringBuffer();
+            sb.append(namespace).append(":");
             sb.append(namePrefix);
             for (int i = 0; i < HBASE_TABLE_LENGTH; i++) {
                 sb.append(ALPHA_NUM.charAt(ran.nextInt(ALPHA_NUM.length())));
diff --git a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/steps/BulkLoadJob.java b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/steps/BulkLoadJob.java
index 30616c5..d1caccb 100644
--- a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/steps/BulkLoadJob.java
+++ b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/steps/BulkLoadJob.java
@@ -47,7 +47,7 @@ public class BulkLoadJob extends AbstractHadoopJob {
         options.addOption(OPTION_CUBE_NAME);
         parseOptions(options, args);

-        String tableName = getOptionValue(OPTION_HTABLE_NAME).toUpperCase();
+        String tableName = getOptionValue(OPTION_HTABLE_NAME);
         // e.g
         // /tmp/kylin-3f150b00-3332-41ca-9d3d-652f67f044d7/test_kylin_cube_with_slr_ready_2_segments/hfile/
         // end with "/"
diff --git a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/steps/CubeHFileJob.java b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/steps/CubeHFileJob.java
index 1a624c4..9f9b382 100644
--- a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/steps/CubeHFileJob.java
+++ b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/steps/CubeHFileJob.java
@@ -68,7 +68,7 @@ public class CubeHFileJob extends AbstractHadoopJob {
             Path partitionFilePath = new Path(getOptionValue(OPTION_PARTITION_FILE_PATH));

             Path output = new Path(getOptionValue(OPTION_OUTPUT_PATH));
-            String cubeName = getOptionValue(OPTION_CUBE_NAME).toUpperCase();
+            String cubeName = getOptionValue(OPTION_CUBE_NAME);

             CubeManager cubeMgr = CubeManager.getInstance(KylinConfig.getInstanceFromEnv());

-- 
1.9.1
2、、、

From 677400ee7b4cf5be0ddc9b595d80e02a0ba87c12 Mon Sep 17 00:00:00 2001
From: Liu Shaohui <liushaohui@xiaomi.com>
Date: Fri, 15 Sep 2017 14:34:18 +0800
Subject: [PATCH] Addium for KYLIN-2846

---
 .../main/java/org/apache/kylin/storage/hbase/steps/CubeHFileJob.java    | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/steps/CubeHFileJob.java b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/steps/CubeHFileJob.java
index 9f9b382..7a583ca 100644
--- a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/steps/CubeHFileJob.java
+++ b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/steps/CubeHFileJob.java
@@ -92,7 +92,7 @@ public class CubeHFileJob extends AbstractHadoopJob {
             attachCubeMetadata(cube, job.getConfiguration());

             Configuration hbaseConf = HBaseConfiguration.create(getConf());
-            HTable htable = new HTable(hbaseConf, getOptionValue(OPTION_HTABLE_NAME).toUpperCase());
+            HTable htable = new HTable(hbaseConf, getOptionValue(OPTION_HTABLE_NAME));

             // Automatic config !
             HFileOutputFormat.configureIncrementalLoad(job, htable);
-- 
1.9.1
3、clean htable

diff --git a/server-base/src/main/java/org/apache/kylin/rest/job/StorageCleanJobHbaseUtil.java b/server-base/src/main/java/org/apache/kylin/rest/job/StorageCleanJobHbaseUtil.java
index 3728ea1..2d95542 100644
--- a/server-base/src/main/java/org/apache/kylin/rest/job/StorageCleanJobHbaseUtil.java
+++ b/server-base/src/main/java/org/apache/kylin/rest/job/StorageCleanJobHbaseUtil.java
@@ -46,15 +46,28 @@ public class StorageCleanJobHbaseUtil {

     public static void cleanUnusedHBaseTables(boolean delete, int deleteTimeout) throws IOException {
         Configuration conf = HBaseConfiguration.create();
-        CubeManager cubeMgr = CubeManager.getInstance(KylinConfig.getInstanceFromEnv());
+        KylinConfig config = KylinConfig.getInstanceFromEnv();
+        CubeManager cubeMgr = CubeManager.getInstance(config);
         // get all kylin hbase tables
         try (HBaseAdmin hbaseAdmin = new HBaseAdmin(conf)) {
-            String tableNamePrefix = IRealizationConstants.SharedHbaseStorageLocationPrefix;
+            String namespace = config.getHBaseStorageNameSpace();
+            StringBuffer sb = new StringBuffer();
+            String tableNamePrefix = null;
+            if(namespace.equals("default") || namespace.equals("")){
+                tableNamePrefix = IRealizationConstants.SharedHbaseStorageLocationPrefix;
+            }else{
+                sb.append(config.getHBaseStorageNameSpace()).append(":");
+                sb.append(IRealizationConstants.SharedHbaseStorageLocationPrefix);
+                tableNamePrefix = sb.toString();
+            }
+
             HTableDescriptor[] tableDescriptors = hbaseAdmin.listTables(tableNamePrefix + ".*");
+
             List<String> allTablesNeedToBeDropped = new ArrayList<String>();
             for (HTableDescriptor desc : tableDescriptors) {
+
                 String host = desc.getValue(IRealizationConstants.HTableTag);
-                if (KylinConfig.getInstanceFromEnv().getMetadataUrlPrefix().equalsIgnoreCase(host)) {
+                if (config.getMetadataUrlPrefix().equalsIgnoreCase(host)) {
                     //only take care htables that belongs to self, and created more than 2 days
                     allTablesNeedToBeDropped.add(desc.getTableName().getNameAsString());
                 }

修改完后,core-common, core-cure, storage-hbase三个目录重新打jar包,覆盖原Kylin安装目录KYLIN_HOME/tomcat/webapps/kylin.war下对应的jar包,重启Kylin,问题解决。

17.Kubernetes集群:命名空间(Namespace) 什么是Namespace? 你可以认为namespaces是你kubernetes集群中的虚拟化集群。在一个Kubernetes集群中可以拥有多个命名空间,它们在逻辑上彼此隔离。 他们可以为您和您的团队提供组织,安全甚至性能方面的帮助! “default” Namespace 大多数的Kubernetes中的集群默认会有一个叫default的namespace。实际上,应该是3个: default:你的service和app默认被创建于此。 kube-system:kubernetes系统组件使用。 ku 阅读详情

相关推荐

Kylin基本介绍

Kylin 1、kylin基本介绍 Apache Kylin 是一个开源的分布式存储引擎,最初由 eBay 开发贡献至开源 社区。它提供 Hadoop 之上的 SQL 查询接口及多维分析(OLAP)能力以支持大规 模数据,能够处理 TB 乃至 PB 级别的分析任务,能够在亚秒级查询巨大的 Hive 表,并支持高并发。 1.1、为什么要使用kylin 自Hadoop 诞生以来,大数据的存储和批处理问题均得到了妥善解决,而如何高速地分析数据也就成为了下一个挑战。 于是各式各样的“SQL on Hadoop”技术

TU_JCN的博客 8145

Namespace

Namespace命令行创建;YAML文件创建;Namespace用例

K要努力的博客 526

hbase manager 2.0.9 安装

hbase web数据管理页面 hbase manager安装

JustinMars的博客 1156

HBase命名空间

概述 在一个项目中,需要使用HBase保存多张表,这些表会按照业务域来划分 为了方便管理,不同的业务域以名称空间(namespace)来划分,这样管理起来会更加容易 类似于Hive中的数据库,不同的数据库下可以放不同类型的表 Hbase中有两个默认的命名空间: default,默认情况下,创建表时表都将创建在 default 名称空间下 hbase,用于存放系统的内建表(namespace、meta) 命令 # 一、命名空间 # 1.创建一个命名空间 create_namespace 'MOMO_CHA

unclever_behurt的博客 2487

华硕ROG幻16笔记本电脑模式切换管理工具完美替代华硕奥创中心管理工具

参考文档1这个工具可以完美替代华硕奥创中心工具,可以定制化不同模式下的CPU、GPU、风扇转速、电池计划等。是由华硕开发人员开发的一个纯绿色的系统管理工具。直接展示启动后的工具界面效果图:这个工具也可以一键式停止正在运行的华硕ASUS服务,减少不必要的资源消耗。

追梦&天空的博客 1万+

【无人机对抗】基于matlab无人机红蓝对抗仿真【含Matlab源码 4436期】

无人机红蓝对抗仿真 完整代码,包运行;可提供运行操作视频!适合小白!

Matlab3024528700的博客 1381

【大数据技术之HBase】初识Hbase(一)

初识Hbase、Hbase基本原理,Hbase数据模型

qq_42575776的博客 1077

不只是抓取:用五指灵巧手(ROH-A001/RH56)玩转ROS2下的力控与混合控制

本文深入探讨了在ROS2环境下使用五指灵巧手(ROH-A001/RH56)实现力控与混合控制的实战技巧。从硬件通信协议解析到ROS2节点开发,详细介绍了力感知架构、实时数据处理和混合控制策略,帮助开发者在Ubuntu系统中高效实现精密操作。通过鸡蛋抓取等实例,展示了力控技术在机器人灵巧操作中的关键作用。

weixin_28221501的博客 287

HBase 默认配置文件 hbase-default.xml 注释解析HBase默认配置文件注释解析:hbase-default.xml、

hbase配置文件

weixin_43459847的博客 810

Star CCM+ 202206 (17.04) 详细安装步骤

StarCCM+ 17.04 安装包和详细安装步骤

薛定谔的alpha狗 3万+

Pre-suite 开发之MFi功能搭建

Pre-suite 固件中只有带无线硬件的Ezairo 7160sl才具备无线通信能力,其无线功能包括标准BLE 5.2 低功耗蓝牙功能以及非标准的低功耗无线音频流功能。Ezairo 7160sl 支持3种低功耗无线音频流协议:来自APPLE的MFi,来自Google的ASHA以及来自onsemi的remote mic。其中MFi音频流走的G.722编码的Mode1,速率为64kbps;而非MFi音频流走的G.722的Mode3,速率为48kbps.

SnowYang2017的博客 1506

HBase:Namespace的概念和相关命令使用

1.声明 当前内容主要用于本人学习和复习,当前内容为HBase中的namespace的使用 2.Namespace A namespace is a logical grouping of tables analogous to a database in relation database systems. This abstraction lays the groundwork for upcoming multi-tenancy related features: Quota Management

编程学习者的博客 1363

【即插即用模块】注意力篇 | ECCV 2024 | DPB:高低频动态分离+双提示融合,PSNR直冲40+!

本文提出了一种基于频率提示的图像恢复方法FPro,通过动态滤波器分离输入特征的高低频分量,并采用双提示块(DPB)进行频域专属提示生成与调制。DPB包含低频提示调制器(LPM)和高频提示调制器(HPM),分别处理不同频段信号,通过生成提示组件并融合解码器特征来优化恢复效果。实验表明,该方法在U型结构中表现优异,尤其适用于分割、底层视觉和多模态任务。模块通过动态无监督频率分离、频域专属提示生成和适配性融合机制,有效解决了传统方法对频域信息关注不足的问题,显著提升了图像恢复质量。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 149

黑猴子的家:HBase 命名空间

1、命名空间的结构 1)Table 表,所有的表都是命名空间的成员,即表必属于某个命名空间,如果没有指定,则在default默认的命名空间中。 2)RegionServer group 一个命名空间包含了默认的RegionServer Group。 3)Permission 权限,命名空间能够让我们来定义访问控制列表ACL(Access Control List)。例如,创建表,读取表,...

黑猴子的博客 327

西南科技大学模拟电子技术实验七(集成运算放大器的非线性应用)预习报告

将电位器Rp调至中心位置,用双综示波器观察并绘制方波U0的波形,测量其幅值和频率;将电位器RP调至中心位置,用示波器观察并绘制锯齿波U0的波形,记录;示波器基线调零,Ui输入1000HZ、幅值为2V的正弦信号,观察并记录Ui与U0波形,读出图中波形跳变时的Ui临界值;用万用表电位器RP调至预测结果位置,用示波器观察并描绘三角波输出U0及方波输出uo’,测其幅值、频率及Rp值,记录之。示波器基线调零,U输入1000HZ、幅值为2V的正弦信号,观察UI与U0波形。理论算法公式:当Ui

Welcome To My6n Blog 3937

Vins-Fusion 外参camera-imu 标定

Vins-Fusion是一种基于优化的多传感器状态估计器,一大特色是支持实时camera-imu外参校准(相机和IMU之间的旋转)。Vins-Fusion 外参camera-imu校准是利用两帧间计算相机位姿和imu预积分得到位姿,构建最小二乘问题,并通过SVD求解camera-imu外参旋转矩阵。

u010196944的博客 2490

hbase 命令详解之namespace与table

1、/hbase shell命令 从文件中读取shell命令 /hbase shell ./sample_commands.txt sample_commands文件中写入命令,一行一个。 2、status 查看服务器状态信息(服务器数量,死掉的服务器数量,平均负载) 3、version 版本信息 4、whoami 当前登录用户的信息(用户名,用户组) namespac...

天空之蓝的博客 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Kyin学习笔记(一)-----Kylin安装、入门案例和原理介绍

一、Kylin简介 1、Kylin的诞生背景 ebay-中国团队研发的,是第一个真正由中国人自己主导、从零开始、自主研发、并成为Apache顶级开源项目 Hive的性能比较慢,支持SQL灵活查询,特别慢 HBase的性能快,原生不支持SQL Kylin是将先将数据进行预处理,将预处理的结果放在HBase中。效率很高 2、Kylin的应用场景 Kylin 典型的应用场景如下: 用...

康师傅没有眼泪 2013

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

IDEA的使用指南

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

HBase学习笔记——命名空间(namespace)

在关系数据库系统中,命名空间namespace指的是一个表的逻辑分组,同一组中的表有类似的用途。命名空间的概念为即将到来的多租户特性打下基础: 配额管理(Quota Management (HBASE-8410)):限制一个namespace可以使用的资源,资源包括region和table等; 命名空间安全管理(Namespace Security Administration (HBASE-920

qq280929090的专栏 2万+

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

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

【Kylin】Kylin入门解析(一)

(图片来源于网络,侵删) 一、Kylin 概述 1.Kylin 简介 Apache Kylin 是一个开源的分布式分析引擎,提供 Hadoop/Spark 之上的 SQL 查询接口及多维分析(OLAP)能力以支持超大规模数据,最初由 eBay Inc 开发并贡献至开源社区。它能在亚秒内查询巨大的 Hive 表 2.Kylin 架构 1)REST Server REST Server 是一套面向应用程序开发的入口点,旨在实现针对 Kylin 平台的应用开发 工作。 此类应用程序可以提供查询、获取结果、触发

Together 3235

hbase之namespace

查看namespace hbase(main):008:0> list_namespace NAMESPACE default hbase test 3 row(s) Took 0.0327 seconds default:创建表时未指定命名空间的话默认挂在default下。 查看namespace所有表 hbase(main):009:0> list_namespace_tables "test"

Happywzy~的博客 462

银河麒麟桌面系统V10(SP1) apt 源安装 scrcpy 安卓手机投屏到电脑

安装日志 小米手机打开调试模式: 设置->我的设备->全部参数->连续点击 MIUI版本更多设置->开发者选项->USB调试 菜单,打开 “开启开发者选项”,打开“USB调试”弹出“允许USB调试”窗口,选择允许运行指令 效果......

hknaruto的专栏 5273

HBase namespace

HBase系统默认定义了两个缺省的namespace hbase:系统内建表,包括namespace和meta表 default:用户建表时未指定namespace的表都创建在此 创建namespace   hbase&gt;create_namespace 'ai_ns'     删除namespace hbase&gt;drop_namespace 'ai_n...

dingweijson的博客 235

hbase创建namespace,及创建表时指定namespace

转自:http://blog.sina.com.cn/s/blog_7de580090102v117.html public static void createTableAndNameSpace(String spaceName,String tableName) throws IOException { //创建namespace,名称只能是 alphanumeric ch...

adaadadsa的博客 4466

Hbase

Hbase定义数据模型Hbase 逻辑结构:Hbase 物理存储结构:Hbase 数据模型Hbase 基本架构 定义 Hbase是一个分布式、可扩展、支持海量数据存储的 NOSQL 数据库。 数据模型 逻辑上,Hbase 与 RDBMS 很类似,数据存储在一张表里,有行有列。但从 Hbase 的底层物理存储结构(k-v)来看,Hbase 更像是一个 multi-dimension map 多维字典。 Hbase 逻辑结构: 图图 Hbase 物理存储结构: 图图 Hbase 数据模型 Name Space

weixin_44595582的博客 527
上一篇: Kylin 2.0升级总结
下一篇: pip download timeout 下载慢,超时解决方法
Ronney-Hua
博客等级 码龄10年 48粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值