这次彻底搞懂impala与flink应用开发【玩转华为云】-4008云顶国际网站

举报
龙哥手记 发表于 2022/10/06 19:47:59 2022/10/06
【摘要】 假如用户开发一个应用程序,来管理企业中的使用a业务的用户信息,使用impala客户端实现a业务操作流程

本文主要内容有

  • 一 mrs服务这个有啥用
  • 二 先配置好各云服务
  • 三 impala实验搞起
  • 四 再搞flink实验测试下

2.gif

1.1 什么是mrs?

mrs是华为云大数据mapreduce服务,是一个在云上部署和管理hadoop系统的整体服务,一键部署hadoop集群

3.gif

能供租户完全可控的一站式企业级大数据集群云服务,完全兼容开源接口,结合咱们华为云计算、存储优势及大数据行业深厚经验,目的给你高性能、低成本、灵活易用的全栈大数据平台。轻松运行hadoop、spark、hbase、kafka、storm等大数据组件,并具备在后续根据业务需要进行定制开发的能力,帮助企业快速构建海量数据信息处理系统,并通过对海量信息数据实时与非实时的分析挖掘,发现全新价值点和企业商机;

chrome_ccasim9dka.png

1.2 服务的功能怎么样?

1.2.1 趋势是什么

现代企业的数据集群在向集中化和云化方向发展,那么企业级大数据集群需要满足

  • 不同用户在集群上运行不同类型的应用和作业(分析、查询、流处理等),同时存放不同类型和格式的数据;
  • 某些类型的用户(例如银行、政府单位等)对数据安全非常关注,很难容忍将自己的数据与其他用户放在一起。

这给大数据集群带来了以下挑战:

  • 合理地分配和调度资源,以支持多种应用和作业在集群上平稳运行
  • 对不同的用户进行严格的访问控制,以保证数据和业务的安全

多租户把大数据集群的资源隔离成一个个资源集合,让它们彼此互不干扰,用户通过“租用”需要的资源集合,来运行应用和作业,并存放数据。在大数据集群上可以存在多个资源集合来支持多个用户的不同业务需求;所以呢,集群提供了完整的企业级大数据多租户4008云顶国际网站的解决方案,多租户是mrs大数据集群中的多个资源集合(每个资源集合就是一个租户),具有分配和调度资源(资源包括计算资源和存储资源)能力;

1.2.2 特性是啥

  • 合理配置和隔离资源

    租户之间的资源是隔离的,一个租户对资源的使用不影响其它租户,保证了每个租户根据业务需求去配置相关的资源,可提高资源利用效率。

  • 测量和统计资源消费

    系统资源以租户为单位进行计划和分配,租户是系统资源的申请者和消费者,其资源消费能够被测量和统计。

  • 保证数据安全和访问安全

    多租户场景下,分开存放不同租户的数据,以保证数据安全;控制用户对租户资源的访问权限,以保证访问安全。

     调度器增强

多租户根据调度器类型分为开源的capacity调度器和华为自主研发的增强型superior调度器。

为满足企业需求,克服yarn社区在调度上遇到的挑战与困难,华为自主研发的superior调度器,不仅集合了当前capacity调度器与fair调度器的优点,还做了以下增强:

  • 增强资源共享策略

    superior调度器支持队列层级,在同集群集成开源调度器的特性,并基于可配置策略进一步共享资源。针对实例,mrs集群管理员可通过superior调度器为队列同时配置绝对值或百分比的资源策略计划。superior调度器的资源共享策略将yarn的标签调度增强为资源池特性,yarn集群中的节点可根据容量或业务类型不同,进行分组以使队列更有效地利用资源。

  • 基于租户的资源预留策略

    部分租户可能在某些时间中运行关键任务,租户所需的资源应保证可用。superior调度器构建了支持资源预留策略的机制,在这些租户队列运行的任务可立即获取到预留资源,以保证计划的关键任务可正常执行。

  • 租户和资源池的用户公平共享

    superior调度器提供了队列内用户间共享资源的配置能力。每个租户中可能存在不同权重的用户,高权重用户可能需要更多共享资源。

  • 大集群环境下的调度性能优势

    superior调度器接收到各个nodemanager上报的心跳信息,并将资源信息保存在内存中,使得调度器能够全局掌控集群的资源使用情况。superior调度器采用了push调度模型,令调度更加精确、高效,大大提高了大集群下的资源使用率。另外,superior调度器在nodemanager心跳间隔较大的情况下,调度性能依然优异,不牺牲调度性能,也能避免大集群环境下的“心跳风暴”。

  • 优先策略

    当某个服务在获取所有可用资源后还无法满足最小资源的要求,则会发生优先抢占。抢占功能默认关闭。


