大数据技术实践实验报告_第1页
大数据技术实践实验报告_第2页
大数据技术实践实验报告_第3页
大数据技术实践实验报告_第4页
大数据技术实践实验报告_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实 验 报 告课程名称: 大数据技术实践 实验项目: 大数据平台 实验仪器: PC机 学 院: 计算机学院 专 业: 计算机科学与技术 班级姓名: * 学 号: * 日 期: 2019-5-9 指导教师: * 成 绩: 一. 实验目的1. 熟练掌握大数据计算平台相关系统的安装部署2. 理解大数据MapReduce计算模型,并掌握MapReduce程序开发3. 掌握Hive的查询方法4. 掌握Spark的基本操作二. 实验内容1. Hadoop完全分布模式安装2. Hadoop开发插件安装3. MapReduce代码实现4. Hive安装部署5. Hive查询6. Spark Standalon

2、e模式安装7. Spark Shell操作三. 实验过程Hadoop开发插件安装实验步骤:1.Eclipse开发工具以及Hadoop默认已经安装完毕,安装在/apps/目录下。2.在Linux本地创建/data/hadoop3目录,用于存放所需文件。切换目录到/data/hadoop3目录下,并使用wget命令,下载所需的插件hadoop-eclipse-plugin-2.6.0.jar。2. 将插件hadoop-eclipse-plugin-2.6.0.jar,从/data/hadoop3目录下,拷贝到/apps/eclipse/plugins的插件目录下。3. 进入ubuntu图形界面,双

3、击eclipse图标,启动eclipse。5.在Eclipse窗口界面,依次点击Window = Open Perspective = Other。弹出一个窗口。选择Map/Reduce,并点击OK,可以看到窗口中,有三个变化。(左侧项目浏览器、右上角操作布局切换、面板窗口)如果在windows下,则需要手动调出面板窗口Map/Reduce Locations面板,操作为,点击window = show view = Other。在弹出的窗口中,选择Map/Reduce Locations选项,并点击OK。这样便可以调出视图窗口Map/Reduce Location。6.添加Hadoop配置,

4、连接Hadoop集群。在这里添加Hadoop相关配置。Location name,是为此配置起的一个名字。DFS Master,是连接HDFS的主机名和端口号。点击Finish保存配置。7.另外还需保证Hadoop中的HDFS相关进程已经启动。在终端命令行输入jps查看进程状态。view plaincopy1. jps若不存在hdfs相关的进程,如Namenode、Datanode、secondarynamenode,则需要先切换到HADOOP_HOME下的sbin目录,启动hadoop。view plaincopy1. cd/apps/hadoop/sbin2. ./start-all.sh

5、8.展开左侧项目浏览视图,可以看到HDFS目录结构。9.上图发现HDFS上,没有存放任何目录。那下面来创建一个目录,检测插件是否可用。右键myhadoop下的文件夹,在弹出的菜单中,点击Create new directory。输入目录名称,点击OK则创建目录成功。右键文件夹,点击Refresh,可用刷新HDFS目录。到此Hadoop开发插件已经安装完毕!3. MapReduce代码实现实验步骤:1.切换目录到/apps/hadoop/sbin下,启动hadoop。view plaincopy1. cd/apps/hadoop/sbin2. ./start-all.sh2.在linux上,创建

6、一个目录/data/mapreduce1。view plaincopy1. mkdir-p/data/mapreduce13.切换到/data/mapreduce1目录下,使用wget命令从网址 1:60000/allfiles/mapreduce1/buyer_favorite1,下载文本文件buyer_favorite1。view plaincopy1. cd/data/mapreduce12. wget1:60000/allfiles/mapreduce1/buyer_favorite1依然在/data/mapreduce1

7、目录下,使用wget命令,从1:60000/allfiles/mapreduce1/hadoop2lib.tar.gz,下载项目用到的依赖包。view plaincopy1. wget1:60000/allfiles/mapreduce1/hadoop2lib.tar.gz将hadoop2lib.tar.gz解压到当前目录下。view plaincopy1. tar-xzvfhadoop2lib.tar.gz4.将linux本地/data/mapreduce1/buyer_favorite1,上传到HDFS上的/mymapredu

