Hadoop 安装教程——单节点模式和分布式模式配置

news2024/10/24 9:59:42

文章目录

    • 一、预备知识
      • 1.1 Hadoop 发行版本
      • 1.2 部署方式
    • 二、预备条件
      • 2.1 环境准备
      • 2.2 创建新用户(可选)
      • 2.3 配置 SSH 无密码登录
      • 2.4 下载 Hadoop
      • 2.5 编辑 hadoop-env.sh 脚本
      • 2.6 编辑 dfs 和 yarn 脚本
    • 三、单节点模式部署
      • 3.1 官方使用案例
      • 3.2 查看运行结果
    • 四、伪分布模式部署
      • 4.1 修改配置文件
      • 4.2 格式化 Hadoop(首次)
      • 4.3 启动 Hadoop
      • 4.4 检查 Hadoop 状态
      • 4.5 停止 Hadoop
    • 五、常见问题
      • 5.1 启动 start-dfs.sh 脚本报错
      • 5.2 启动脚本时拒绝访问
    • 参考资料

一、预备知识

1.1 Hadoop 发行版本

Hadoop 的发行版本有:

  • Apache Hadoop:官方版本,由 Apache 软件基金会维护。
  • Hortonworks Data Platform (HDP):基于 Apache Hadoop 的企业级发行版,提供了额外的工具和组件(如 Hive、HBase、Spark 等),适合企业用户。
  • Cloudera Data Platform (CDP):Cloudera 的企业级解决方案,整合了 Hortonworks 和 Cloudera 的产品,提供更全面的功能和支持。

其中,Apache Hadoop 最适合新手入门学习。

1.2 部署方式

部署方式主要有以下三种:

  • 单节点模式:所有 Hadoop 组件运行在同一台机器上。这比较适合适合开发和测试。

  • 伪分布模式:在单台机器上模拟分布式环境,Hadoop 各组件在不同的进程中运行。这比较适合适合小规模测试和开发。

  • 完全分布式模式:在多台机器上部署 Hadoop 集群,每个节点上运行不同的 Hadoop 组件。这适合生产环境,要求对集群进行详细配置。

二、预备条件

2.1 环境准备

  • 安装 JDK。在 Hadoop Java Versions - Hadoop - Apache Software Foundation 查看Hadhoop 推荐的 Java 版本,最佳版本为 JDK 8 。

  • 配置 SSH 免密登录。如果要使用可选的启动和停止脚本,则必须安装 ssh 并且运行 sshd 才 能使用管理远程 Hadoop 守护进程的 Hadoop 脚本。此外,建议还安装 pdsh 以更好地管理ssh资源。

    $ sudo apt-get install ssh
    $ sudo apt-get install pdsh
    

    注意,pdsh 的远程命令类型为 rsh, 建议修改成 ssh。

2.2 创建新用户(可选)

创建一个新用户,用户名和密码设置为 hadoop

$ sudo useradd -m hadoop -s /bin/bash
$ sudo passwd hadoop

为了避免权限造成的问题,为 hadoop 用户增加管理员权限。

$ sudo adduser hadoop sudo

2.3 配置 SSH 无密码登录

Hadoop 在启动时需要通过 SSH 连接到各个节点(包括本地主机)。因此,我们需要配置无密码登录。

简单地介绍已下 SSH 登录原理:

  1. 密钥对生成:用户在本地生成一对密钥:一个私钥和一个公钥。私钥保留在本地,公钥可以共享给任何希望访问的服务器。
  2. 公钥复制:用户将公钥添加到目标服务器的 ~/.ssh/authorized_keys 文件中。
  3. 身份验证过程:当用户尝试通过 SSH 连接到服务器时,服务器会发送一条随机消息给用户。用户使用自己的私钥对该消息进行加密,然后将其返回给服务器。服务器使用存储在 authorized_keys 文件中的相应公钥来解密收到的消息。如果解密成功且消息匹配,身份验证通过,用户被允许访问。