1.3 可以覆盖哪些场景

1.3.1 海量数据分析场景

海量数据分析是现代大数据系统中的主要场景。通常企业会包含多种数据源,接入后需要对数据进行etl(extract-transform-load)处理形成模型化数据,以便提供给各个业务模块进行分析梳理,这类业务通常有以下特点:

  • 对执行实时性要求不高,作业执行时间在数十分钟到小时级别。
  • 数据量巨大。
  • 数据来源和格式多种多样。
  • 数据处理通常由多个任务构成,对资源需要进行详细规划。

例如在环保行业中,可以将天气数据存储在obs,定期转储到hdfs中进行批量分析,在1小时内mrs可以完成10tb的天气数据分析

如环保行业海量数据分析场景

该场景下mrs的优势如下

  • 低成本:利用obs实现低成本存储
  • 海量数据分析:利用hive实现tb/pb级的数据分析
  • 可视化的导入导出工具:通过可视化导入导出工具loader,将数据导出到dws,完成bi分析

1.3.2 海量数据存储场景

用户拥有大量结构化数据后,通常要提供基于索引的准实时查询能力,如车联网场景下,根据汽车编号查汽车维护信息,存储时,汽车信息会基于汽车编号进行索引,这样来实现该场景下的秒级响应,通常这类数据量比较庞大,用户可能保存1至3年的数据;

例如在车联网行业,某车企将数据储存在hbase中,以支持pb级别的数据存储和毫秒级的数据详单查询

车联网行业海量数据存储场景

该场景下mrs的优势如下

  • 实时:利用kafka实现海量汽车的消息实时接入
  • 海量数据存储:利用hbase实现海量数据存储,并实现毫秒级数据查询
  • 分布式数据查询:利用spark实现海量数据的分析查询


1.3.3 实时数据处理场景

实时数据处理通常用于异常检测、欺诈识别、并基于规则告警、业务流程监控等场景,在数据输入系统的过程中,详细对数据进行处理;

例如在梯联网行业,智能电梯的数据,实时传入到mrs的流式集群中进行实时告警

电梯联网行业低时延流式处理场景

该场景下mrs的优势如下

  • 实时数据采集:利用flume实现实时数据采集,并提供丰富的采集和存储连接方式。
  • 海量的数据源接入:利用kafka实现万级别的电梯数据的实时接入。


1.4 优势具体有哪些

mrs服务拥有强大的hadoop内核团队,基于华为fusioninsight大数据企业级平台构筑,历经行业数万节点部署量的考验,提供多级用户sla保障

mrs具有如下优势:

  • 高性能

    mrs支持自研的carbondata存储技术。carbondata是一种高性能大数据存储方案,以一份数据同时支持多种应用场景,并通过多级索引、字典编码、预聚合、动态partition、准实时数据查询等特性提升了io扫描和计算性能,实现万亿数据分析秒级响应。同时mrs支持自研增强型调度器superior,突破单集群规模瓶颈,单集群调度能力超10000节点。

  • 低成本

    基于多样化的云基础设施,提供了丰富的计算、存储设施的选择,同时计算存储分离,提供了低成本海量数据存储方案。mrs可以按业务峰谷,自动弹性伸缩,帮助客户节省大数据平台闲时资源。mrs集群可以用时再创建、用时再扩容,用完就可以销毁、缩容,确保成本最优。

  • 高安全

    mrs服务拥有企业级的大数据多租户权限管理能力,拥有企业级的大数据安全管理特性,支持按照表/按列控制访问权限,支持数据按照表/按列加密。

  • 易运维

    mrs提供可视化大数据集群管理平台,提高运维效率。并支持滚动补丁升级,可视化补丁发布信息,一键式补丁安装,无需人工干预,不停业务,保障用户集群长期稳定。

  • 高可靠

    mrs服务经过大规模的可靠性、长稳验证,满足企业级高可靠要求,同时支持数据跨az/跨region自动备份的数据容灾能力,自动反亲和技术,虚拟机分布在不同物理机上


