hadoop-2.7.1+zookeeper-3.4.8+hbase-1.2.1+apache-hive-2.0.0完全分布式集群

回复 收藏

一、环境准备

1.查看系统版本

cat /etc/issue

CentOS release 6.8 (Final)   

2.软件准备

软件自行官网下载,但自己要统一规划方便后面操作,本文软件源目录/usr/local/src

安装目录/usr/local

赋权限,以备后续步骤安装软件[安装包都在/usr/local/src] 

chown hadoop.hadoop /usr/local/src –R

3.配置主机名和hosts

三台机器(内存大于2G) 分别写hosts、设定hostname

192.168.100.11  mylab1  ----master

192.168.100.12  mylab2  ----slave1

192.168.100.13  mylab3  -----slave2

4.关闭selinux

临时关闭:

[root@mylab1 ~]# getenforce

Enforcing

[root@mylab1 ~]# setenforce 0

[root@mylab1 ~]# getenforce

Permissive

永久关闭selinux:

vim /etc/selinux/config

修改SELINUX=enforcing为SELINUX=disabled

5.关闭防火墙iptables

service iptables stop或/etc/init.d/iptables stop

chkconfig iptables off

6.所有机器同步时间 

ntpdate time.windows.com

注:一定要做,集群对时间要求高,不然后面启动会报错,也可以自己搭建ntp服务器(正常线上肯定是要其中一台搭建时间服务器来同步时间的)

7.创建hadoop用户

Hadoop为了安装使用普通用户登录

useradd hadoop

echo "hadoop"|passwd --stdin hadoop

增加权限:

visudo

hadoop ALL=(ALL)  ALL

8.切换hadoop用户

su - hadoop

9.配置SSH无密码登陆

master可以通过密钥登陆本机和两台slave

master上生成密钥对:

执行ssh-keygen 命令后一直回车

[hadoop@mylab1 ~]$ ssh-keygen

生成.ssh目录

ls .ssh/

id_rsa  id_rsa.pub

复制~/.ssh/id_rsa.pub 内容到本机和两台slave的 ~/.ssh/authorized_keys

设置本机和两台slave机器上的~/.ssh/authorized_keys文件权限为600

chmod 600 ~/.ssh/authorized_keys

cp id_rsa.pub authorized_keys

scp ~/.ssh/authorized_keys hadoop@192.168.100.12:/home/hadoop/.ssh/

scp ~/.ssh/authorized_keys hadoop@192.168.100.13:/home/hadoop/.ssh/

测试:

在master上执行

ssh master

ssh slave1

ssh slave2

可以直接登陆,即实现master免密码登录slave1,slave2

10.创建备用目录

mkdir -pv /usr/local/storage/zookeeper/{data,logs}   #创建zookeeper数据目录和日志目录

11.同步:

由于所有软件,配置文件,环境配置基本相同,所有本文所有操作都可以在一台服务器上操作执行,之后通过rsync,或scp等同步工具,同步到其他服务器,可避免重复性操作,切记,切记,切记

例如:rsync –av /usr/local/storage/  mylab2:/usr/local

二、部署应用

1.安装JAVA环境

先除已有jdk(如果有) rpm -e jdk(之前版本)

安装jdk

 rpm -ivh jdk-7u79-linux-x64.rpm

修改环境变量:vim /home/hadoop/.bashrc

JAVA_HOME=/usr/java/jdk1.7.0_79

JRE_HOME=/usr/java/jdk1.7.0_79/jre

PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib

export JAVA_HOME JRE_HOME PATH CLASSPAT

使环境变量生效:

source /home/hadoop/.bashrc

验证jdk安装成功 

java -version 版本显示为安装版本即正常

#注:所有服务器都要安装jdk

2.安装hadoop2.7

把hadoop安装包解压到每一个节点(可以解压到一个节点,然后完成后续第2步的配置后,再scp拷贝到其余节点)的固定目录下

1.1解压hadoop,并修改用户及用户组为hadoop

cd /usr/local/src/

tar xf hadoop-2.7.1.tar.gz

chown -R hadoop.hadoop hadoop-2.7.1