(1) 确保 SSH 服务正在运行

首先,确保 SSH 服务在您的 Ubuntu 系统上运行。

# 检查 SSH 服务的状态
$ sudo systemctl status ssh

# 如果服务未运行, 启动 SSH 服务
$ sudo systemctl start ssh

(2) 生成 SSH 密钥对

使用 ssh-keygen~/.ssh 目录下生成 SSH 密钥对。

# 输入密码 hadoop 才能登录。因此,我们需要实现无密登录
ssh localhost

# 若没有该目录,执行一次 ssh localhost 后会自动生成
$ cd ~/.ssh/ 

# 生成密钥对
$ ssh-keygen -t rsa -b 2048
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hadoop/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/hadoop/.ssh/id_rsa
Your public key has been saved in /home/hadoop/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:HGuMfZmVK09WBr0fPJ3Kj5xYnUuChwl08TlaSq5HN0k hadoop@ubuntu
The key's randomart image is:
+---[RSA 2048]----+
|           .o.   |
|         . ..oo  |
|        o ..oE+.o|
|       = +o+=++=.|
|      . S *=O+o.+|
|       . .oO.*.+.|
|         . .* * .|
|          .. + o |
|                 |
+----[SHA256]-----+

其中,id_rsa 为 私钥, id_rsa.pub 为公钥。

(3) 将公钥添加到目标服务器的authorized_keys

使用 ssh-copy-id 命令可以方便地将公钥复制到目标主机的 authorized_keys 文件中

# 方式一
$ ssh-copy-id -i ~/.ssh/id_rsa.pub localhost

# 方式二
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

authorized_keys 是一个文本文件,位于用户的 ~/.ssh/ 目录下。它用于存储被授权可以无密码访问该用户帐户的 SSH 公钥。将公钥添加到 authorized_keys 文件中,以允许无密码访问。

确保 ~/.ssh/authorized_keys 的权限设置正确:

chmod 0600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh

(4) 测试 SSH 连接

在终端中尝试通过 SSH 连接到 localhost 和主机名:

