Hadoop集群的配置(一)

摘要: hadoop集群配置系列文档,是笔者在实验室真机环境实验后整理而得。以便随后工作所需,做以知识整理,另则与博客园朋友分享实验成果,因为笔者在学习初期,也遇到不少问题。但是网上一些文档大多互相抄袭,里面错误百出。笔者结合自学书籍视频等资料,完成这一套配置资料。实验结果和过程经过反复测试无误后方整理出来的。配置过程中,初学者若有实验环境,可以在真机环境下完成,若无条件,可补习下虚拟机与Linux操作系统的基础知识,以及里面对linux常规命令使用,建议读者边配置学学习。(本文原创/整理,转载请标注原文出处: Hadoop集群的配置(一)

白宁超

2015年7月11日22:24:14

相关文章

  1. 【Oracle RAC集群搭建1】 集群概念介绍
  2. 【Oracle RAC集群搭建2】 ORACLE集群概念和原理
  3. 【Oracle RAC集群搭建3】 RAC 工作原理和相关组件
  4. 【Oracle RAC集群搭建4】 缓存融合技术
  5. 【Oracle RAC集群搭建5】 RAC 特殊问题和实战经验
  6. 【Oracle RAC集群搭建6】 ORACLE 11 G版本2 RAC在LINUX上使用NFS安装前准备
  7. 【Oracle RAC集群搭建7】 ORACLE ENTERPRISE LINUX 5.7下DATABASE 11G RAC集群安装
  8. 【Oracle RAC集群搭建8】 ORACLE ENTERPRISE LINUX 5.7下DATABASE 11G RAC数据库安装
  9. 【Oracle RAC集群搭建9】 ORACLE ENTERPRISE LINUX 5.7下DATABASE 11G RAC基本测试与使用
  10. 【MySql集群搭建】   真机环境下MySQL-Cluster搭建文档

  11. 【Hadoop集群搭建1】Hadoop集群的配置

  12. 【Hadoop集群搭建2】Hadoop集群的配置

1.    实验准备


1.1    目的:

在虚拟机环境下,让同学们学会从零开始配置Hadoop-2.2集群,并尝试在真实环境下搭建集群。

1.2    主要内容:

物理机器总共4台,想配置基于物理机的Hadoop集群中包括4个节点: 1 个 Master, 3个 Salve ,节点之间局域网连接,可以相互 ping通。IP的分布如表1所示。

表1        4个节点的IP地址分配及角色

Master机器主要配置NameNode和JobTracker的角色,负责总管分布式数据和分解任务的执行;3个Salve机器配置DataNode和TaskTracker的角色,负责分布式数据存储以及任务的执行。

用到的所有文件

1.4 用户信息(所有节点一样)

2.搭建虚拟集群环境


安装完VMWare10后,解压CentOS到指定文件夹下,打开VMWare10,点击菜单栏“文件”-->“打开”,选择CentOS文件,如图。

右击CentOS选择属性,弹出设置窗口。里面是虚拟系统的主要硬件参数信息,读者可以根据自己机器性能配置,这里选默认。

2.1三种连接方式

VMWare提供了三种工作模式,它们是bridged(桥接模式)、NAT(网络地址转换模式)和host-only(主机模式)。要想在网络管理和维护中合理应用它们,就应该先了解一下这三种工作模式。主机上安装VMware Workstation或VMware Server的时候,默认会安装3块虚拟网卡,这3块虚拟网卡的名称分别为VMnet0、VMnet1、VMnet8,其中VMnet0的网络属性为“物 理网卡”,VMnet1与VMnet8的网络属性为“虚拟网卡”。在默认情况下,VMnet1虚拟网卡的定义是“仅主机虚拟网络”,VMnet8虚拟网卡的定义是“NAT网络”,同时,主机物理网卡被定义为“桥接网络”,主机物理网卡也可以称为VMnet0

大家在安装完虚拟机后,默认安装了两个虚拟网卡,VMnet1和 VMnet8。其中VMnet1是hostonly网卡,用于host方式连接网络的。VMnet8是NAT网卡,用 于NAT方式连接网络的。它们的IP地址默认是的,如果要用虚拟机做实验的话,最好将VMnet1到VMnet8的IP地址改掉。习惯上把 VMware虚拟网卡使用的网段“固定”,即设置为静态ip。使用如下原则:VMnet1对应的网段是192.168.10.0,VMnet8对应的网段是 192.168.80.0

1.bridged(桥接模式)

  在这种模式下,VMWare虚拟出来的操作系统就像是局域网中的一台独立的主机,它可以访问网内任何一台机器。在桥接模式下,需要手工为虚拟系统配置IP地址、子网掩码,而且还要和宿主机器处于同一网段,这样虚拟系统才能和宿主机器进行通信。同时,由于这个虚拟系统是局域网中的一个独立的主机系统,那么就可以手工配置它的TCP/IP配置信息,以实现通过局域网的网关或路由器访问互联网。使用桥接模式的虚拟系统和宿主机器的关系,就像连接在同一个Hub上的两台电脑。想让它们相互通讯,你就需要为虚拟系统配置IP地址和子网掩码,否则就无法通信。如果想利用VMWare在局域网内新建一个虚拟服务器,为局域网用户提供网络服务,就应该选择桥接模式。使用这种方式很简单,前提是要得到1个以上的地址。对于想进行种种网络实验的朋友不太适合,因为无法对虚拟机的网络进行控制,它直接就出去了。

使用桥接方式,A,A1,A2,B可互访。

2.host-only(仅主机模式)

  在某些特殊的网络调试环境中,要求将真实环境和虚拟环境隔离开,这时你就可采用host-only模式。在host-only模式中,所有的虚拟系统是可以相互通信的,但虚拟系统和真实的网络是被隔离开的。提示:在host-only模式下,虚拟系统和宿主机器系统是可以相互通信的,相当于这两台机器通过双绞线互连。在host-only模式下,虚拟系统的TCP/IP配置信息(如IP地址、网关地址、DNS服务器等),都可以由VMnet1(host-only)虚拟网络的DHCP服务器来动态分配。如果想利用VMWare创建一个与网内其他机器相隔离的虚拟系统,进行某些特殊的网络调试工作,可以选择host-only模式。

使用Host方式,A,A1,A2可以互访,但A1,A2不能访问B,也不能被B访问。

3.NAT(网络地址转换模式)

  使用NAT模式,就是让虚拟系统借助NAT(网络地址转换)功能,通过宿主机器所在的网络来访问公网。也就是说,使用NAT模式可以实现在虚拟系统中安全的访问互联网。NAT模式下虚拟系统的TCP/IP配置信息是由VMnet8(NAT)虚拟网络的DHCP服务器提供的,无法进行手工修改,因此虚拟系统也就无法和本局域网中的其他真实主机进行通讯。采用NAT模式最大的优势是虚拟系统接入互联网非常简单,你不需要进行任何其他的配置,只需要宿主机器能访问互联网即可。如果想利用VMWare安装一个新的虚拟系统,在虚拟系统中不用进行任何手工配置就能直接访问互联网,建议采用NAT模式。提示:以上所提到的NAT模式下的VMnet8虚拟网络,host-only模式下的VMnet1虚拟网络,以及bridged模式下的VMnet0虚拟网络,都是由VMWare虚拟机自动配置而生成的,不需要用户自行设置。VMnet8和VMnet1提供DHCP服务,VMnet0虚拟网络则不提供。

使用NAT方式,A1,A2可以访问B,但B不可以访问A1,A2。但A,A1,A2可以互访。

全局网络拓扑图:

思考:真实部署要根据网络环境的不同而配置不同的连接方式,那么请思考,在6601机房搭建真实集群对应哪种连接方式?

2.2  host-only连接步骤

在学习VMWare虚拟网络时,我们建议选择host-only方式。第一,如果你的电脑是笔记本,从A移到B网络环境发生变化后,只有host-only方式不受影响,其他方式必须重新设置虚拟交换机配置。第二,将真实环境和虚拟环境隔离开,保证了虚拟环境的安全。

按绿色箭头启动虚拟机,角色选择other,输入root角色名,这里的密码是hadoop,具体密码由CentOS安装时设置,而我们使用的是安装好的。

由于选择的是host-only连接方式,VMnet1必须打开,然后设置ipv4。

由于host-only方式不能连接外网,所以DNS不需配置,其他方式想要访问外网必须配置。

在Linux桌面环境中右击电脑图标,选中“EditConnection”进行如下配置:

打开终端,查看配置情况。

检查与Windows主机的通信情况。

1.Windows-->Linux

2.Linux-->Winodws

思考:访问外部主机失败,分析为什么?

2.3 使用PieTTY连接Linux

填写连接目的的IP地址,端口是SSH模式的访问端口22,点击open,输入角色和密码登录。

提示“潜在安全缺口”,由于首次使用PieTTy登陆Linux[微软用户1] 虚拟机,PieTTY缓存里面并没有该Linux虚拟机的rsa2公钥信息,因此会提示是否信任次机器,我们选择是。

其他常用登录工具还有putty,XShell等,PieTTY相比之下操作简单功能丰富。

2.3 新建用户

使用root登陆后,创建Hadoop用户,在hadoopGroup组里。

1.创建hadoopGroup组

添加用户时,可以将用户添加到现有的用户组,或者创建一个新的用户组。可以在/etc/group文件中看到所有的用户组信息。默认的用户组通常用来管理系统用户,不建议将普通用户添加到这些用户组。使用groupadd命令创建用户组的语法为:

groupadd [-g gid [-o]] [-r] [-f] groupname

每个选项的含义如下:

如果不指定选项,系统将使用默认值。创建一个 hadoopGroup用户组:

$ groupadd hadoopGroup
2. 添加Hadoop用户

添加用户可以使用useradd命令,语法为:

useradd -d homedir -g groupname -m -s shell -u userid accountname

每个选项的含义如下:

指定用户主目录/home/hadoop用户组hadoopGroup。

用户被创建后,可以使用passwd命令来设置密码,如:

$ passwd hadoop
Changing password for user hadoop.
New Linux password:******
Retype new UNIX password:******
passwd: all authentication tokens updated successfully.

2.4 安装jdk,hadoop

1.使用winscp传输文件

在root用户下,执行命令rm -rf  /usr/local/*

删除目录下所有内容(当前内容无用)使用winscp把jdk文件从windows复制到/usr/local目录下。点击新建一个会话。

输入用户和密码:

2.解压文件

解压命令tar -zvxf jdk-7u67-linux-x64.tar.gz到当前目录。

更改文件名为jdk1.7。

同样,解压命令tar -zvxf jdk-7u67-linux-x64.tar.gz到当前目录,并通过命令

mv hadoop-2.2.0 /home/hadoop/hadoop2.2 移动到Hadoop用户的主目录下。

3.目录规划

Hadoop程序存放目录为/home/hadoop/hadoop2.2,相关的数据目录,包括日志、存储等指定为/home/hadoop/hadoop2.2。将程序和数据目录分开,可以更加方便的进行配置的同步。

具体目录的准备与配置如下所示:

l  在每个节点上创建程序存储目录/home/hadoop/hadoop2.2,用来存放Hadoop程序文件。

l  在每个节点上创建数据存储目录/home/hadoop/hadoop2.2/hdfs,用来存放集群数据。

l  在主节点node上创建目录/home/hadoop/hadoop2.2/hdfs/name,用来存放文件系统元数据。

l  在每个从节点上创建目录/home/hadoop/hadoop2.2/hdfs/data,用来存放真正的数据。

l  所有节点上的日志目录为/home/hadoop/hadoop2.2/logs。

l  所有节点上的临时目录为/home/hadoop/hadoop2.2/tmp。

执行命令mkdir -p  /home/hadoop/hadoop2.2/hdfs,为还没有的目录创建,后面以此类推。

给hadoopGroup组赋予权限,凡是属于hadoopGroup组的用户都有权利使用hadoop2.2,方便多用户操作。首先,把Hadoop2.2加入到hadoopGroup组:

chgrp -R hadoopGroup hadoop2.2

给这个组赋予权限:

chmod -R g=rwx hadoop2.2

4.导入JDK环境变量

执行cd /etc命令后执行vi profile,在行末尾添加:

export JAVA_HOME=/usr/local/jdk1.7

export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar

export PATH=.:$JAVA_HOME/bin:$PATH


 执行source profile,使其配置立即生效。

执行java –version,查看是否安装成功。

5.导入Hadoop环境变量

同上面一样,修改profile。

export  HADOOP_HOME=/home/hadoop/hadoop2.2

export PATH=.:$HADOOP_HOME/sbin:$HADOOP_HOME/bin:$JAVA_HOME/bin:$PATH

export HADOOP_LOG_DIR=/home/hadoop/hadoop2.2/logs

export YARN_LOG_DIR=$HADOOP_LOG_DIR

执行hadoop命令,查看有没有成功。

2.5.修改主机名

1.修改当前会话中的主机名,执行命令hostname node。

但是这种配置只对当前状态有效,一旦重新启动虚拟机,主机名未变。

2.修改配置文件中的主机名,执行命令vi /etc/sysconfig/network。

重启生效,由于第一步已经在当前会话中配置了hostname,所以不用重启。

3.绑定hostname与IP

执行vi/etc/hosts,增加内容如下:

192.168.10.100         node

192.168.10.101         node1

192.168.10.102         node2

192.168.10.103         node3

Ping node,检验是否修改成功?

2.6 关闭防火墙

如果不关闭防火墙,有以下几种情况出现:

第一:hdfs的Web管理页面,打不开该节点的文件浏览页面。

第二:后台运行脚本(HIVE的),会出现莫名其妙的假死状态。

第三:在删除和增加节点的时候,会让数据迁移处理时间更长,甚至不能正常完成相关操作。

第四:不管你做任何操作,都是会运行不正常,而且很不顺手。

执行命令service iptables stop

验证:  service iptables status

执行上面操作可以关闭防火墙,但重启后还会继续运行,所以还要关闭防火墙的自动运行。

执行命令 chkconfig iptables off

验证:  chkconfig --list |grep iptables

2.7 修改hadoop2.2配置文件

Hadoop没有使用java.util.Properties管理配置文件,也没有使用Apache Jakarta Commons Configuration管理配置文件,而是使用了一套独有的配置文件管理系统,并提供自己的API,即使org.apache.hadoop.conf.Configuration处理配置信息,大家也可以通过eclipse工具分析下源码,并利用这些api修改配置文件。

由于Hadoop集群中每个机器上面的配置基本相同,所以先在namenode上面进行配置部署,然后再复制到其他节点。

1. 配置 ~/hadoop2.2/etc/hadoop下的hadoop-env.sh、yarn-env.sh、mapred-env.sh

修改JAVA_HOME值(export JAVA_HOME=/usr/local/jdk1.7/)

2. 配置 ~/hadoop2.2/etc/hadoop/slaves(这个文件里面保存所有slave节点)

3. 配置 ~/hadoop-2.2.0/etc/hadoop/core-site.xml

<configuration>

    <property>
<name>fs.defaultFS</name>
<value>hdfs://node:9000/</value>
<description> 设定 namenode 的 主机名 及 端口 </description>
</property> <property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/tmp/hadoop-${user.name}</value>
<description> 存放临时文件的目录 </description>
</property> <property>
<name>hadoop.proxyuser.hadoop.hosts</name>
<value>*</value>
</property> <property>
<name>hadoop.proxyuser.hadoop.groups</name>
<value>*</value>
</property> </configuration>

http://hadoop.apache.org/docs/r2.2.0/hadoop-project-dist/hadoop-common/core-default.xml

4. 配置 ~/hadoop-2.2.0/etc/hadoop/hdfs-site.xml

<configuration>  

    <property>
<name>dfs.namenode.http-address</name>
<value>node:50070</value>
<description> NameNode 通过当前参数 获得 fsimage 和 edits </description>
</property> <property>
<name>dfs.namenode.secondary.http-address</name>
<value>node1:50090</value>
<description> SecondNameNode 通过当前参数 获得最新的 fsimage </description>
</property> <property>
<name>dfs.replication</name>
<value>3</value>
<description> 设定 HDFS 存储文件的副本个数,默认为3 </description>
</property> <property>
<name>dfs.namenode.name.dir</name>
<value>file:///home/hadoop/hadoop2.2/hdfs/name</value>
<description> namenode 用来持续存放命名空间和交换日志的本地文件系统路径 </description>
</property> <property>
<name>dfs.datanode.data.dir</name>
<value>file:///home/hadoop/hadoop2.2/hdfs/data</value>
<description> DataNode 在本地存放块文件的目录列表,用逗号分隔 </description>
</property> <property>
<name>dfs.namenode.checkpoint.dir</name>
<value>file:///home/hadoop/hadoop2.2/hdfs/namesecondary</value>
<description> 设置 secondary 存放 临时镜像 的本地文件系统路径,如果这是一个用逗号分隔的文件列表,则镜像将会冗余复制到所有目录,只对 secondary 有效 </description>
</property> <property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property> <property>
<name>dfs.stream-buffer-size</name>
<value>131072</value>
<description> 默认是4KB,作为hadoop缓冲区,用于hadoop读hdfs的文件和写
hdfs的文件,还有map的输出都用到了这个缓冲区容量,对于现在的硬件很保守,可以设置为128k
(131072),甚至是1M(太大了map和reduce任务可能会内存溢出) </description>
</property> <property>
<name>dfs.namenode.checkpoint.period</name>
<value>3600</value>
<description> 两次 checkpoints 之间的间隔,单位为秒,只对 secondary 有效 </description>
</property> </configuration>

http://hadoop.apache.org/docs/r2.2.0/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml

5. 配置 ~/hadoop-2.2.0/etc/hadoop/mapred-site.xml

<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobtracker.address</name>
<value>hdfs://trucy:9001</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>node:10020</value>
<description>
MapReduce JobHistory Server host:port, default port is 10020.</description>
</property> <property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>node:19888</value>
<description>MapReduce JobHistory Server Web UI host:port, default port is 19888.</description>
</property> </configuration>

http://hadoop.apache.org/docs/r2.2.0/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml

6. 配置 ~/hadoop-2.2.0/etc/hadoop/yarn-site.xml

<configuration>

    <property>
<name>yarn.resourcemanager.hostname</name>
<value>node</value>
</property> <property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property> <property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property> <property>
<name>yarn.resourcemanager.address</name>
<value>node:8032</value>
</property> <property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>node:8030</value>
</property> <property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>node:8031</value>
</property> <property>
<name>yarn.resourcemanager.admin.address</name>
<value>node:8033</value>
</property> <property>
<name>yarn.resourcemanager.webapp.address</name>
<value>node:8088</value>
</property> </configuration>

http://hadoop.apache.org/docs/r2.2.0/hadoop-yarn/hadoop-yarn-common/yarn-default.xml


未完待续.......

下节:Hadoop集群的配置(二)

尾注:本系列文档,笔者真机环境测试无误得以分享,纯属原创,若有转载,请注释出处.

【Big Data】HADOOP集群的配置(一)的更多相关文章

  1. 【Big Data】HADOOP集群的配置(二)

    Hadoop集群的配置(二) 摘要: hadoop集群配置系列文档,是笔者在实验室真机环境实验后整理而得.以便随后工作所需,做以知识整理,另则与博客园朋友分享实验成果,因为笔者在学习初期,也遇到不少问 ...

  2. Hadoop集群的配置(一)

    摘要: hadoop集群配置系列文档,是笔者在实验室真机环境实验后整理而得.以便随后工作所需,做以知识整理,另则与博客园朋友分享实验成果,因为笔者在学习初期,也遇到不少问题.但是网上一些文档大多互相抄 ...

  3. Hadoop的学习前奏(二)——Hadoop集群的配置

    前言: Hadoop集群的配置即全然分布式Hadoop配置. 笔者的环境: Linux:  CentOS 6.6(Final) x64   JDK:    java version "1.7 ...

  4. hadoop 集群的配置

    在经过几天折腾,终于将hadoop环境搭建成功,整个过程中遇到各种坑,反复了很多遍,光虚拟机就重新安装了4.5次,接下来就把搭建的过程详细叙述一下 0.相关工具: 1,系统环境说明: 我这边给出我的集 ...

  5. hadoop集群默认配置和常用配置【转】

    转自http://www.cnblogs.com/ggjucheng/archive/2012/04/17/2454590.html 获取默认配置 配置hadoop,主要是配置core-site.xm ...

  6. Hadoop集群安装配置教程_Hadoop2.6.0_Ubuntu/CentOS

    摘自:http://www.powerxing.com/install-hadoop-cluster/ 本教程讲述如何配置 Hadoop 集群,默认读者已经掌握了 Hadoop 的单机伪分布式配置,否 ...

  7. hadoop集群默认配置和常用配置

    http://www.cnblogs.com/ggjucheng/archive/2012/04/17/2454590.html 获取默认配置 配置hadoop,主要是配置core-site.xml, ...

  8. hadoop集群单点配置

    =================== =============================== ----------------hadoop集群搭建 --------------------- ...

  9. 从VMware虚拟机安装到hadoop集群环境配置详细说明(第一期)

    http://blog.csdn.net/whaoxysh/article/details/17755555 虚拟机安装 我安装的虚拟机版本是VMware Workstation 8.04,自己电脑上 ...

随机推荐

  1. [APUE]进程控制(上)

    一.进程标识 进程ID 0是调度进程,常常被称为交换进程(swapper).该进程并不执行任何磁盘上的程序--它是内核的一部分,因此也被称为系统进程.进程ID 1是init进程,在自举(bootstr ...

  2. Git Bash的一些命令和配置

    查看git版本号: git --version 如果是第一次使用Git,你需要设置署名和邮箱: $ git config --global user.name "用户名" $ gi ...

  3. java字符乱码

    在java中处理字符时,经常会发生乱码,而主要出现的地方在读取文本文件时发生,或者是写入到文件中,在其他地方打开乱码. 如下例子: BufferedReader br = null; try { br ...

  4. bzoj3208--记忆化搜索

    题目大意: 花花山峰峦起伏,峰顶常年被雪,Memphis打算帮花花山风景区的人员开发一个滑雪项目.    我们可以把风景区看作一个n*n的地图,每个点有它的初始高度,滑雪只能从高处往低处滑[严格大于] ...

  5. Register-SPWorkflowService 404

    最近需要做一个SharePoint 2013工作流演示环境. 于是在自己的本子上安装了一个虚拟机. 虚拟机操作系统是Windows Server 2012 R2,计划把AD.SQL Server 20 ...

  6. 张高兴的 UWP 开发笔记:汉堡菜单进阶

    不同于Windows 8应用,Windows 10引入了"汉堡菜单"这一导航模式.说具体点,就拿官方的天气应用来说,左上角三条横杠的图标外加一个SplitView控件组成的这一导航 ...

  7. mac好用的markdown编辑器

    在刚开始接触markdown的时候,就被吸引了.此后一直在找贴心的好用的markdown编辑器.印象笔记和马克飞象配合着用也是挺好的,唯一的缺点就是比较封闭,发个笔记的链接给同学,还得注册才能看,导致 ...

  8. TFS 2015 敏捷开发实践 – 在Kanban上运行一个Sprint

    前言:在 上一篇 TFS2015敏捷开发实践 中,我们给大家介绍了TFS2015中看板的基本使用和功能,这一篇中我们来看一个具体的场景,如何使用看板来运行一个sprint.Sprint是Scrum对迭 ...

  9. GCC学习(1)之MinGW使用

    GCC学习(1)之MinGW使用 因为后续打算分享一些有关GCC的使用心得的文章,就把此篇当作一个小预热,依此来了解下使用GNU工具链(gcc.gdb.make等)在脱离IDE的情况下如何开发以及涉及 ...

  10. 【每日一linux命令1】linux命令路径

    一.路径: 执行命令前必须要考虑的一步是命令的路径,若是路径错误或是没有正确的指定,可能导致错误 的执行或是找不到该命令.要知道设置的路径,可执行以下命令: echo $PATH 显示结果: 这时我们 ...