mv hadoop-2.7.1  /usr/local/hadoop

1.2执行一下命令检查hadoop是否可用

cd /usr/local/hadoop

./bin/hadoop version

查看是否显示hadoop版本信息

Hadoop 2.7.1 显示即正常,否则软件包有问题重新下载。

1.3在hadoop目录下创建如下目录

cd /usr/local/hadoop

mkdir tmp dfs dfs/data dfs/name   

1.4、设置Hadoop环境变量

vim /home/hadoop/.bashrc

JAVA_HOME=/usr/java/jdk1.7.0_79

JRE_HOME=/usr/java/jdk1.7.0_79/jre

PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib

export JAVA_HOME JRE_HOME PATH CLASSPAT

export HADOOP_HOME=/usr/local/hadoop

export HIVE_HOME=/usr/local/hive

export HBASE_HOME=/usr/local/hbase

export ZOOKEEPER=/usr/local/zookeeper

export HADOOP_INSTALL=$HADOOP_HOME

export HADOOP_MAPRED_HOME=$HADOOP_HOME

export HADOOP_COMMON_HOME=$HADOOP_HOME

export HADOOP_HDFS_HOME=$HADOOP_HOME

export YARN_HOME=$HADOOP_HOME

export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native

export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop

export HDFS_CONF_DIR=${HADOOP_HOME}/etc/hadoop

export YARN_CONF_DIR=${HADOOP_HOME}/etc/hadoop

export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HBASE_HOME/bin:$HIVE_HOME/bin:$ZOOKEEPER/bin使环境变量生效

source ~/.bashrc

同步至其他服务器:

例如:

rsync –av /home/hadoop/.bashrc mylab2:/home/hadoop/

1.4、配置文件修改:

集群/分布式模式需要修改 /usr/local/hadoop/etc/hadoop 中的5个配置文件,更多设置项可点击查看官方说明,这里仅设置了正常启动所必须的设置项: slaves、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml

1.1、core-site.xml 

master上 vim /usr/local/hadoop/etc/hadoop/core-site.xml

<configuration>

    <property>

        <name>fs.defaultFS</name>

        <value>hdfs://192.168.100.11:9000</value>

    </property>

    <property>

        <name>hadoop.tmp.dir</name>

        <value>file:/usr/local/hadoop/tmp</value>

    </property>

    <property>

        <name>io.file.buffer.size</name>

        <value>131702</value>

    </property>

<!--指定可以在任何IP访问-->

  <property>

    <name>hadoop.proxyuser.hduser.hosts</name>

    <value>*</value>

  </property>

<!--指定所有用户可以访问-->

  <property>

    <name>hadoop.proxyuser.hduser.groups</name>

    <value>*</value>

  </property>

 <!-- 指定zookeeper地址 -->

  <property>

    <name>ha.zookeeper.quorum</name>

    <value>mylab1:2181,mylab2:2181,mylab3:2181</value>

  </property>

</configuration>

1.2、hdfs-site.xml

dfs.replication 一般设为 3,但我们只有2个 Slave 节点,所以 dfs.replication 的值还是设为 2

master上  vi  /usr/local/hadoop/etc/hadoop/hdfs-site.xml

<configuration>

<!--指定支持高可用自动切换机制--> 

  <property> 

    <name>dfs.ha.automatic-failover.enabled</name> 

    <value>true</value> 

  </property> 

<!--指定namenode名称空间的存储地址--> 

    <property>

        <name>dfs.namenode.name.dir</name>

        <value>file:/usr/local/hadoop/dfs/name</value>

    </property>

<!--指定datanode数据存储地址-->

    <property>

        <name>dfs.datanode.data.dir</name>

        <value>file:/usr/local/hadoop/dfs/data</value>

    </property>

    <property>

        <name>dfs.replication</name>

        <value>2</value>

    </property>

    <property>

        <name>dfs.namenode.secondary.http-address</name>

        <value>192.168.100.11:9001</value>

    </property>

    <property>

    <name>dfs.webhdfs.enabled</name>

    <value>true</value>

    </property>

   <property> 

    <name>ha.zookeeper.quorum</name> 

    <value>mylab1:2181,mylab2:2181,mylab3:2181</value> 

   </property> 