8、ce1/in目录下。若HDFS目录不存在,需提前创建。view plaincopy1. hadoopfs-mkdir-p/mymapreduce1/in2. hadoopfs-put/data/mapreduce1/buyer_favorite1/mymapreduce1/in5.打开Eclipse,新建Java Project项目。并将项目名设置为mapreduce1。6.在项目名mapreduce1下,新建package包。并将包命名为mapreduce 。7.在创建的包mapreduce下,新建类。并将类命名为WordCount。8.添加项目所需依赖的jar包,右键单击项目名,新建一个目

9、录hadoop2lib,用于存放项目所需的jar包。将linux上/data/mapreduce1目录下,hadoop2lib目录中的jar包,全部拷贝到eclipse中,mapreduce1项目的hadoop2lib目录下。选中hadoop2lib目录下所有的jar包,单击右键,选择Build Path=Add to Build Path9.编写Java代码,并描述其设计思路。下图描述了该mapreduce的执行过程大致思路是将hdfs上的文本作为输入,MapReduce通过InputFormat会将文本进行切片处理,并将每行的首字母相对于文本文件的首地址的偏移量作为输入键值对的key,文本

10、内容作为输入键值对的value,经过在map函数处理,输出中间结果的形式,并在reduce函数中完成对每个单词的词频统计。整个程序代码主要包括两部分:Mapper部分和Reducer部分。Mapper代码view plaincopy1. publicstaticclassdoMapperextendsMapper2. /第一个Object表示输入key的类型;第二个Text表示输入value的类型;第三个Text表示表示输出键的类型;第四个IntWritable表示输出值的类型3. publicstaticfinalIntWritableone=newIntWritable(1);4. pub

