【李老师云盘算】实验一:Hadoop伪分布式集群部署与Eclipse访问Hadoop进行 ...

打印 上一主题 下一主题

主题 723|帖子 723|积分 2169

网上学习资料一大堆,但假如学到的知识不成体系,遇到题目时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提拔。
需要这份系统化的资料的朋友,可以点击这里获取!
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感爱好的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、口试辅导),让我们一起学习成长!

从机也需要验证,假如哪台机器ping不通请检察3.3以及5.3的解决方法或自行百度。
6.2 方法二:通过FireFox访问百度

这种方法需要再安装CentOS的时候选择了GUI界面(参考2.3)

然后输入www.baidu.com,看是否能乐成访问,以下是乐成界面:

7. 免密安全登录

7.1 生成秘钥及分享秘钥

该操作需要重复三次(实验需要一个Master两个Slave……)
以主机为例,在终端依次使用以下指令生成秘钥然后分享给除了自己以外的别的两台机器:

  • ssh-keygen -t rsa(然后不绝回车)
  • ssh-copy-id Slave1-60(Slave1-60修改为你的从机1的主机名或IP)
  • ssh-copy-id Slave2-60(Slave1-60修改为你的从机2的主机名或IP)
    步调2、3需要输入yes,然后再输入暗码(123456),暗码不会表现(Linux特性)。

两个从机重复以上操作。
之后在**主机(Master)**进行如下操作(这一步从机不需要):

  • cd .ssh(现在地点路径是~)
  • touch authorized_keys
  • chmod 600 authorized_keys
  • cat id_rsa.pub >> authorized_keys
这一步是为了之后做准备的……
7.2 测试是否乐成