2.1 买mrs集群

点华为云4008云顶国际集团官网左上角的图标回到4008云顶国际集团首页,点击“产品->大数据->mapreduce服务”进入mrs服务控制台,如下


点击“立即购买”

选“自定义购买”

区域:华北-北京四

集群名称:mrs

版本类型:普通版

集群版本:mrs 3.1.0 wxl

集群类型:自定义

勾选组件:hadoop/impala/kafka/flink/zookeeper/ranger

元数据:本地元数据

说明:如果希望把hive元数据存放在mysql中,可以选择配置数据连接

确认无误后点击“下一步”

接下来配置硬件

计费模式:按需计费

可用区:任意均可

虚拟私有云:vpc-bigdata

子网:subnet-bigdata

安全组:sg-bigdata

弹性公网ip:选择下拉框中的任意ip即可

集群节点

实例规格:全部选择通用计算增强型

8 vcpus |32 gb | c6.2xlarge.4

系统盘:高io 480 gb x 1

数据盘:高io 600 gb x 1

实例数量:master节点3台

分析core节点:2台

无需添加分析task节点

注意1:当实例规格选为“8 vcpus |32 gb | c6.2xlarge.4”时,可能会出现如下警告。由于本次实验仅用于学习测试,不受影响,点击确认即可

注意2:当node_group_1节点实例数量改为2后,可能会出现如下警告。暂时无需理会,后续步骤会解决

开启“拓扑调整”,勾选如下图位置所示的“dn, nm, b”。此操作表示在master3节点分别部署datanode, nodemanager, broker以解决如上警告

勾选所有节点上的impalad服务

确认无误后点击“下一步”

接下来进行高级配置

标签,主机名前缀,弹性伸缩,引导操作均无需配置

委托:暂不绑定

告警:关闭

日志记录:关闭


kerberos认证:保持关闭状态

用户名:admin

密码:自定义密码,例如hwcloud@user0

确认密码:再次输入

登录方式:密码

用户名:root

密码:自定义密码,例如hwcloud@user0

确认密码:再次输入


通信安全授权:勾选“确认授权”

确认无误后点击“立即购买->返回集群列表”

集群创建共计约等待【35分钟】(等待)。可在集群列表中查看到两台mrs集群的购买“状态”由“启动中”更新为“运行中”即可正常使用

点击集群名字,即可进入详情页面。其中弹性公网ip即为外部访问ip

添加安全组规则,默认情况下华为云外部无法直接连接集群,我们需要放开安全组限制

点击“管理安全组规则”

点击“入方向规则->添加规则”

点击“基本协议/全部协议”,实际项目中要根据访问最小化原则放通入方向,并设置优先级。本实验为方便使用,可放通全部入方向规则,并设置优先级为1。点击“确定”

2.2 链接mrs集群

打开实验桌面的“xfce终端”,用ssh命令连接集群,弹性公网ip见集群详情页那,连接成功后可显示“root@node-master...”信息

ssh root@xxx.xxx.xxx.xxx


impala是用于处理存储在hadoop集群中的大量数据的mpp(大规模并行处理)sql查询引擎。 它是一个用c 和java编写的开源软件。 与其他hadoop的sql引擎相比,它拥有高性能和低延迟的特点

3.1 背景信息

假定用户开发一个应用程序,用于管理企业中的使用a业务的用户信息,使用impala客户端实现a业务操作流程如下:

普通表的操作:

1.创建用户信息表user_info。

2.在用户信息中新增用户的学历、职称信息。

3.根据用户编号查询用户姓名和地址。

4.a业务结束后,删除用户信息表

3.2 安装impala客户端

在mrs集群详情页面,点击“前往manager”

点击“确定”

首次使用mrs manager会显示如下页面,先后点击“高级->添加例外->确认安全例外”即可