11、licstaticTextword=newText();5. Override6. protectedvoidmap(Objectkey,Textvalue,Contextcontext)7. throwsIOException,InterruptedException8. /抛出异常9. 10. StringTokenizertokenizer=newStringTokenizer(value.toString(),t);11. /StringTokenizer是Java工具包中的一个类,用于将字符串进行拆分12. 13. word.set(tokenizer.nextToken();14.

12、 /返回当前位置到下一个分隔符之间的字符串15. context.write(word,one);16. /将word存到容器中,记一个数17. 在map函数里有三个参数,前面两个Object key,Text value就是输入的key和value,第三个参数Context context是可以记录输入的key和value。例如context.write(word,one);此外context还会记录map运算的状态。map阶段采用Hadoop的默认的作业输入方式,把输入的value用StringTokenizer()方法截取出的买家id字段设置为key,设置value为1,然后直接输出。R

13、educer代码view plaincopy1. publicstaticclassdoReducerextendsReducer2. /参数同Map一样,依次表示是输入键类型,输入值类型,输出键类型,输出值类型3. privateIntWritableresult=newIntWritable();4. Override5. protectedvoidreduce(Textkey,Iterablevalues,Contextcontext)6. throwsIOException,InterruptedException7. intsum=0;8. for(IntWritablevalue:

14、values)9. sum+=value.get();10. 11. /for循环遍历,将得到的values值累加12. result.set(sum);13. context.write(key,result);14. 15. map输出的先要经过shuffle过程把相同key值的所有value聚集起来形成后交给reduce端。reduce端接收到之后,将输入的key直接复制给输出的key,用for循环遍历values并求和,求和结果就是key值代表的单词出现的总次,将其设置为value,直接输出。完整代码view plaincopy1. packagemapreduce;2. import

15、java.io.IOException;3. importjava.util.StringTokenizer;4. importorg.apache.hadoop.fs.Path;5. importorg.apache.hadoop.io.IntWritable;6. importorg.apache.hadoop.io.Text;7. importorg.apache.hadoop.mapreduce.Job;8. importorg.apache.hadoop.mapreduce.Mapper;9. importorg.apache.hadoop.mapreduce.Reducer;10.

16、 importorg.apache.hadoop.mapreduce.lib.input.FileInputFormat;11. importorg.apache.hadoop.mapreduce.lib.output.FileOutputFormat;12. publicclassWordCount13. publicstaticvoidmain(Stringargs)throwsIOException,ClassNotFoundException,InterruptedException14. Jobjob=Job.getInstance();15. job.setJobName(Word

17、Count);16. job.setJarByClass(WordCount.class);17. job.setMapperClass(doMapper.class);18. job.setReducerClass(doReducer.class);19. job.setOutputKeyClass(Text.class);20. job.setOutputValueClass(IntWritable.class);21. Pathin=newPath(hdfs:/localhost:9000/mymapreduce1/in/buyer_favorite1);22. Pathout=newP

18、ath(hdfs:/localhost:9000/mymapreduce1/out);23. FileInputFormat.addInputPath(job,in);24. FileOutputFormat.setOutputPath(job,out);25. System.exit(job.waitForCompletion(true)?0:1);26. 27. publicstaticclassdoMapperextendsMapper28. publicstaticfinalIntWritableone=newIntWritable(1);29. publicstaticTextwor

19、d=newText();30. Override31. protectedvoidmap(Objectkey,Textvalue,Contextcontext)32. throwsIOException,InterruptedException33. StringTokenizertokenizer=newStringTokenizer(value.toString(),t);34. word.set(tokenizer.nextToken();35. context.write(word,one);36. 37. 38. publicstaticclassdoReducerextendsRe

20、ducer39. privateIntWritableresult=newIntWritable();40. Override41. protectedvoidreduce(Textkey,Iterablevalues,Contextcontext)42. throwsIOException,InterruptedException43. intsum=0;44. for(IntWritablevalue:values)45. sum+=value.get();46. 47. result.set(sum);48. context.write(key,result);49. 50. 51. 1

21、0.在WordCount类文件中,单击右键=Run As=Run on Hadoop选项,将MapReduce任务提交到Hadoop中。11.待执行完毕后,打开终端或使用hadoop eclipse插件,查看hdfs上,程序输出的实验结果。view plaincopy1. hadoopfs-ls/mymapreduce1/out2. hadoopfs-cat/mymapreduce1/out/part-r-000004. Hive安装部署实验步骤:1.首先在Linux本地,新建/data/hive1目录,用于存放所需文件。view plaincopy1. mkdir-p/data/hive1切

22、换目录到/data/hive1下,使用wget命令,下载hive所需安装包hive-1.1.0-cdh5.4.5.tar.gz以及mysql-connector-java-5.1.26-bin.jar。view plaincopy1. cd/data/hive12. wget1:60000/allfiles/hive1/hive-1.1.0-cdh5.4.5.tar.gz3. wget1:60000/allfiles/hive1/mysql-connector-java-5.1.26-bin.jar2.将/data/hive1目录

23、下的hive-1.1.0-cdh5.4.5.tar.gz,解压缩到/apps目录下。view plaincopy1. tar-xzvfhive-1.1.0-cdh5.4.5.tar.gz-C/apps/再切换到/apps目录下,将/apps/hive-1.1.0-cdh5.4.5,重命名为hive。view plaincopy1. cd/apps2. mv/apps/hive-1.1.0-cdh5.4.5/apps/hive3.使用vim打开用户环境变量。view plaincopy1. sudovim/.bashrc将Hive的bin目录,添加到用户环境变量PATH中,然后保存退出。view

24、 plaincopy1. #hiveconfig2. exportHIVE_HOME=/apps/hive3. exportPATH=$HIVE_HOME/bin:$PATH执行source命令,使Hive环境变量生效。view plaincopy1. source/.bashrc4.由于Hive需要将元数据,存储到Mysql中。所以需要拷贝/data/hive1目录下的mysql-connector-java-5.1.26-bin.jar到hive的lib目录下。view plaincopy1. cp/data/hive1/mysql-connector-java-5.1.26-bin.ja

25、r/apps/hive/lib/5.下面配置Hive,切换到/apps/hive/conf目录下,并创建Hive的配置文件hive-site.xml。view plaincopy1. cd/apps/hive/conf2. touchhive-site.xml使用vim打开hive-site.xml文件。view plaincopy1. vimhive-site.xml并将下列配置项,添加到hive-site.xml文件中。view plaincopy1. 2. 3. javax.jdo.option.ConnectionURL4. jdbc:mysql:/localhost:3306/hiv

26、e?createDatabaseIfNotExsit=true;characterEncoding=latin15. 6. 7. javax.jdo.option.ConnectionDriverName8. com.mysql.jdbc.Driver9. 10. 11. javax.jdo.option.ConnectionUserName12. root13. 14. 15. javax.jdo.option.ConnectionPassword16. strongs17. 18. 由于Hive的元数据会存储在Mysql数据库中,所以需要在Hive的配置文件中,指定mysql的相关信息。j

27、avax.jdo.option.ConnectionURL:数据库链接字符串。javax.jdo.option.ConnectionDriverName:连接数据库的驱动包。javax.jdo.option.ConnectionUserName:数据库用户名。javax.jdo.option.ConnectionPassword:连接数据库的密码。此处的数据库的用户名及密码,需要设置为自身系统的数据库用户名及密码。6.另外,还需要告诉Hive,Hadoop的环境配置。所以我们需要修改hive-env.sh文件。首先我们将hive-env.sh.template重命名为hive-env.sh。v

28、iew plaincopy1. mv/apps/hive/conf/hive-env.sh.template/apps/hive/conf/hive-env.sh使用vim打开hive-env.sh文件。view plaincopy1. vimhive-env.sh追加Hadoop的路径,以及Hive配置文件的路径到文件中。view plaincopy1. #SetHADOOP_HOMEtopointtoaspecifichadoopinstalldirectory2. #HADOOP_HOME=$bin/././hadoop3. HADOOP_HOME=/apps/hadoop4. #Hiv

29、eConfigurationDirectorycanbecontrolledby:5. #exportHIVE_CONF_DIR=6. exportHIVE_CONF_DIR=/apps/hive/conf7.下一步是配置Mysql,用于存储Hive的元数据。首先,需要保证Mysql已经启动。执行以下命令,查看Mysql的运行状态。view plaincopy1. sudoservicemysqlstatus通过输出,可以看出Mysql未启动。所以需要执行启动命令。view plaincopy1. sudoservicemysqlstart如果未安装Mysql则需要执行安装命令。若我们的环境已

30、安装Mysql,则无需执行此步。view plaincopy1. sudoapt-getinstallmysql-server8.开启Mysql数据库。view plaincopy1. mysql-uroot-p此时会提示输入密码,此处密码为strongs创建名为hive的数据库,编码格式为latin1,用于存储元数据。view plaincopy1. createdatabasehiveCHARACTERSETlatin1;查看数据库是否创建成功。view plaincopy1. showdatabases;下面,输入exit退出Mysql。view plaincopy1. exit9.执行

31、测试。由于Hive对数据的处理,依赖MapReduce计算模型,所以需要保证Hadoop相关进程已经启动。输入jps,查看进程状态。若Hadoop相关进程未启动,则需启动Hadoop。view plaincopy1. /apps/hadoop/sbin/start-all.sh启动Hadoop后,在终端命令行界面,直接输入hive便可启动Hive命令行模式。view plaincopy1. hive输入HQL语句查询数据库,测试Hive是否可以正常使用。view plaincopy1. showdatabases;至此Hive安装完毕。5. Hive基本操作实验步骤:一、实验环境准备1.首先在

32、Linux本地新建/data/hive2目录。view plaincopy1. mkdir-p/data/hive22.切换到/data/hive2目录下,使用wget命令,下载1:60000/allfiles/hive2中cat_group和goods文件。view plaincopy1. cd/data/hive22. wget1:60000/allfiles/hive2/cat_group3. wget1:60000/allfiles/hive2/goods3.输入jps检查Hadoop相关进

33、程,是否已经启动。若未启动,切换到/apps/hadoop/sbin目录下,启动Hadoop。view plaincopy1. jps2. cd/apps/hadoop/sbin3. ./start-all.sh4.开启Hive,首先,需要保证Mysql启动。执行以下命令,查看Mysql的运行状态。view plaincopy1. sudoservicemysqlstatus输出显示Mysql未启动。执行以下启动命令。view plaincopy1. sudoservicemysqlstart然后切换到/apps/hive/bin目录下,开启Hive。view plaincopy1. cd/a

34、pps/hive/bin2. ./hive二、Hive数据仓库的操作1.在Hive中创建一个数据仓库,名为DB。view plaincopy1. createdatabaseDB;2.以上简单创建了一个DB库,但是这条sql可以更进一步的优化,我们可以加上if not exists。view plaincopy1. createdatabaseifnotexistsDB;解析:在创建库时,应避免新建的库名与已有库名重复,如果库名重复将会报出以下错误(我在已有DB库的前提下,再次创建了DB库)。错误提示数据仓库DB已经存在, 那么加入的if not exists就起了作用,如下(在已有DB库的前

35、提下,再次创建DB库,提示成功不会报错)加入if not exists的意思是如果没有DB库就创建,如果已有就不再创建。3.查看数据仓库DB的信息及路径。view plaincopy1. describedatabaseDB;4.删除名为DB的数据仓库。view plaincopy1. dropdatabaseifexistsDB;三、Hive数据表的操作Hive的数据表分为两种:内部表和外部表。Hive创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径, 不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除, 而外部表只删除元数据,不删除

36、数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据,生产中常使用外部表。下面详细介绍对表操作的命令及使用方法:即将创建的表,表名不能和已有表名重复,否则会报错,现在我们show tables一下,查看已存在的表。view plaincopy1. showtables;现在库中没有表。1.创建一个名为cat的内部表,有两个字段为cat_id和cat_name,字符类型为string。view plaincopy1. createtablecat(cat_idstring,cat_namestring);查看是否创建成功。view plaincopy1. showtables;

37、下面我们再次创建一个与刚才表名相同的表,看一下报错。view plaincopy1. createtablecat(cat_idstring,cat_namestring);提示错误,该表已经存在!说明表与库一样,名称不能重复,解决方法是加入if not exists。2.创建一个外部表,表名为cat2,有两个字段为cat_id和cat_name,字符类型为string。view plaincopy1. createexternaltableifnotexistscat2(cat_idstring,cat_namestring);查看是否创建成功。view plaincopy1. showta

38、bles;外部表较内部表而言,只是在create后加了一个external。3.修改cat表的表结构。对cat表添加两个字段group_id和cat_code。view plaincopy1. altertablecataddcolumns(group_idstring,cat_codestring);使用desc命令查看一下加完字段后的cat表结构 。view plaincopy1. desccat;4.修改cat2表的表名。把cat2表重命名为cat3 。view plaincopy1. altertablecat2renametocat3;这个命令可以让用户为表更名,数据所在的位置和分区

39、名并不改变。5.删除名为cat3的表并查看。view plaincopy1. droptablecat3;2. showtables;6.创建与已知表相同结构的表,创建一个与cat表结构相同的表,名为cat4,这里要用到like关键字。view plaincopy1. createtablecat4likecat;创建完成并查看结果。view plaincopy1. showtables;四、Hive中数据的导入导出以下介绍四种常见的数据导入方式:1.从本地文件系统中导入数据到Hive表。首先,在Hive中创建一个cat_group表,包含group_id和group_name两个字段,字符类

40、型为string,以“t”为分隔符,并查看结果。view plaincopy1. createtablecat_group(group_idstring,group_namestring)rowformatdelimitedfieldsterminatedbytstoredastextfile;2. showtables;row format delimited关键字,是用来设置创建的表在加载数据的时候,支持的列分隔符。stored as textfile关键字,是用来设置加载数据的数据类型,默认是TEXTFILE,如果文件数据是纯文本,就是使用 stored as textfile,然后从本

41、地直接拷贝到HDFS上,Hive直接可以识别数据。然后,将Linux本地/data/hive2目录下的cat_group文件导入到Hive中的cat_group表中。view plaincopy1. loaddatalocalinpath/data/hive2/cat_groupintotablecat_group;通过select语句查看cat_group表中是否成功导入数据,由于数据量大,使用limit关键字限制输出10条记录。view plaincopy1. select*fromcat_grouplimit10;导入成功。2.将HDFS上的数据导入到Hive中。首先,另外开启一个操作窗

42、口,在HDFS上创建/myhive2目录。view plaincopy1. hadoopfs-mkdir/myhive2然后,将本地/data/hive2/下的cat_group表上传到HDFS的/myhive2上,并查看是否创建成功。view plaincopy1. hadoopfs-put/data/hive2/cat_group/myhive22. hadoopfs-ls/myhive2接着,在Hive中创建名为cat_group1的表,创表语句如下。view plaincopy1. createtablecat_group1(group_idstring,group_namestrin

43、g)2. rowformatdelimitedfieldsterminatedbytstoredastextfile;最后,将HDFS下/myhive2中的表cat_group导入到Hive中的cat_group1表中 ,并查看结果。view plaincopy1. loaddatainpath/myhive2/cat_groupintotablecat_group1;2. select*fromcat_group1limit10;导入成功。提示:HDFS中数据导入到Hive中与本地数据导入到hive中的区别是load data后少了local。3.从别的表中查询出相应的数据并导入到Hive中

44、。首先在Hive中创建一个名为cat_group2的表。view plaincopy1. createtablecat_group2(group_idstring,group_namestring)2. rowformatdelimitedfieldsterminatedbytstoredastextfile;用下面两种方式将cat_group1表中的数据导入到cat_group2表中。view plaincopy1. insertintotablecat_group2select*fromcat_group1;或view plaincopy1. insertoverwritetablecat

45、_group2select*fromcat_group1;(insert overwrite 会覆盖数据)。导入完成后,用select语句查询cat_group2表。view plaincopy1. select*fromcat_group2limit10;4.在创建表的时候从别的表中查询出相应数据并插入到所创建的表中。Hive中创建表cat_group3并直接从cat_group2中获得数据。view plaincopy1. createtablecat_group3asselect*fromcat_group2;创建并导入完成,用select语句查询实验结果。view plaincopy1

46、. select*fromcat_group3limit10;五、三种常见的数据导出方式1.导出到本地文件系统。首先,在Linux本地新建/data/hive2/out目录。view plaincopy1. mkdir-p/data/hive2/out并将Hive中的cat_group表导出到本地文件系统/data/hive2/out中。注意:方法和导入数据到Hive不一样,不能用insert into来将数据导出。view plaincopy1. insertoverwritelocaldirectory/data/hive2/outselect*fromcat_group;导出完成后,在L

47、inux本地切换到/data/hive2/out目录,通过cat命令查询导出文件的内容。view plaincopy1. cd/data/hive2/out2. ls3. cat_0通过上图可以看到导出的数据,字段之间没有分割开,所以我们使用下面的方式,将输出字段以“t”键分割。view plaincopy1. insertoverwritelocaldirectory/data/hive2/outselectgroup_id,concat(t,group_name)fromcat_group;通过cat命令查询/data/hive2/out目录下的导出文件。view plaincopy1.

48、cd/data/hive2/out/2. cat_02.Hive中数据导出到HDFS中在HDFS上创建/myhive2/out目录。view plaincopy1. hadoopfs-mkdir-p/myhive2/out并将Hive中的表cat_group中的数据导入到HDFS的/myhive2/out目录里。view plaincopy1. insertoverwritedirectory/myhive2/outselectgroup_id,concat(t,group_name)fromcat_group;导入完成后,在HDFS上的/myhive2/out目录下查看结果。view plaincopy1. hadoopfs-ls/myhive2/out3.导出到Hive的另一个表中。将Hive中表cat_group中的数据导入到cat_group4中(两表字段及字符类型相同)。首先在Hive中创建一个表cat_group4,有group_id和group_name两个字段,字符类型为string,以t为分隔符。view plaincopy1. createtablecat_group4(group_idst

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论