以从机1为例,在终端使用指令ssh Master60(改为自己主机的主机名)大概`ssh 192.168.64.610(改为自己主机的IP)。

可以发现此时不需要键入暗码就可以登录。
8. Hadoop集群计划与部署

OK,这一步的难度大于前面七步的和,尽量说的详细一点。
该操作需要重复三次(实验需要一个Master两个Slave……)
8.1 下载Hadoop-3.3.1

我用的是Hadoop-3.3.1,下面的操作只要是Hadoop-3.x应该都是实用的,但是Hadoop-2.x可能有细枝末节的地方不太相同,建议看一下PushyTao学长的博客。
建议是在自己的电脑上而不是捏造机上下载,因为每台捏造机都需要一份,所以直接下在自己电脑桌面上然后拖到捏造机里就可以了。
下面给出两个镜像站地址,哪个快下哪个吧(3.3.1可能已经不能用了大概3.x就可以):

  • 清华镜像站
  • 阿里云镜像站
以阿里云镜像站为例,要下载的是hadoop-3.3.1.tar.gz。

8.2 创建目次解压Hadoop

起首mkdir /user(现在的路径是~)
然后直接复制以下指令到终端(鼠标中键粘贴)
  1. mkdir  /user/hadoop
  2. mkdir  /user/hadoop/tmp
  3. mkdir  /user/hadoop/var
  4. mkdir  /user/hadoop/dfs
  5. mkdir  /user/hadoop/dfs/name
  6. mkdir  /user/hadoop/dfs/data
复制代码
方便起见,后面的操作用GUI进行,点击应用程序,选择文件。

点击其他位置,然后选择盘算机。

找到user文件夹点击进入,注意是user不是usr。

进入内里的hadoop目次,然后把电脑上的压缩包拖进来(下面的图是解压完成的)

然后在这个界面右键选择在终端打开。

这时候我终端的位置是这个目次:

然后输入指令tar -zxvf hadoop-3.3.1.tar.gz进行解压。
8.3 设置环境变量

在终端使用指令vi ~/.bashrc。
在最后键入i进行插入,需要修改的只有第一行HADOOP_INSTALL,把它改成自己Hadoop的位置就好了(含有bin、etc、……的目次)。
  1. export HADOOP_INSTALL=/user/hadoop/hadoop-3.3.1
  2. export PATH=$PATH:$HADOOP_INSTALL/bin
  3. export PATH=$PATH:$HADOOP_INSTALL/sbin
  4. export HADOOP_MAPRED_HOME=$HADOOP_INSTALL
  5. export HADOOP_COMMON_HOME=$HADOOP_INSTALL
  6. export HADOOP_HDFS_HOME=$HADOOP_INSTALL
  7. export YARN_HOME=$HADOOP_INSTALL
  8. export HADOOP_HOME=$HADOOP_INSTALL
复制代码

:wq生存退出。
然后在终端输入指令source ~/.bashrc
8.4 找到JDK位置

其实这个地方是搞错了的这里用的是JRE(运行包),而不是JDK(开辟包),其中开辟包是包含了运行包。但是后面的操作只需要运行即可,就是说不会影响到后续操作。我会在下一个实验的时候进行修正,大概到这一步时同砚们可以自行下载JDK
这个CentOS是自带了一个JDK确实是能用的,所以我也不别的下载了,找到这个JDK就可以了。
依次使用指令:

  • which java获得一个地址/usr/bin/java
  • ls -lrt /usr/bin/java,根据前面得到的地址修改,会获得另一个地址/etc/alternatives/java
  • ls -lrt /etc/alternatives/java,根据前面得到的地址修改,最终得到的就是jdk的位置。

比如我找到的是java-1.8.0-openjdk-1.8.0.242.b08-1.el7.x86_64,但实际上每个人可能有所差别,以自己的为准!
上面表现0.362是因为后面的操作应该是有了一个新的版本但是为了还原,我照旧说我的过程吧。
点进去这个这个目次,把内里jre的bin和lib给复制出来。

不搞出来之后会报错,JAVA_HOME需要这俩东西应该是,假如重新下jdk也差不多这么个意思。
8.5 修改主机设置文件

在做这一步之前先确保主机和两台从机都完成了以上操作,然后在主机上完成以下操作。
用GUI来完成吧,起首进入 /user/hadoop/hadoop-3.3.1/etc/hadoop/目次

如许的文件修改差别于VI而类似于windows系统的记事本。
复制粘贴都用鼠标就可以了。生存是ctrl+s。
8.5.1 hadoop-env.sh修改

打开hadoop-env.sh
在文件最后添加:
  1. export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-1.el7.x86_64
  2. export HADOOP_HOME=/user/hadoop/hadoop-3.3.1
  3. export HDFS_NAMENODE_USER="root"
  4. export HDFS_DATANODE_USER="root"
  5. export HDFS_SECONDARYNAMENODE_USER="root"
  6. export YARN_RESOURCEMANAGER_USER="root"
  7. export YARN_NODEMANAGER_USER="root"
复制代码
其中JAVA_HOME和HADOOP_HOME请根据自己情况来写。
8.5.2 core-site.xml修改


打开core-site.xml
在<configuration></configuration>之间输入下面的内容:
  1.     <property>
  2.         <name>hadoop.tmp.dir</name>
  3.         <value>/user/hadoop/tmp</value>
  4.         <description>Abase for other temporary directories.</description>
  5.     </property>
  6.     <property>
  7.         <name>fs.defaultFS</name>
  8.         <value>hdfs://192.168.64.60:9000/</value>
  9.     </property>
复制代码

根据自己情况修改value标签内的内容。
8.5.3 hdfs-site.xml修改

打开hdfs-site.xml
在最后加入以下内容:
  1. <configuration>
  2. <property>
  3.       <name>yarn.resourcemanager.admin.address</name>
  4.       <value>192.168.64.60:9001</value>
  5.   </property>
  6.   <property>
  7.    <name>dfs.name.dir</name>
  8.      <value>/user/hadoop/dfs/name</value>
  9.      <description>Path on the local filesystem where theNameNode stores the namespace and transactions logs persistently.</description>
  10.   </property>
  11.   <property>
  12.      <name>dfs.data.dir</name>
  13.      <value>/user/hadoop/dfs/data</value>
  14.    <description>Comma separated list of paths on the localfilesystem of a DataNode where it should store its blocks.</description>
  15.   </property>
  16.   <property>
  17.     <name>dfs.replication</name>
  18.     <value>1</value>
  19.   </property>
  20.   <property>
  21.       <name>dfs.permissions</name>
  22.       <value>false</value>
  23.       <description>need not permissions</description>
  24.   </property>
  25. </configuration>
复制代码
上面内容提供了<configuration></configuration>,把之前的删了就好了。
照旧把value标签自己改了。
8.5.4 yarn-site.xml修改

打开yarn-site.xml
  1. <configuration>
  2. <!-- Site specific YARN configuration properties -->
  3. <property>
  4.         <description>The address of the applications manager interface in the RM.</description>
  5.         <name>yarn.resourcemanager.address</name>
  6.         <value>192.168.64.60:8032</value>
  7.    </property>
  8.    <property>
  9.         <description>The address of the scheduler interface.</description>
  10.         <name>yarn.resourcemanager.scheduler.address</name>
  11.         <value>192.168.64.60:8030</value>
  12.    </property>
  13.    <property>
  14.         <description>The http address of the RM web application.</description>
  15.         <name>yarn.resourcemanager.webapp.address</name>
  16.         <value>192.168.64.60:8088</value>
  17.    </property>
  18.    <property>
  19.         <name>yarn.resourcemanager.resource-tracker.address</name>
  20.         <value>192.168.64.60:8031</value>
  21.    </property>
  22.    <property>
  23.         <description>The address of the RM admin interface.</description>
  24.         <name>yarn.resourcemanager.admin.address</name>
  25.         <value>192.168.64.60:8033</value>
  26.    </property>
  27.    <property>
  28.         <name>yarn.nodemanager.aux-services</name>
  29.         <value>mapreduce_shuffle</value>
  30.    </property>
  31.    <property>
  32.         <name>yarn.nodemanager.auxservices.mapreduce.shuffle.class</name>
  33.         <value>org.apache.hadoop.mapred.ShuffleHandler</value>
  34.    </property>
  35.    <property>
  36.         <name>yarn.scheduler.maximum-allocation-mb</name>
  37.         <value>2048</value>
  38.         <discription>every node memery size(MB) default is 8182MB</discription>
  39.    </property>
  40.    <property>
  41.         <name>yarn.nodemanager.resource.memory-mb</name>
  42.         <value>2048</value>
  43.    </property>
  44.    <property>
  45.         <name>yarn.nodemanager.vmem-check-enabled</name>
  46.         <value>false</value>
  47.    </property>
  48. </configuration>
复制代码
修改value的IP地址。
8.5.5 mapred-site.xml修改

打开mapred-site.xml
  1. <configuration>
  2.    <property>
  3.      <name>mapred.job.tracker</name>
  4.      <value>192.168.64.60:49001</value>
  5.   </property>
  6.   <property>
  7.      <name>mapred.local.dir</name>
  8.      <value>/user/hadoop/var</value>
  9.   </property>
  10.   <property>
  11.      <name>mapreduce.framework.name</name>
  12.      <value>yarn</value>
  13.   </property>
  14. </configuration>
复制代码
修改value中的ip及位置。
8.5.6 workers修改

打开workers
  1. Slave1-60
  2. Slave2-60
复制代码
把两个从节点的主机名大概IP存进去。
最后输入hdfs假如没有ERROR就是乐成;假如失败根据提示来看什么变量设置错误了,再改包括.bashrc在内的设置文件。注意hdfs指令可以使用只能代表你的Hadoop路径和JAVA_HOME设置乐成,不代表一定能运行Hadoop,还得看设置文件是否正确。
8.6 分享主机设置文件

在/user/hadoop/hadoop-3.3.1/etc/hadoop/目次下打开终端。
之前已经设置了SSH免密登录,现在就派到用场了(固然这不是主要的),我可以直接把主机的文件分享到从机上。
直接复制以下指令到终端(鼠标中键),其中需要修改的是Slave1-60(改为自己的从机主机名或ip),后面的是存放在从机的地址(必须先在从机上完成8.1-8.4保证从机有这个目次)。
  1. scp hadoop-env.sh root@Slave1-60:/user/hadoop/hadoop-3.3.1/etc/hadoop/
  2. scp core-site.xml root@Slave1-60:/user/hadoop/hadoop-3.3.1/etc/hadoop/
  3. scp hdfs-site.xml root@Slave1-60:/user/hadoop/hadoop-3.3.1/etc/hadoop/
  4. scp mapred-site.xml root@Slave1-60:/user/hadoop/hadoop-3.3.1/etc/hadoop/
  5. scp yarn-site.xml root@Slave1-60:/user/hadoop/hadoop-3.3.1/etc/hadoop/
  6. scp workers root@Slave1-60:/user/hadoop/hadoop-3.3.1/etc/hadoop/
复制代码
假如设置错误了需要修改,直接重新键入指令就可以了,会自动覆盖。
然后再通报给从机2一份:
  1. scp hadoop-env.sh root@Slave2-60:/user/hadoop/hadoop-3.3.1/etc/hadoop/
  2. scp core-site.xml root@Slave2-60:/user/hadoop/hadoop-3.3.1/etc/hadoop/
  3. scp hdfs-site.xml root@Slave2-60:/user/hadoop/hadoop-3.3.1/etc/hadoop/
  4. scp mapred-site.xml root@Slave2-60:/user/hadoop/hadoop-3.3.1/etc/hadoop/
  5. scp yarn-site.xml root@Slave2-60:/user/hadoop/hadoop-3.3.1/etc/hadoop/
  6. scp workers root@Slave2-60:/user/hadoop/hadoop-3.3.1/etc/hadoop/
复制代码
8.7 格式化Hadoop

该操作需要重复三次(实验需要一个Master两个Slave……)
在每台捏造机上都使用终端输入指令hdfs namenode -format。
假如失败请检察自己的设置文件是否全部修改正确!Hadoop地址、JAVA_HOME之类的请仔细对照自己的实际情况!
假如乐成,会出现以下界面:

所有的机器都完成了初始化之后进行下一步。
8.8 启动Hadoop

进入/user/hadoop/hadoop-3.3.1/sbin目次(假如自己能搞明白自己在什么目次完全可以自己掌控,以下的操作完全可以 在~路径下./user/hadoop/hadoop-3.3.1/sbin/start-all.sh)
在sbin目次下右键进入终端,使用指令./start-all.sh启动Hadoop
8.9 验证是否完成

在终端使用输入jps,假如表现bash: jps: command not found...,就使用指令yum install -y java-1.8.0-openjdk-devel。假如仍旧不乐成,看一下设置文件的IP和路径是不是与自己的匹配。
假如在主机使用jps可以看到如下进程:

而且在两个从机使用jps可以看到如下进程:

就说明完成了任务。
8.10 欣赏器检察集群

操作在主机上
此时通过欣赏器访问192.168.64.60:9870来检察(主机的主机名或IP:9870)。

8.11 ★解决欣赏器无法检察集群

可以实验使用192.168.64.60:50070,Hadoop2.x使用的是50070端口。
假如还不可,看看防火墙是否关闭。一定是jps都表现上述的进程该网页才会生效。
8.12 ★捏造机拖拽文件

需要安装VMware Tools,详细怎么做不多做说明,安装完成就能直接传输文件了。

往捏造机中拖文件可能会报错,点一下重试就好了。
8.13 ★解决Hadoop集群部署不乐成

一般来说就是没有datanode大概namenode之类的题目,常见于是复制别人的文件、重新装了一遍Hadoop。
有两种情况:
一种是你的设置文件有题目,IP大概自己的Hadoop路径没有写对(认真核查!一个字母错误都可能导致无法乐成!),找到错误然后重新分享(参照8.6)
别的一种情况是有旧的信息还在捏造机上,这种情况按照以下方法来解决:
之前我们创建了下面的几个目次
  1. mkdir  /user/hadoop
  2. mkdir  /user/hadoop/tmp
  3. mkdir  /user/hadoop/var
  4. mkdir  /user/hadoop/dfs
  5. mkdir  /user/hadoop/dfs/name
  6. mkdir  /user/hadoop/dfs/data
复制代码
把三台捏造机上/user/hadoop目次中的 tmp、var、dfs(不包括name和data)、dfs/name、dfs/data内里的内容全部扫除,也就是说保持最初的状态,这一步是为了清空之前初始化产生的一些信息数据。
再重新在三台捏造机上格式化Hadoop(参照8.7)。
9. Eclipse访问Hadoop

9.1 下载Eclipse

在官网下载:Eclipse IDE for Java Developers,选择Linux x86_64。

这个只需要拖到主机Master上就可以了。
有了上面的经验,把这个压缩包拖到/opt目次下应该不成题目。
之后在/opt目次下打开终端,使用解压指令tar zxvf eclipse-java-2023-03-R-linux-gtk-x86_64.tar.gz,这时候会有一个eclipse文件被解压到/opt。
点击(大概指令)进入/opt/eclipse,然后在该文件下打开终端,使用指令ln -s /opt/eclipse/eclipse /usr/bin/eclipse,此时再去/usr/bin目次下将eclipse拖到桌面即可。

现在直接点击eclipse就可以使用了,打开使用的时候什么都不要改!默认的工作空间也没有必要改,直接进入。
9.2 设置eclipse

下载hadoop-eclipse-plugin-3.3.1,不需要解压放在/opt/eclipse路径下的dropins和plugins中。
打开eclipse,在菜单栏选择Window->references。

然后在左侧选择Hadoop Map/Reduce,选择Hadoop的安装路径(按照自己的来)

最后Apply and Close。
之后在菜单栏选择Window->Show View->Other。

选择MapReduce Tools->Map/Reduce Locations,点击Open

9.3 eclipse连接Hadoop

此时,会发现右上角出现大象(假如没有点击左侧第一个摁扭,内里可以打开),点击一下,下面会出现大象和+。

点击下面的大象和+

按照上图设置一下,点击Finish,下面会出现一条信息。这个大象双击以后会报错,不影响后面的操作,不需要理会设置好自己的ip即可。

以及左侧项目栏会出一个DFS Locations

假如这里的Hadoop(刚才起的名字),点击可以表现文件夹,就说明连接乐成反之会有一段错误代码。
9.4 ★解决eclipse连接Hadoop失败

确认每一台捏造机都能上网,而且主机启动了start-all.sh。
不能上网请参考之前的内容。
9.5 ★解决没有Hadoop Map/Reduce选项

在9.2出现找不到这个选项的情况下,假如确定自己把hadoop-eclipse-plugin放进了文件中,而且没有解压这个文件,可以用低版本的hadoop-eclipse-plugin试一下,如hadoop-eclipse-plugin-2.xx,之类的。一般题目可以解决。
10. MapReduce模型

10.1 在Hadoop集群创建文件

直接在主机终端使用指令
  1. hadoop fs -mkdir /tmp
  2. hadoop fs -chmod -R 777 /tmp
复制代码
可以在eclipse中看到多出来的tmp目次。

假如找不到项目栏可以参考10.8解决。
10.2 创建Map/Reduce项目

新建一个项目

然后选择Map/Reduce Project,点击Next。

随便起名比如WORDCOUNT。
在src目次下直接创建一个Class类,类名是WordCount,弄个包也行无所谓。

然后把代码复制进去:
  1. package wordcount;
  2. import java.io.IOException;
  3. import java.util.StringTokenizer;
  4. import org.apache.hadoop.conf.Configuration;
  5. import org.apache.hadoop.fs.Path;
  6. import org.apache.hadoop.io.IntWritable;
  7. import org.apache.hadoop.io.Text;
  8. import org.apache.hadoop.mapreduce.Job;
  9. import org.apache.hadoop.mapreduce.Mapper;
  10. import org.apache.hadoop.mapreduce.Reducer;
  11. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  12. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  13. public class WordCount {
  14.         public static class WordCountMapper extends Mapper<Object, Text, Text, IntWritable> {
  15.                 private final static IntWritable one = new IntWritable(1);
  16.                 private Text word = new Text();
  17.                 public void map(Object key, Text value, Context context)
  18.                 throws IOException, InterruptedException {
  19.                         StringTokenizer itr = new StringTokenizer(value.toString());
  20.                         while (itr.hasMoreTokens()) {//
  21.                                 word.set(itr.nextToken());
  22.                                 context.write(word, one);
  23.                         }
  24.                 }
  25.         }
  26.         public static class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
  27.                 private IntWritable result = new IntWritable();
  28.                 public void reduce(Text key, Iterable<IntWritable> values, Context context)
  29.                 throws IOException, InterruptedException {
  30.                         int sum = 0;
  31.                         for (IntWritable val : values) {
  32.                                 sum += val.get();
  33.                         }
  34.                         result.set(sum);
  35.                         context.write(key, result);
  36.                 }
  37.         }
  38.         public static void main(String[] args) throws Exception {
  39.                 Configuration conf = new Configuration();
  40.                 if (args.length != 2) {
  41.                         System.err.println("Usage: <in> <out>");
  42.                         System.exit(2);
  43.                 }
  44.                 Job job = Job.getInstance(conf, "word count");
  45.                 job.setJarByClass(WordCount.class);
  46.                 job.setMapperClass(WordCountMapper.class);
  47.                 job.setCombinerClass(WordCountReducer.class);
  48.                 job.setReducerClass(WordCountReducer.class);
  49.                 job.setOutputKeyClass(Text.class);
  50.                 job.setOutputValueClass(IntWritable.class);
  51.                 FileInputFormat.addInputPath(job, new Path(args[0]));
  52.                 FileOutputFormat.setOutputPath(job, new Path(args[1]));
  53.                 System.exit(job.waitForCompletion(true) ? 0 : 1);
  54.         }
  55. }
复制代码
假如连接乐成了,那么上面的代码不会有错误,假如有错误一定是没有乐成连接Hadoop。
下面是此时的状态

10.3 运行代码

这是一个命令行输入的代码,因此我们的先设置参数。
菜单上选择Run->Run Configurations...。

然后选择程序,在Arguments中输入参数:
第一个是input01,同时在项目下创建一个input01.txt来存输入,与src同级!注意是同级不是在src里。
第二个是hdfs://192.168.64.60:9000/tmp/output_01,这个要按照自己的Master的ip来设置,输出在/tmp/output_02文件里,这个文件会自动生成,而且假如已经存在了,就不能乐成运行。

10.4 ★解决不能运行(爆红的几种情况)

假如java代码爆红,先确定主机已经启动sbin目次下的start-all.sh了,而且可以在DFS Locations下找到tmp目次。此时假如org.apache.xxx一片赤色,删了这个项目重新创建一个试一下。(还不可就把所有捏造机重开,然后start-all然后再重新创建一个项目)

假如说output文件已经存在(already exists),在命令行中换一个名字,大概删掉之前的输出文件。假如在DFS Locations中的tmp下没有文件,就右键革新(Refresh)一下。

假如是不影响运行的告诫:

可以右键src,选择New->Other->General->File。

文件名是:log4j.properties
文件内容是:
  1. log4j.rootLogger=INFO, stdout
  2. log4j.appender.stdout=org.apache.log4j.ConsoleAppender
  3. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
  4. log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
  5. log4j.appender.logfile=org.apache.log4j.FileAppender
  6. log4j.appender.logfile.File=target/spring.log
  7. log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
  8. log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
复制代码
10.5 运行结果

我们的程序是盘算单词出现了几次。
在input01文件中写入输入的内容。

然后运行代码,右键革新一下tmp目次

然后就会神奇的发现结果已经在目次里了。没有题目!
网上学习资料一大堆,但假如学到的知识不成体系,遇到题目时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提拔。
需要这份系统化的资料的朋友,可以点击这里获取!
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感爱好的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、口试辅导),让我们一起学习成长!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

魏晓东

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表