</configuration>

1.3、mapred-site.xml

需要先重命名,默认文件名为 mapred-site.xml.template

master上  vi  /usr/local/hadoop/etc/hadoop/mapred-site.xml

<configuration>

<!-- 配置MapReduce运行于yarn中 --> 

    <property>

        <name>mapreduce.framework.name</name>

        <value>yarn</value>

    </property>

<!-- 配置 MapReduce JobHistory Server 地址 ,默认端口10020 --> 

    <property>

        <name>mapreduce.jobhistory.address</name>

        <value>192.168.100.11:10020</value>

    </property>

<!-- 配置 MapReduce JobHistory Server web ui 地址, 默认端口19888 --> 

    <property>

        <name>mapreduce.jobhistory.webapp.address</name>

        <value>192.168.100.11:19888</value>

    </property>

</configuration>

1.4、yarn-site.xml

master上  vi  /usr/local/hadoop/etc/hadoop/yarn-site.xml

<configuration>

<property>

        <name>yarn.nodemanager.aux-services</name>

        <value>mapreduce_shuffle</value>

    </property>

    <property>

        <name>yarn.nodemanager.auxservices.mapreduce.shuffle.class</name>

        <value>org.apache.hadoop.mapred.ShuffleHandler</value>

    </property>

    <property>

        <name>yarn.resourcemanager.address</name>

        <value>192.168.100.11:8032</value>

    </property>

    <property>

        <name>yarn.resourcemanager.scheduler.address</name>

        <value>192.168.100.11:8030</value>

   </property>

   <property>

        <name>yarn.resourcemanager.resource-tracker.address</name>

        <value>192.168.100.11:8031</value>

    </property>

    <property>

        <name>yarn.resourcemanager.admin.address</name>

        <value>192.168.100.11:8033</value>

    </property>

    <property>

        <name>yarn.resourcemanager.webapp.address</name>

        <value>192.168.100.11:8088</value>

    </property>

    <property> 

         <name>ha.zookeeper.quorum</name> 

    <value>mylab1:2181,mylab2:2181,mylab3:2181</value>  

    </property> 

<!--配置与zookeeper的连接地址-->  

  <property>  

    <name>yarn.resourcemanager.zk-state-store.address</name>  

    <value>mylab1:2181,mylab2:2181,mylab3:2181</value> 

  </property>  

  <property>  

    <name>yarn.resourcemanager.store.class</name>  

    <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>  

  </property>  

  <property> 

    <name>yarn.resourcemanager.zk-address</name> 

    <value>mylab1:2181,mylab2:2181,mylab3:2181</value> 

  </property> 

</configuration>

1.5、 slaves 

文件 slaves,将作为 DataNode 的主机名写入该文件,每行一个,默认为 localhost,所以在伪分布式配置时,节点即作为 NameNode 也作为 DataNode。分布式配置可以保留 localhost,也可以删掉,让 Master 节点仅作为 NameNode 使用。

本教程让 Master 节点仅作为 NameNode 使用,因此将文件中原来的 localhost 删除,添加如下内容ip或数据节点主机名即可:

192.168.100.12  ---slave1

192.168.100.13 ----slave2

1.5、同步

rsync  av /usr/local/hadoop mylab2:/usr/local/

rsync  av /usr/local/hadoop mylab3:/usr/local/

3、Zookeeper集群部署

zookeeper集群搭建要至少3台服务器,所以三台服务器都要部署zookeeper;安装在hadoop用户上

tar xf zookeeper-3.4.6.tar.gz -C /usr/local/

mv /usr/local/zookeeper-3.4.6/ /usr/local/zookeeper

cp zoo_sample.cfg  zoo.cfg

 编辑配置文件

vim zoo.cfg

tickTime=2000

initLimit=5

syncLimit=2

#dataDir=/tmp/zookeeper

dataDir=/usr/local/storage/zookeeper/data

dataLogDir=/usr/local/storage/zookeeper/logs 

clientPort=2181

server.1=mylab1:2888:3888 

server.2=mylab2:2888:3888 