$ ssh ubuntu
The authenticity of host 'ubuntu (127.0.1.1)' can't be established.
ECDSA key fingerprint is SHA256:Joilwgpgx1Mc2K3XnL1iszZ+Y/EK+GltbMG6B28luBY.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'ubuntu' (ECDSA) to the list of known hosts.
Welcome to Ubuntu 20.04.4 LTS (GNU/Linux 5.15.0-107-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

240 updates can be applied immediately.
123 of these updates are standard security updates.
To see these additional updates run: apt list --upgradable

Your Hardware Enablement Stack (HWE) is supported until April 2025.

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

其中, ubuntu 是为特定计算机设置的主机名,用于标识这台机器。

2.4 下载 Hadoop

在 Apache Download Mirrors 下载合适的 Hadoop 版本。如果官网下载太慢,可以考虑 hadoop/common (huaweicloud.com) 网站。

执行以下命令,下载 Hadoop 安装包。

# 下载安装包
$ wget --no-check-certificate https://repo.huaweicloud.com/apache/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz

# 解压安装包到指定目录
$ sudo tar -zxvf hadoop-3.3.6.tar.gz -C /usr/local/

# 将文件夹名改为hadoop
$ cd /usr/local
$ sudo mv ./hadoop-3.3.6/ ./hadoop            

# 修改文件权限
$ sudo chown -R hadoop ./hadoop     

输入如下命令来检查 Hadoop 是否可用,成功则会显示 Hadoop 版本信息:

$ cd /usr/local/hadoop
$ ./bin/hadoop version

2.5 编辑 hadoop-env.sh 脚本

编辑 hadoop-env.sh 脚本, 设置必要的一些参数。

# The java implementation to use. By default, this environment
# variable is REQUIRED on ALL platforms except OS X!
export JAVA_HOME=/usr/local/jdk/jdk1.8.0_421

查看 Hadoop 脚本的使用文档

$/usr/local/hadoop-3.3.6/bin/hadoop

2.6 编辑 dfs 和 yarn 脚本

在 sbin/start-dfs.sh 和 sbin/stop-dfs.sh 脚本中,添加以下参数:

HDFS_DATANODE_USER=root
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root  
HDFS_DATANODE_SECURE_USER=hdfs

在 sbin/start-yarn.sh 和 sbin/stop-yarn.sh 脚本中,添加以下参数:

YARN_RESOURCEMANAGER_USER=root
YARN_NODEMANAGER_USER=root

三、单节点模式部署

默认情况下,Hadoop配置为以非分布式模式运行,作为单个Java进程。这对于调试很有用。

3.1 官方使用案例

input 文件夹中的所有文件作为输入,筛选当中符合正则表达式 dfs[a-z.]+ 的单词并统计出现的次数,最后输出结果到 output 文件夹中

$ cd /usr/local/hadoop

$ mkdir input

$ cp etc/hadoop/*.xml input

$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar grep input output 'dfs[a-z.]+'

3.2 查看运行结果

查看运行结果:

$ cat output/*
1	dfsadmin
1	dfs.replication
1	dfs.permissions

四、伪分布模式部署

Hadoop 可以在单节点上以伪分布式的方式运行,Hadoop 进程以分离的 Java 进程来运行。

/usr/local/hadoop/etc/hadoop/ 中,伪分布式需要修改2个配置文件 core-site.xmlhdfs-site.xml

4.1 修改配置文件

etc/hadoop/core-site.xml:

<configuration>
  <!-- 指定 Hadoop 文件系统的默认文件系统 URI -->
  <property>
	  <name>fs.defaultFS</name>
	  <value>hdfs://localhost:9000</value>
  </property>
  
  <!-- 指定 Hadoop 运行时生成的临时文件的存储目录 -->
  <property>
	  <name>hadoop.tmp.dir</name>
	  <value>file:/usr/local/hadoop/tmp</value>
    <description>Abase for other temporary directories.</description>
  </property>
</configuration>

etc/hadoop/hdfs-site.xml

<configuration>
  <!-- 指定了 HDFS NameNode 存储其元数据的目录 -->
  <property>
      <name>dfs.namenode.name.dir</name>
      <value>file:/usr/local/hadoop/tmp/dfs/name</value>
  </property>

  <!-- 指定了 HDFS DataNode 存储实际数据块的目录 -->
  <property>
      <name>dfs.datanode.data.dir</name>
      <value>file:/usr/local/hadoop/tmp/dfs/data</value>
  </property>

  <!-- 定义 HDFS 文件的默认副本数量 -->
  <property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>

  <!-- 定义 HDFS 是否启用权限检查 -->
  <property>
   <name>dfs.permissions</name>
   <value>false</value>
  </property>

  <!-- 控制 Secondary NameNode(次要 NameNode)执行 HDFS 检查点(checkpoint)的周期 -->
  <property>
   <name>fs.checkpoint.period</name>
   <value>3000</value>
  </property>
</configuration>

etc/hadoop/mapred-site.xml:

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
        <name>mapreduce.application.classpath</name>
        <value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value>
    </property>
</configuration>

etc/hadoop/yarn-site.xml:

<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.nodemanager.env-whitelist</name>
        <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_HOME,PATH,LANG,TZ,HADOOP_MAPRED_HOME</value>
    </property>
</configuration>

4.2 格式化 Hadoop(首次)

在第一次启动的时候,格式化 HDFS(Hadoop 分布式文件系统)。

# 进入 Hadoop 安装目录
$ cd /usr/local/hadoop

# 格式化 HDFS
$ bin/hdfs namenode -format

后面启动的时候,无需格式化。

4.3 启动 Hadoop

(1) 启动 HDFS

$ sbin/start-dfs.sh
Starting namenodes on [localhost]
Starting datanodes
Starting secondary namenodes [ubuntu]

在成功启动后,我们还可以访问 Hadoop Web 界面 http://localhost:9870。

在这里插入图片描述

(2) 启动 YARN

启动 YARN。

$ sbin/start-yarn.sh
Starting resourcemanager
Starting nodemanagers

在成功启动后,我们还可以访问 YARN 界面 http://localhost:8088 。
在这里插入图片描述

4.4 检查 Hadoop 状态

使用以下命令检查 Hadoop 服务的状态:

# 查看运行 Java 进程
$ jps
5079 ResourceManager
4508 DataNode
4348 NameNode
4782 SecondaryNameNode
5615 Jps
5231 NodeManager

此命令将显示当前正在运行的 Java 进程。您应该能够看到如下进程:

4.5 停止 Hadoop

$ sbin/stop-dfs.sh
Stopping namenodes on [localhost]
Stopping datanodes
Stopping secondary namenodes [ubuntu]

$ sbin/stop-yarn.sh
Stopping nodemanagers
Stopping resourcemanager

五、常见问题

5.1 启动 start-dfs.sh 脚本报错

问题描述:

$ sudo sbin/start-dfs.sh
Starting namenodes on [ubuntu]
pdsh@ubuntu: ubuntu: rcmd: socket: Permission denied
Starting datanodes
pdsh@ubuntu: localhost: rcmd: socket: Permission denied
Starting secondary namenodes [ubuntu]
pdsh@ubuntu: ubuntu: rcmd: socket: Permission denied

解决方案:

(1) 查看 SSH 配置

检查 /etc/ssh/sshd_config 配置文件,确保以下基本配置

# 
PermitRootLogin yes
PubkeyAuthentication yes
AuthorizedKeysFile     .ssh/authorized_keys

如果有更改,记得重启 SSH 服务

$ sudo systemctl restart ssh

(2)pdsh 执行命令

pdsh(并行分布式 Shell)执行远程命令时的默认远程命令类型为 rsh 时, 会出现该问题。

# 检查 pdsh 的远程命令类型
$ pdsh -q -w localhost

更改为使用 ssh :

# 1. 临时设置
$ export PDSH_RCMD_TYPE=ssh

# 2. 永久设置
$ echo 'export PDSH_RCMD_TYPE=ssh' >> ~/.bashrc

最后,重新加载 ~/.bashrc

$ source ~/.bashrc

(3)不建议的方案

在尝试以上方案后,依旧无法启动,建议删除 pdsh

apt-get remove pdsh

5.2 启动脚本时拒绝访问

报错信息:

$ sudo sbin/start-dfs.sh
Starting namenodes on [ubuntu]
ubuntu: root@ubuntu: Permission denied (publickey,password).
Starting datanodes
localhost: root@localhost: Permission denied (publickey,password).
Starting secondary namenodes [ubuntu]
ubuntu: root@ubuntu: Permission denied (publickey,password).

解决方案:

不要使用 sudo。事实上,在没有使用 sudo 的情况下依旧可以运行,我们可以考虑直接为用户增加管理员权限。

参考资料

Apache Hadoop 3.3.6 – Hadoop: Setting up a Single Node Cluster.

hadoop - HDFS_NAMENODE_USER, HDFS_DATANODE_USER & HDFS_SECONDARYNAMENODE_USER not defined - Stack Overflow

Hadoop安装教程——单机 / 伪分布式配置-阿里云开发者社区 (aliyun.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2222300.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用哪种建站程序做谷歌SEO更容易?

做网站很容易&#xff0c;但做一个能带来流量和订单的网站就没那么简单了。尤其是在谷歌SEO优化方面&#xff0c;不同的建站程序对SEO的支持程度也不同。在这方面&#xff0c;WordPress和Shopify无疑是最佳选择。 WordPress作为一个内容管理系统&#xff08;CMS&#xff09;&am…

关键词提取技术:TF-IDF 详解

1. 什么是TF-IDF&#xff1f; TF-IDF&#xff08;Term Frequency-Inverse Document Frequency&#xff09; 是一种统计方法&#xff0c;用于评估单词在文档集或语料库中的重要性。它是自然语言处理和信息检索中的核心技术之一。 TF-IDF主要基于以下两个概念&#xff1a; TF&a…

Java毕业设计 基于SSM jsp餐厅卫生安全系统

Java毕业设计 基于SSM jsp餐厅卫生安全系统 这篇博文将介绍一个基于SSM框架和jsp开发的餐厅卫生安全系统&#xff0c;适合用于Java毕业设计。 功能介绍 餐厅人员: 注册 登录 首页 图片轮播 窗口信息 窗口详情 文明窗口 差评窗口 系统公告 个人中心 管理员&#xff1a;…

亚信安全DeepSecurity中标知名寿险机构云主机安全项目

近日&#xff0c;亚信安全DeepSecurity成功中标国内知名寿险机构的云主机安全项目。亚信安全凭借在云主机安全防护领域的突出技术优势&#xff0c;结合安全运营的能力&#xff0c;以“实战化”为指导&#xff0c;为用户提供无惧威胁攻击、无忧安全运营的一站式云安全体系&#…

Anaconda和Pycharm超详细安装教程(2024版本+Win11)

一、安装Anaconda 1.1 下载Anaconda 在官方网站(Free Download | Anaconda)上下载适用于你的操作系统的 Anaconda 安装包。(这里以windows为例) 1.2 安装Anaconda 打开下载的安装包,并按照安装向导的指示进行安装。在安装过程中,你可以选择默认的安装选项,也可以根据…

Visual Studio安装图文详解教程

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 教程说明 本教程旨在详细介绍 Visual Studio 社区版的安装过程及其注意事项。 Visual Studio简介 Visual Studio 社区版功能完备且可扩展的免费 IDE&#xff0c;可用于创…

NVR接入录像回放平台EasyCVR视频融合平台语音对讲配置

国标GB28181视频平台EasyCVR视频融合平台可拓展性强、视频能力灵活&#xff0c;平台可提供视频监控直播、云端录像、云存储、录像检索与回看、智能告警、平台级联、云台控制、语音对讲、智能分析接入等功能。其中&#xff0c;在语音对讲方面&#xff0c;NVR接入录像回放平台目前…

4种鼓励创业创新的方法

随着市场趋于饱和&#xff0c;许多企业&#xff0c;尤其是初创企业&#xff0c;很难在竞争中保持领先地位。技术为企业彻底改变其营销和管理策略铺平了道路。另一个经过实践检验的成功渗透特定市场的方法是在办公室内部激发创新&#xff0c;从员工到品牌皆如此。 那么究竟如何…

【设计模式-原型】

**原型模式&#xff08;Prototype Pattern&#xff09;**是一种创建型设计模式&#xff0c;旨在通过复制现有对象的方式来创建新对象&#xff0c;而不是通过实例化类来创建对象。该模式允许对象通过克隆&#xff08;复制&#xff09;来创建新的实例&#xff0c;因此避免了重新创…

LabVIEW提高开发效率技巧----插入式架构

随着LabVIEW项目规模的扩大和系统复杂性的增加&#xff0c;传统的单一代码架构难以应对后期维护和功能扩展的需求。插入式架构&#xff08;Plug-In Architecture&#xff09;作为一种模块化设计方式&#xff0c;通过动态加载和运行子VI&#xff0c;使系统功能更加灵活、模块化&…

Oracle OCP认证考试考点详解082系列01

题记&#xff1a; 本篇博文是Oracle OCP认证考试考点详解082系列的第一篇&#xff0c;本系列主要讲解Oracle OCP认证考试考点&#xff08;题目&#xff09;&#xff0c;适用于19C/21C,跟着学OCP考试必过。 1. 第一题&#xff1a; 1. 题目 2. 解析及答案 关于Oracle数据库中节…

6.1 特征值介绍

一、特征值和特征向量介绍 本章会开启线性代数的新内容。前面的第一部分是关于 A x b A\boldsymbol x\boldsymbol b Axb&#xff1a;平衡、均衡和稳定状态&#xff1b;现在的第二部分是关于变化的。时间会加入进来 —— 连续时间的微分方程 d u / d t A u \pmb{\textrm{d}…

通过AWS Bedrock探索 Claude 的虚拟桌面魔力:让 AI 代替你动手完成任务!

前言 大家好&#xff0c;昨夜Anthropic 发布了更新。现在 Claude 3.5 Sonnet&#xff08;V2&#xff09; 和 Claude 3.5 Haiku&#xff0c;以及名为 computer use 的新功能已经作为公开测试版发布了。 Introducing computer use, a new Claude 3.5 Sonnet, and Claude 3.5 Ha…

生成对抗网络基本原理

生成对抗网络&#xff08;Generative Adversarial Networks&#xff0c;简称GANs&#xff09;是由Ian Goodfellow等人在2014年提出的一种深度学习模型&#xff0c;它在生成模型领域引起了革命性的变化。GANs的核心思想是通过引入一个对抗过程来生成新的数据样本&#xff0c;这个…

【1024程序员节】MybatisPlus入门(一)MybatisPlus简介

一、MyBatis简介 MyBatisPlus&#xff08;简称MP&#xff09;是基于MyBatis框架基础上开发的增强型工具&#xff0c;旨在简化开发、提高效率 - 官网&#xff1a;https://mybatis.plus/ https://mp.baomidou.com/ MyBatisPlus特性&#xff1a; - 无侵入&#xff1a;只做增强…

接口测试 —— Postman 变量了解一下!

Postman变量是在Postman工具中使用的一种特殊功能&#xff0c;用于存储和管理动态数据。它们可以用于在请求的不同部分、环境或集合之间共享和重复使用值。 Postman变量有以下几种类型&#xff1a; 1、环境变量&#xff08;Environment Variables&#xff09;: 环境变量是在…

C语言程序设计:现代设计方法习题笔记《chapter3》

第一题 ​ 代码示例&#xff1a; #include<stdio.h>int main() {printf("Enter a date&#xff08;mm/dd/yyyy&#xff09;: ");int day, month, year;scanf_s("%d/%d/%d", &month, &day, &year);printf("%04d%02d%02d", yea…

stm32F103 实现呼吸灯效果

目录 硬件连接 软件实现步骤 初始化系统时钟。 配置 GPIO 引脚。 配置定时器以生成 PWM 信号。 在主循环中调整 PWM 占空比以实现呼吸效果。 示例代码 1. 初始化系统时钟 2. 配置 GPIO 引脚 3. 配置定时器以生成 PWM 信号 4. 在主循环中调整 PWM 占空比以实现呼吸效…

【读书笔记-《网络是怎样连接的》- 2】Chapter2_1-协议栈通信详细过程

第二章从协议栈这部分来看网络中的通信如何实现&#xff0c;准备从两部分来进行分解。本篇是第一部分&#xff1a;详细介绍TCP协议栈收发数据的过程。 首先来看下面的图。从应用程序到网卡需要经过如下几部分&#xff0c;上面的部分通过委托下面的部分来完成工作。首先是应用程…

URP学习(一)

URP是unity出的比较简单的可供改造引擎渲染管线的流程。能实现用较低的代价消耗实现较好的效果。 现记录学习&#xff1a; 一.如何设置URP关键 这步结束后材质会被替换 加package Create/Rendering/URP Universal Rendering Setting设置为urp 材质也需要urp目录下的 几种…