输入账号admin及集群创建时所对应的密码(例如hwcloud@user0)后登陆

点击左侧大数据服务列表中的impala,进入impala详情页面


点击“更多->下载客户端”

点击“x86_64->仅保存到如下路径->确定”,impala客户端将会下载到集群主节点(即公网ip所对应服务器)的/tmp/fusioninsight-client目录。下载时长约1分钟

打开实验桌面的“xfce终端”,使用ssh命令连接集群。弹性公网ip见集群详情页。连接成功后可显示“root@node-master...”信息

ssh root@xxx.xxx.xxx.xxx

进入impala客户端下载目录并解压


cd /tmp/fusioninsight-client/
tar -vxf fusioninsight_cluster_1_impala_client.tar
tar -vxf fusioninsight_cluster_1_impala_clientconfig.tar

安装impala客户端至/opt/client目录

cd /tmp/fusioninsight-client/fusioninsight_cluster_1_impala_clientconfig
./install.sh /opt/client

安装成功后将显示如下信息

切换到impala安装目录并启动

cd /opt/client
source bigdata_env
impala-shell

启动成功将会显示如下界面

退出impala环境

quit;

3.3 创建用户信息数据

创建用户信息表user_info

vi user_info

按键盘“i”键进入编辑模式,输入用户信息如下

12005000201 a 男 19 a城市
12005000202 b 女 23 b城市
12005000203 c 男 26 c城市
12005000204 d 男 18 d城市
12005000205 e 女 21 e城市
12005000206 f 男 32 f城市
12005000207 g 女 29 g城市
12005000208 h 女 30 h城市
12005000209 i 男 26 i城市
12005000210 j 女 25 j城市

按ecs键退出编辑模式。输入“:wq” 然后回车保存并退出user_info

:wq

3.4登录impala客户端

运行impala客户端命令

impala-shell

3.5 内部表的操作

创建用户信息表user_info并添加相关数据

create table user_info(id string,name string,gender string,age int,addr string);
insert into table user_info(id,name,gender,age,addr) values ("12005000201","a","男",19,"a城市");

在用户信息表user_info中新增用户的学历、职称信息

alter table user_info add columns(education string,technical string);

根据用户编号查询用户姓名和地址

select name,addr from user_info where id='12005000201';

删除用户信息表

drop table user_info;

3.6 外部表的操作

创建外部表


create external table user_info(id string,name string,gender string,age int,addr string) partitioned by(year string) row format delimited fields terminated by ' ' lines terminated by '\n' stored as textfile location '/hive/user_info';

使用insert语句插入数据

insert into user_info partition(year="2018") values ("12005000201","a","男",19,"a城市");

执行以下sql语句,查看数据插入成功

select * from user_info;

退出impala环境

quit;

3.6.1使用load data命令导入文件数据

上传文件至hdfs

hdfs dfs -put user_info /tmp

进入impala环境

impala-shell

加载数据到表中

load data inpath '/tmp/user_info' into table user_info partition (year='2018');

查询导入数据

select * from user_info;

删除用户信息表

drop table user_info;

flink是一个批处理和流处理结合的统一计算框架,其核心是一个提供了数据分发以及并行化计算的流数据处理引擎。它的最大亮点是流处理,是业界最顶级的开源流处理引擎。

flink最适合的应用场景是低时延的数据处理(data processing)场景:高并发pipeline处理数据,时延毫秒级,且兼具可靠性

4.1场景介绍

假定某个flink业务每秒就会收到1个消息记录。基于某些业务要求,开发的flink应用程序实现功能:实时输出带有前缀的消息内容

4.2安装jdk环境

运行下列代码下载jdk1.8压缩文件

wget https://hcip-materials.obs.cn-north-4.myhuaweicloud.com/jdk-8u341-linux-x64.tar.gz

下载完成后,运行下列命令进行解压:

tar -zxvf jdk-8u341-linux-x64.tar.gz

解压成功后即可,无需修改启动配置文件

4.3 新建flink maven工程

打开实验桌面的eclipse,点击“file->new->project”

选择“maven project”,点击“next”

勾选“create a simple project…”,点击“next”

输入:

group id: com.huawei

artifact id: flinkexample

点击“finish”

4.4修改jdk路径

右上角选择window标签,在下拉菜单最后一栏中找到preferences

点击preferences,在新窗口的左侧找到java->compiler

右侧找到compiler compliance level 16,点击16的下拉菜单,在列表中找到1.8,选择1.8即可

确认改为1.8之后,点击apply and close

然后在下方还能找到installed jres标签,点击add按钮进行配置


在弹出的新窗口处选择standard vm,然后点击next

在jre home处填入/home/user/jdk1.8.0_341,即可自动匹配关联下方信息

确认无误后点击finish,然后勾选新增的jdk前的框。点击apply and close

回到初始界面,看到项目名称下有一个类似jre system library [j2se-1.5]的标签

右键点击该标签,选择build path->configure build path

在新窗口点击add library

选择jre system library,点击next

此时应该能看到workspace default jre (jdk1.8.0_341),保证勾选后点击finish

将之前的j2se-1.5直接删除。选择该模块,在右边找到remove

删除之后,点击右下角的apply and close即可

4.5配置pom文件

打开“flinkexample->pom.xml”文件


将pom.xml文件内容替换如下


  4.0.0
  com.huawei
  flinkexample
  0.0.1-snapshot
  
  
        1.12.0-hw-ei-310003
        3.5.6-12.0
    
    
        
            org.apache.flink
            flink-core
            ${flink.version}
            
                
                    org.apache.flink
                    flink-shaded-hadoop-2
                
            
        
        
            org.apache.flink
            flink-java
            ${flink.version}
            
                
                    org.apache.flink
                    flink-shaded-hadoop-2
                
            
        
        
            org.apache.flink
            flink-streaming-java_2.11
            ${flink.version}
            
                
                    org.apache.flink
                    flink-shaded-hadoop-2
                
            
        
        
            org.apache.flink
            flink-connector-kafka_2.11
            ${flink.version}
        
        
            org.apache.flink
            flink-shaded-zookeeper-3
            ${flink.shaded.zookeeper.version}
        
    
    
        
            huaweicloud2
            huaweicloud2
            https://mirrors.huaweicloud.com/repository/maven/
        
        
            huaweicloud1
            huaweicloud1
            https://repo.huaweicloud.com/repository/maven/huaweicloudsdk/
        
    
    
        
            
                maven-assembly-plugin
                
                    
                        jar-with-dependencies
                    
                
                
                    
                        make-assembly
                        package
                        
                            assembly
                        
                    
                
            
        
    

关闭pom.xml,下载第三方依赖程序包需要一定时间,预计约需5分钟左右

4.6 开发程序

4.6.1 创建程序包

在“src/main/java”处右键“new->package”

创建包flinkdemo,点击“finish”

4.6.2 创建类writeintokafka

在上步flinkdemo处右键点击,选择“new->class”创建java类writeintokafka

package flinkdemo;
import org.apache.flink.api.java.utils.parametertool;
import org.apache.flink.streaming.api.datastream.datastream;
import org.apache.flink.streaming.api.environment.streamexecutionenvironment;
import org.apache.flink.streaming.api.functions.source.sourcefunction;
import org.apache.flink.streaming.connectors.kafka.flinkkafkaproducer;
import org.apache.flink.streaming.util.serialization.simplestringschema;
public class writeintokafka {
    public static void main(string[] args) throws exception {
        streamexecutionenvironment env = streamexecutionenvironment.getexecutionenvironment();
        env.setparallelism(1);
        parametertool paratool = parametertool.fromargs(args);
        datastream messagestream = env.addsource(new simplestringgenerator());
        messagestream.addsink(
                new flinkkafkaproducer(paratool.get("topic"), new simplestringschema(), paratool.getproperties()));
        env.execute();
    }
    public static class simplestringgenerator implements sourcefunction {
        private static final long serialversionuid = 2174904787118597072l;
        boolean running = true;
        long i = 0;
        public void run(sourcecontext ctx) throws exception {
            while (running) {
                ctx.collect("element-"   (i  ));
                thread.sleep(1000);
            }
        }
        public void cancel() {
            running = false;
        }
    }
}

4.6.3 程序打包

在flinkexample右键,选择“run as->maven install”导出jar包

成功导出jar包后,可以在target文件夹下找到flinkexample-0.0.1-snapshot.jar

将flinkexample-0.0.1-snapshot.jar上传至大数据集群/home/omm目录下。弹性公网ip见集群详情页

scp /home/user/eclipse-workspace/flinkexample/target/flinkexample-0.0.1-snapshot.jar root@xxx.xxx.xxx.xxx:/home/omm

4.6.4 安装flink客户端

类似于impala客户端安装,需要进入mrs manager页面,找到对应flink服务

点击“更多->下载客户端”

点击“x86_64->仅保存到如下路径”,保存路径修改为“/home/omm”。flink客户端将会下载到集群主节点(即公网ip所对应服务器)的对应目录。下载时长约1分钟


打开实验桌面的“xfce终端”,使用ssh命令连接集群。弹性公网ip见集群详情页。连接成功后可显示“root@node-master...”信息

ssh root@xxx.xxx.xxx.xxx

修改文件所属用户、用户组信息、操作权限

cd /home/omm
chown omm:wheel flinkexample-0.0.1-snapshot.jar
chmod 777 flinkexample-0.0.1-snapshot.jar
chmod 777 fusioninsight_cluster_1_flink_client.tar

解压客户端

tar -vxf fusioninsight_cluster_1_flink_client.tar 
tar -vxf fusioninsight_cluster_1_flink_clientconfig.tar

安装flink客户端至/home/omm目录

cd fusioninsight_cluster_1_flink_clientconfig
./install.sh /home/omm/flinkclient

安装成功后将显示如下信息

4.6.5 writeintokafka程序运行

4.6.5.1查询集群kafka broker信息

在mrs manager页面,找到对应kafka服务

点击“实例”即可看到broker所对应的业务ip信息

4.6.5.2查询集群zookeeper信息

同理,在mrs manager页面,找到对应zookeeper服务

点击“实例”即可看到broker所对应的业务ip信息

4.6.5.3创建kafka主题topic

进入kakfa客户端目录

cd /opt/bigdata/components/fusioninsight_hd_8.1.0.1/kafka/client/install_files/kafka/bin

为脚本添加可执行权限:

chmod 777 kafka-topics.sh
chmod 777 kafka-run-class.sh
chmod 777 kafka-console-producer.sh
chmod 777 kafka-console-consumer.sh

创建topic

./kafka-topics.sh --create --zookeeper xxx.xxx.xxx.xxx:2181/kafka --topic flinktopic --replication-factor 2 --partitions 2

其中“xxx.xxx.xxx.xxx:2181” 为集群中的zookeeper任一服务地址,端口保持不变

4.6.5.4查看topic

执行命令

./kafka-topics.sh --list --zookeeper xxx.xxx.xxx.xxx:2181/kafka

4.6.6writeintokafka程序运行

4.6.6.1创建kafka消费者

新建xfce终端窗口,登录集群。

ssh root@xxx.xxx.xxx.xxx

进入kafka目录。

cd /opt/bigdata/components/fusioninsight_hd_8.1.0.1/kafka/client/install_files/kafka/bin

执行命令创建消费者,这里ip地址为broker的任一业务ip地址。

./kafka-console-consumer.sh --topic flinktopic --bootstrap-server xxx.xxx.xxx.xxx:9092 --from-beginning

3.6.6.2启动writeintokafka作为kafka生产者

新建xfce终端窗口,登录集群

ssh root@xxx.xxx.xxx.xxx

flink应用处于安全性考虑,需要由非root用户启动

su omm

切换到flink安装目录

cd /home/omm/flinkclient

应用环境变量信息

source bigdata_env

检查“flinkyarnsessioncli”进程是否启动

jps

注意:若无“flinkyarnsessioncli”进程,则启动yarn集群

cd flink/flink/bin
./yarn-session.sh &

运行flink应用程序

flink run --class flinkdemo.writeintokafka /home/omm/flinkexample-0.0.1-snapshot.jar --topic flinktopic --bootstrap.servers xxx.xxx.xxx.xxx:9092

运行成功后可在kafka消费者窗口看到数据输出

任务完成

【4008云顶国际集团的版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200