server.3=mylab3:2888:3888

创建zookeeper的数据文件和日志存放目录

mkdir  /usr/local/storage/zookeeper/data  /usr/local/storage/zookeeper/logs 

在三台zookeeper的/usr/local/storage/zookeeper/data目录下分别编辑myid

echo 1 > /usr/local/storage/zookeeper/data/myid

echo 2 > /usr/local/storage/zookeeper/data/myid

echo 3 > /usr/local/storage/zookeeper/data/myid

同步到其他hadoop节点 

scp -r /usr/local/zookeeper  mylab2:/usr/local/

4、部署hbase

tar xf hbase-1.2.1-bin.tar.gz

配置文件修改

regionservers 文件

mylab1

mylab2

mylab3

编辑修改hbase-site.xml文件

<configuration>

<property> 

    <name>hbase.rootdir</name> 

    <value>hdfs://192.168.100.11:9000/hbase</value> 

  </property> 

  <property> 

    <name>hbase.cluster.distributed</name> 

    <value>true</value> 

  </property> 

  <property> 

    <name>hbase.tmp.dir</name> 

    <value>/usr/loca/storage/hbase</value>   

  </property> 

  <property> 

    <name>hbase.zookeeper.quorum</name> 

    <value>mylab1,mylab2,mylab3</value> 

  </property> 

  <property> 

    <name>hbase.zookeeper.property.clientPort</name> 

    <value>2181</value> 

  </property>

 <!--跟zookeeperper配置的dataDir一致--> 

  <property> 

    <name>hbase.zookeeper.property.dataDir</name> 

    <value>/usr/local/storage/zookeeper/data</value> 

  </property>  

</configuration>

禁用hbase自带的zookeeper 

vi /usr/local/hbase/conf/hbase-env.sh 

export HBASE_MANAGES_ZK=false

创建hbase-site.xml配置文件中的hbase目录

mkdir /usr/loca/storage/hbase

同步软件到其他节点

rsync av /usr/local/hbase mylab2:/usr/local/

5、部署hive

cp hive-env.sh.template  hive-env.sh

cp hive-site.xml.template hive-site.xml

编辑配置文件

vim hive-site.xml

<configuration> 

<!--在hdfs上hive数据存放目录,启动hadoop后需要在hdfs上手动创建--> 

  <property>  

    <name>hive.metastore.warehouse.dir</name> 

    <value>hdfs://192.168.100.11:9000/user/hive/warehouse</value> 

  </property> 

<property>

        <name>datanucleus.readOnlyDatastore</name>

        <value>false</value>

    </property>

    <property> 

        <name>datanucleus.fixedDatastore</name>

        <value>false</value> 

    </property>

    <property> 

        <name>datanucleus.autoCreateSchema</name> 

        <value>true</value> 

    </property>

    <property>

        <name>datanucleus.autoCreateTables</name>

        <value>true</value>

    </property>

    <property>

        <name>datanucleus.autoCreateColumns</name>

        <value>true</value>

    </property>

<!--通过jdbc协议连接mysql的hive库--> 

  <property>   

    <name>javax.jdo.option.ConnectionURL</name>   

    <value>jdbc:mysql://192.168.100.11:3306/hive?createDatabaseIfNotExist=true</value>    

  </property> 

<!--jdbc的mysql驱动--> 

  <property>   

    <name>javax.jdo.option.ConnectionDriverName</name>   

    <value>com.mysql.jdbc.Driver</value>    

  </property> 

<!--mysql用户名--> 

  <property>   

    <name>javax.jdo.option.ConnectionUserName</name>   

    <value>hive</value>     

  </property>   

<!--mysql用户密码-->     

  <property>   

    <name>javax.jdo.option.ConnectionPassword</name>   

    <value>hive</value>     

  </property> 

<!--hive的web页面--> 

  <property>  

    <name>hive.hwi.war.file</name> 

    <value>lib/hive-hwi-2.0.0.war</value> 

  </property> 

<!--指定hive元数据访问路径,可以有多个,逗号分隔--> 

<property> 

  <name>hive.metastore.uris</name> 

  <value>thrift://192.168.100.11:9083</value> 

</property> 

<!--hiveserver2的HA--> 

  <property>  

    <name>hive.zookeeper.quorum</name> 

    <value>mylab1,mylab2,mylab3</value> 

  </property> 

</configuration>

添加mysql驱动 

cp /usr/local/src/mysql-connector-java-5.1.38-bin.jar /usr/local/hive/lib/ 

添加hive web页面的war包 

下载hive源码包,apache-hive-2.0.0-src.tar.gz解压进入hwi/web 

jar cvf hive-hwi-2.0.0.war ./* 

cp hive-hwi-2.0.0.war  /usr/local/hive/lib/ 

从hbase/lib下复制必要jar包到hive/lib下 

cp /usr/local/hbase/lib/hbase-client-1.2.1.jar /usr/local/hbase/lib/hbase-common-1.2.1.jar /usr/local/hive/lib 

同步hive和hadoop的jline版本 

cp /usr/local/hive/lib/jline-2.12.jar /usr/local/hadoop/share/hadoop/yarn/lib 

查看版本 

cd /home/hadoop/hadoop/share/hadoop/yarn/lib 

find ./ -name "*jline*jar" 

删除低版本的jline 0.9 

rm jline-0.9.94.jar 

复制jdk的tools.jar到hive/lib下 

cp $JAVA_HOME/lib/tools.jar /usr/local/hive/lib

6、部署mysql

下载集成包解压,安装mysql

MySQL-5.6.33-1.linux_glibc2.5.x86_64.rpm-bundle.tar

配置MySQL登录密码 

cat /root/.mysql_secret 

#获取MySQL安装时生成的随机密码aHoUaEJFav0X7hlG 

service mysql start 

#启动MySQL服务 

mysql -uroot -paHoUaEJFav0X7hlG 

#进入MySQL,使用之前获取的随机密码 

SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123456');   

#在MySQL命令行中设置root账户的密码为123456

创建hive用户,密码hive 

CREATE USER hive IDENTIFIED BY 'hive';  

GRANT ALL PRIVILEGES ON *.* TO 'hive'@'%' WITH GRANT OPTION; 

或:GRANT ALL PRIVILEGES ON *.* TO 'hive'@'%'IDENTIFIED BY 'hive' WITH GRANT OPTION; 

flush privileges; 

用创建的hive用户登录mysql并创建hive库 

mysql -uhive -phive 

create database hive;

#注:此处我的mysql是在主节点部署的

7、启动

Hadoop集群首次启动过程

1.启动zookeeper

如果zookeeper集群还没有启动的话, 首先把各个zookeeper起来。 

/home/hadoop/zookeeper/bin/zkServer.sh start    (记住所有的zookeeper机器都要启动) 

/home/hadoop/zookeeper/bin/zkServer.sh status (1个leader,2个follower) 

输入jps,会显示启动进程:QuorumPeerMain

2、启动hadoop

首次启动需要先在 Master 节点执行 NameNode 的格式化:

/usr/local/hadoop/bin/hdfs namenode -format

显示无报错即为正常

在master上操作即可,两个slave会自动启动

启动服务

/usr/local/hadoop/sbin/start-all.sh

停止服务

/usr/local/hadoop/sbin/stop-all.sh

浏览器访问:

http://192.168.100.11:8088/

http://192.168.100.11:50070

3、启动hbase 

主master节点安装目录下

/bin/start-hbase.sh 

验证安装成功 

hbase shell   ----进入hbase命令行

list            ---输入list命令

hbase(main):001:0> list

TABLE                                                                                                                                

0 row(s) in 0.5530 seconds

=> []

help get 可以查看命令帮助

查看进程为:HMaster,HRegionServer ---主节点为2个

从节点进程为:HRegionServer

通过web UI访问hbase状态

http://192.168.100.11:16010/master-status

4.启动hive 

先在hdfs上创建好hive存储数据的目录 

/bin/hadoop fs -mkdir /tmp 

/bin/hadoop fs -mkdir -p /user/hive/warehouse 

/bin/hadoop fs -chmod g+w /tmp 

/bin/hadoop fs -chmod g+w /user/hive/warehouse

hive 远程服务 (端口号10000) 启动方式[metastore和hiveserver2在同一台上启动即可] 

nohup /usr/local/hive/bin/hive --service metastore &> metastore.log &  

nohup /usr/local/hive/bin/hive --service hiveserver2 &> hiveserver2.log & 

hive 命令行模式 

/home/hadoop/hive/bin/hive 

或者输入 

hive --service cli

查看进程为:2个RunJar

#注:可以在任意一台服务器上启动hive,都可以。

8、查看启动进程

通过命令 jps 可以查看各个节点所启动的进程。正确的话,在 Master 节点上可以看到 NameNode、ResourceManager、SecondrryNameNode进程

Jps

Master上:

29162 RunJar

28442 HMaster

28049 ResourceManager

28999 RunJar

27607 NameNode

29328 Jps

28571 HRegionServer

27448 QuorumPeerMain

27802 SecondaryNameNode

在 Slave 节点可以看到 DataNode 和 NodeManager 进程

Slave上:

30086 RunJar

28962 DataNode

29834 HRegionServer

30245 RunJar

28868 QuorumPeerMain

29075 NodeManager

程序启动成功后可以在任意一台启动hive

可以在启动MR-JobHistory服务,

sbin/mr-jobhistory-daemon.sh start historyserver

Hadoop2 MR-JobHistory服务介绍

1)MR-JobHistory服务目标

主要是向用户提供历史的mapred Job 查询

详细解释:

a)在运行MR Job时,MR 的 ApplicationMaster会根据mapred-site.xml配置文件中的配置,将MR Job的job history信息保存到指定的hdfs路径(首先保存到临时目录,然后mv到最终目录)

b)如果在yarn-site.xml中,没有配置nodemanage的LogAggregation功能,则historyserver无法提供mr日志明细查询的功能(在提交mr job时,yarn和mapred的配置都是必须的)

c)historyserver向外提供两个接口,web接口可以提供jobhistory和明细日志查询的功能,而restApi只提供jobhistory查询的功能

9、测试

hdfs dfs -copyFromLocal ./LICENSE.txt  /123

hdfs dfs -ls  /123

用wordcount分析LICENSE.txt  

bin/hadoop  jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.1.jar wordcount /123/LICENSE.txt /output/123

bin/hdfs dfs -ls /output/123  查看分析后的文件

bin/hdfs dfs -cat /output/123/part-r-00000  查看分析结果

执行分布式实例

首先创建 HDFS 上的用户目录

hdfs dfs -mkdir -p /user/hadoop

将 /usr/local/hadoop/etc/hadoop 中的配置文件作为输入文件复制到分布式文件系统中:

hdfs dfs -mkdir input

hdfs dfs -put /usr/local/hadoop/etc/hadoop/*.xml input

查看input目录下文件

hdfs dfs -ls input

报错总结:

若出现提示 “WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable”,该 WARN 提示可以忽略,不会影响 Hadoop 正常运行(可通过编译 Hadoop 源码解决,解决方法请自行搜索)。

若出现提示 “INFO metrics.MetricsUtil: Unable to obtain hostName java.net.UnknowHostException”,这需要执行如下命令修改 hosts 文件,为你的主机名增加IP映射:

Datanode不能启动

Initialization failed for Block pool <registering> (Datanode Uuid unassigned)

解决方案:

将目录、dfs、name、data清空

是重复启动到时key值不一样

Hmaster消失 ERROR: Can't get master address from ZooKeeper; znode data == null

这个问题这里是由于启动hbase失败造成,主要原因是因为配置文件hbase-site.xml中hdfs端口配置错误导致,帮助文档中使用的是8020,而我的hadoop分布集群用的是9000默认端口,修改配置如下:gedit hbase-site.xml                <property>                        <name>hbase.rootdir</name>                        <value>hdfs://hadoop0:9000/hbase</value>                </property>

参考:http://f.dataguru.cn/thread-519459-1-1.html

2016-09-15 11:14 举报
已邀请:

回复帖子,请先登录注册

退出全屏模式 全屏模式 回复
评分
可选评分理由: