Hadoop99:大数据平台安装部署--CDH6.2版本单机

一、CDH介绍

CDH 是一个拥有集群自动化安装、中心化管理、集群监控、报警功能的一个工具(软件),使得集群的安装可以从几天的时间缩短为几个小时,运维人数也会从数十人降低到几个人,极大的提高了集群管理的效率。

二、本地单机安装测试,资源有限

操作系统:CentOS7.5
内存:8g
硬盘 :80G
cpu:2core

在这里插入图片描述

三、安装包下载

下载地址:

链接:https://pan.baidu.com/s/1udJ5Z0wFWfXPtabsbEsbUg 
提取码:btze 

如下:

在这里插入图片描述

在这里插入图片描述

四、开始部署

1、设置静态ip

https://blog.csdn.net/weixin_40612128/article/details/119007776?spm=1001.2014.3001.5502

我这里设置为192.168.253.132
在这里插入图片描述

2、主机名设置

临时配置+永久配置

https://blog.csdn.net/weixin_40612128/article/details/119008039?spm=1001.2014.3001.5502

我这里设置为cdh01
在这里插入图片描述

3、设置主机名和ip映射关系

vi /etc/hosts

在这里插入图片描述
注意:这里验证一下

ping cdh01

在这里插入图片描述

4、关闭防火墙

临时关闭+永久关闭

https://blog.csdn.net/weixin_40612128/article/details/107575374?spm=1001.2014.3001.5502

5、免密登录

https://blog.csdn.net/weixin_40612128/article/details/119008155?spm=1001.2014.3001.5502

6、搭建ntp时间服务器

注:单机部署,无所谓可以不搭,一般集群部署需要搭建。

yum -y install ntp
vi /etc/ntp.conf


将下面这四行内容注释掉
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst

然后增加一行内容
server ntp.aliyun.com

在这里插入图片描述

7、启动ntp服务

service ntpd start

添加到开机启动项里面

systemctl enable ntpd.service

配置好了以后查看验证一下当前同步的时间服务器

注意:需要等5~10分钟才能看到类似下面的结果,显示出来下面这种结果的时候才说明是真正成功了,如果看不到这样的效果,需要等一会再来查看。

ntpq -p 

在这里插入图片描述

8、安装jdk

使用cdh提供的jdk
官方下载地址:

https://archive.cloudera.com/cm6/6.2.1/redhat7/yum/RPMS/x86_64/oracle-j2sdk1.8-1.8.0+update181-1.x86_64.rpm

百度网盘已经提供了:
在这里插入图片描述
上传到/opt目录下
在这里插入图片描述
安装jdk

rpm -ivh oracle-j2sdk1.8-1.8.0+update181-1.x86_64.rpm

配置jdk环境变量,/etc/profile文件末尾增加下面内容

vi /etc/profile

export JAVA_HOME=/usr/java/jdk1.8.0_181-cloudera
export PATH=.:$PATH:$JAVA_HOME/bin

重新加载环境变量

source /etc/profile

验证是否安装成功

java -version

在这里插入图片描述

9、安装mysql

卸载原生的mariadb

[root@cdh01 opt]# rpm -qa|grep mariadb                              
mariadb-libs-5.5.64-1.el7.x86_64
[root@cdh01 opt]# rpm -e --nodeps mariadb-libs-5.5.64-1.el7.x86_64

将MySQL安装包上传到cdh01的/opt目录中
本文提供的百度网盘下载链接中也有这个文件,前面已经下载过了。

[root@cdh01 opt]# ll
-rw-r--r--. 1 root root  541163520 Oct 27 16:04 mysql-5.7.31-1.el7.x86_64.rpm-bundle.tar

解压MySQL安装包

[root@cdh01 opt]# tar -xvf mysql-5.7.31-1.el7.x86_64.rpm-bundle.tar 

安装MySQL

[root@cdh01 opt]# rpm -ivh mysql-community-common-5.7.31-1.el7.x86_64.rpm --force --nodeps
[root@cdh01 opt]# rpm -ivh mysql-community-libs-5.7.31-1.el7.x86_64.rpm --force --nodeps
[root@cdh01 opt]# rpm -ivh mysql-community-client-5.7.31-1.el7.x86_64.rpm --force --nodeps
[root@cdh01 opt]# rpm -ivh mysql-community-server-5.7.31-1.el7.x86_64.rpm --force --nodeps
[root@cdh01 opt]# rpm -ivh mysql-community-libs-compat-5.7.31-1.el7.x86_64.rpm --force --nodeps

下面开始配置MySQL
先初始化MySQL

[root@cdh01 opt]# mysqld --initialize --user=mysql

获取MySQL生成的随机密码,在文件/var/log/mysqld.log的最后一行

[root@cdh01 opt]# cat /var/log/mysqld.log | tail -1
2020-10-28T11:51:25.902353Z 1 [Note] A temporary password is generated for root@localhost: Z+W(z1V%cii=

设置MySQL服务开机启动

[root@cdh01 opt]# systemctl start mysqld.service

重启一下MySQL服务,否则连不上去

[root@cdh01 opt]# systemctl restart mysqld

连接MySQL,修改密码【不修改密码无法使用】
注意:alter user user() identified by “admin”;表示将root用户的密码设置为admin。

[root@cdh01 opt]# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.7.31

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> alter user user() identified by "admin";
Query OK, 0 rows affected (0.01 sec)

在MySQL中创建数据库,后面会用到这些库。

mysql> create database cmserver default charset utf8 collate utf8_general_ci;
Query OK, 1 row affected (0.00 sec)

mysql> grant all on cmserver.* to 'root'@'%' identified by 'admin';
Query OK, 0 rows affected, 1 warning (0.00 sec)
 
mysql> create database metastore default charset utf8 collate utf8_general_ci;
Query OK, 1 row affected (0.01 sec)

mysql> grant all on metastore.* to 'root'@'%' identified by 'admin';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> create database rman default charset utf8 collate utf8_general_ci;
Query OK, 1 row affected (0.00 sec)

mysql> grant all on rman.* to 'root'@'%' identified by 'admin';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> create database oozie default charset utf8 collate utf8_general_ci;
Query OK, 1 row affected (0.00 sec)

mysql> grant all on oozie.* to 'root'@'%' identified by 'admin';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> create database hue default charset utf8 collate utf8_general_ci;
Query OK, 1 row affected (0.00 sec)

mysql> grant all on hue.* to 'root'@'%' identified by 'admin';
Query OK, 0 rows affected, 1 warning (0.00 sec)

创建/usr/share/java目录,将mysql的connector驱动jar包上传到里面

[root@cdh01 ~]# mkdir -p /usr/share/java

将mysql的connector驱动jar包上传到集群内所有节点的/usr/share/java目录中

本文提供的百度网盘下载链接中也有这个jar包,前面已经下载过了。
在这里插入图片描述

[root@cdh01 java]# ll
total 4348
-rw-r--r--. 1 root root 1007502 Aug  7  2018 mysql-connector-java-5.1.47.jar
[root@cdh01 java]# mv mysql-connector-java-5.1.47.jar mysql-connector-java.jar

10、安装Httpd服务

使用yum在线安装httpd

[root@cdh01 opt]# yum -y install httpd

启动httpd服务

[root@cdh01 opt]# systemctl start httpd

添加到开启启动项中

[root@cdh01 opt]# systemctl enable httpd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

11、配置Cloudera Manager包

创建目录

mkdir -p /var/www/html/cloudera-repos/cm6

将Cloudera Manager的相关文件上传到/var/www/html/cloudera-repos/cm6目录中
在这里插入图片描述
Cloudera Manager的相关文件下载地址:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这些文件最终的整理版在本文提供的百度网盘下载链接中也有,前面已经下载过了。
上传成功之后的效果如下:

[root@cdh01 cm6]# pwd
/var/www/html/cloudera-repos/cm6
[root@cdh01 cm6]# ll
total 1181624
-rw-r--r--. 1 root root      14041 Oct 26 17:08 allkeys.asc
-rw-r--r--. 1 root root   10215608 Oct 26 17:08 cloudera-manager-agent-6.2.1-1426065.el7.x86_64.rpm
-rw-r--r--. 1 root root 1199718256 Oct 26 18:46 cloudera-manager-daemons-6.2.1-1426065.el7.x86_64.rpm
-rw-r--r--. 1 root root       9988 Oct 26 17:07 cloudera-manager-server-6.2.1-1426065.el7.x86_64.rpm
-rw-r--r--. 1 root root      10996 Oct 26 17:08 cloudera-manager-server-db-2-6.2.1-1426065.el7.x86_64.rpm
-rw-r--r--. 1 root root       1718 Oct 27 17:41 RPM-GPG-KEY-cloudera

下载createrepo

在这里插入图片描述
官方下载地址:

http://www.rpmfind.net/linux/rpm2html/search.php?query=createrepo

本文提供的百度网盘下载链接中也有这个文件,前面已经下载过了。
在这里插入图片描述

将下载的createrepo-0.9.9-28.el7.noarch.rpm上传到/opt目录中

[root@cdh01 opt]# ll
-rw-r--r--. 1 root root      95840 Oct 27 16:55 createrepo-0.9.9-28.el7.noarch.rpm

安装createrepo

[root@cdh01 opt]# rpm -ivh createrepo-0.9.9-28.el7.noarch.rpm  --force --nodeps

下载deltarpm【在后面创建repodata的时候会提示缺少这个module】

官方下载地址:

http://mirror.centos.org/centos/7/os/x86_64/Packages/python-deltarpm-3.6-3.el7.x86_64.rpm

本文提供的百度网盘下载链接中也有这个文件,前面已经下载过了。
在这里插入图片描述

将下载好的python-deltarpm-3.6-3.el7.x86_64.rpm上传到/opt目录中

[root@cdh01 opt]# ll
-rw-r--r--. 1 root root      32084 Oct 27 17:07 python-deltarpm-3.6-3.el7.x86_64.rpm

安装deltarpm

[root@cdh01 opt]# rpm -ivh python-deltarpm-3.6-3.el7.x86_64.rpm --force --nodeps

创建repodata

[root@cdh01 cm6]# createrepo .
Spawning worker 0 with 1 pkgs
Spawning worker 1 with 1 pkgs
Spawning worker 2 with 1 pkgs
Spawning worker 3 with 1 pkgs
Spawning worker 4 with 0 pkgs
Spawning worker 5 with 0 pkgs
Spawning worker 6 with 0 pkgs
Spawning worker 7 with 0 pkgs
Workers Finished
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete

注意:repodata创建成功之后,会在cm6目录下看到一个新创建的repodata目录

此时cm6目录中的内容如下:

[root@cdh01 cm6]# ll
total 1181628
-rw-r--r--. 1 root root      14041 Oct 26 17:08 allkeys.asc
-rw-r--r--. 1 root root   10215608 Oct 26 17:08 cloudera-manager-agent-6.2.1-1426065.el7.x86_64.rpm
-rw-r--r--. 1 root root 1199718256 Oct 26 18:46 cloudera-manager-daemons-6.2.1-1426065.el7.x86_64.rpm
-rw-r--r--. 1 root root       9988 Oct 26 17:07 cloudera-manager-server-6.2.1-1426065.el7.x86_64.rpm
-rw-r--r--. 1 root root      10996 Oct 26 17:08 cloudera-manager-server-db-2-6.2.1-1426065.el7.x86_64.rpm
drwxr-xr-x. 2 root root       4096 Oct 28 21:02 repodata
-rw-r--r--. 1 root root       1718 Oct 27 17:41 RPM-GPG-KEY-cloudera

12、添加新配置的yum源

添加yum源

[root@cdh01 ~]# vi /etc/yum.repos.d/cloudera-manager.repo
[cloudera-manager]
name = Cloudera Manager,Version
baseurl = http://cdh01/cloudera-repos/cm6
gpgcheck = 1

清除yum缓存

[root@cdh01 ~]# yum clean all
[root@cdh01 ~]# yum makecache

注意:要确保配置中baseurl 对应的url是可以访问的,主机名

http://cdh01/cloudera-repos/cm6/
在这里插入图片描述

如果windows中没有配置主机名和ip的映射关系,在windows中的浏览器里面访问的时候需要使用ip

http://192.168.253.132/cloudera-repos/cm6/

在这里插入图片描述
注:windows主机名ip映射配置,这里配置完成,就可以使用主机名访问了。
在这里插入图片描述
在这里插入图片描述

13、安装 Cloudera Manager相关服务

Cloudera Manager简称为cm
想要安装CDH集群,需要先安装cm,然后在cm提供的web界面上安装CDH集群,比较方便。
注意:在安装之前,先执行这个命令,否则在安装cm相关服务的时候会报错

[root@cdh01 ~]# rpm --import http://cdh01/cloudera-repos/cm6/RPM-GPG-KEY-cloudera 

安装 cloudera-manager-daemons cloudera-manager-agent cloudera-manager-server这3个服务

[root@cdh01 ~]# yum -y install cloudera-manager-daemons cloudera-manager-agent cloudera-manager-server

上传cdh安装包到节点上

安装完cm之后,在/opt/目录下会出现cloudera目录
将cdh的安装包CDH-6.2.1-1.cdh6.2.1.p0.1425774-el7.parcel上传到/opt/cloudera/parcel-repo目录中。
在这里插入图片描述
cdh安装包官方下载地址:
https://archive.cloudera.com/cdh6/6.2.1/parcels/CDH-6.2.1-1.cdh6.2.1.p0.1425774-el7.parcel

本文提供的百度网盘下载链接中也有这个文件,前面已经下载过了。
在这里插入图片描述

首先将CDH安装包上传到cdh01节点的/opt/cloudera/parcel-repo目录中

[root@cdh01 parcel-repo]# ll
-rw-r--r--. 1 root root 54279162 Oct 28 21:48 CDH-6.2.1-1.cdh6.2.1.p0.1425774-el7.parcel

生成sha文件

[root@cdh01 parcel-repo]# sha1sum CDH-6.2.1-1.cdh6.2.1.p0.1425774-el7.parcel | awk '{print $1}' > CDH-6.2.1-1.cdh6.2.1.p0.1425774-el7.parcel.sha

14、启动cm+安装cdh

初始化cm

[root@cdh01 ~]# /opt/cloudera/cm/schema/scm_prepare_database.sh mysql cmserver root admin

启动cm

[root@cdh01 ~]# service cloudera-scm-server start

稍后几分钟(5~10分钟),就可以打开cm的管理界面了,端口是7180。

http://cdh01:7180
http://192.168.253.132:7180/

安装cdh集群
注意:在windows中没有配置cdh01主机名和ip映射关系的话,就需要使用ip访问了
我在这里就使用ip访问了

http://cdh01:7180
http://192.168.253.132:7180/

在这里插入图片描述
用户名和密码都是admin
登录进来之后是这样的,点击继续
在这里插入图片描述
选中按钮,点击继续
在这里插入图片描述
使用默认的试用版即可,点击继续
在这里插入图片描述
需要稍等一会,会进入到下面界面,直接点击继续
在这里插入图片描述
可以选择修改集群名称,也可以使用默认的,然后点击继续
在这里插入图片描述
输入集群中的所有节点主机名
在这里插入图片描述
点击搜索按钮
在这里插入图片描述
选中所有主机,点击继续

在这里插入图片描述
输入自定义存储库,确认CDH版本为6.2.1
在这里插入图片描述
点击继续
在这里插入图片描述
直接点击继续即可,不用选中,因为jdk我们前面已经安装好了
在这里插入图片描述
输入集群中节点的密码,然后点击继续
在这里插入图片描述
然后会进入到cm Agent安装界面,需要稍等一会,5~10分钟。
在这里插入图片描述
cm Agent安装成功之后是这样的,点击继续按钮

在这里插入图片描述
此时会进入到CDH安装界面,需要稍等一会,10~20分钟

在这里插入图片描述
全部安装成功之后是这样的,点击继续按钮
在这里插入图片描述
点击这两个高级选项,开始检测
在这里插入图片描述
检查第一个结果
在这里插入图片描述

检查第二个结果
在这里插入图片描述
在这里插入图片描述

在cdh01节点上操作

[root@cdh01 ~]# sysctl vm.swappiness=10
[root@cdh01~]# echo 'vm.swappiness=10'>> /etc/sysctl.conf
[root@cdh01 ~]# echo never > /sys/kernel/mm/transparent_hugepage/defrag
[root@cdh01 ~]# echo never > /sys/kernel/mm/transparent_hugepage/enabled
[root@cdh01 parcel-repo]# vi /etc/rc.local
# 将下面这两行配置添加到文件末尾即可
echo never > /sys/kernel/mm/transparent_hugepage/defrag
echo never > /sys/kernel/mm/transparent_hugepage/enabled

修改完毕以后,点击重新运行,重新检测

在这里插入图片描述
重新检测之后第二个就没有问题了,然后选中第三个选项,点击继续按钮

在这里插入图片描述
选择适合自己的方案
在这里插入图片描述
点击继续按钮
在这里插入图片描述
cdh会自动进行角色分配,将刚才选择的大数据组件安装到集群的不同节点上。
注意:前期不是很熟悉的情况下,建议使用自动分配的方式即可,这里什么都不要修改。

在这里插入图片描述
点击继续按钮

在这里插入图片描述
在这里输入数据库名称,用户名、密码,然后点击 测试连接 按钮,测试成功的话,在每一行的最后面都会显示Successful,如果有问题,会显示具体的错误信息。
这些数据库我们在前面安装mysql的时候已经提前创建好了。

在这里插入图片描述
点击继续按钮
在这里插入图片描述
默认在这里不需要改什么东西

在这里插入图片描述
直接点击继续按钮即可
在这里插入图片描述
等待启动集群内大数据组件的服务,大致需要10~20分钟
在这里插入图片描述
服务启动成功之后是这样的,如果有红色的报错提示,可以点进去查看详细报错信息。
在这里插入图片描述
点击继续按钮
在这里插入图片描述

点击完成按钮,到此为止,CDH安装成功。

在这里插入图片描述

15、管理cdh集群

此时再访问cm的7180端口就会看到这个界面了。
在这里插入图片描述
界面中会显示黄色的警告信息和红色的安全隐患
关于黄色的警告信息可以动态观察,暂时不处理也是没问题的。
但是红色的安全隐患建议解决一下。

此时集群中有一条红色的重要问题信息
在这里插入图片描述
可以直接点击红色的感叹号查看问题详细信息。
在这里插入图片描述
这里面其实还有一个黄色的警告信息,这个是针对hdfs的纠删码机制的警告。
首先解决这个问题:
Erasure Coding Policy Verification Test
这个是hadoop3.0中的新特性(hdfs的存储策略),纠删码机制,可以节省HDFS的存储空间,不过至少需要有9个datanode才可以,目前我们这个集群只有2个datanode,所以不能使用这种策略。

在这里插入图片描述
修改hdfs的存储策略
在这里插入图片描述
选择No Default Erasure Coding Policy.这种策略,表示不使用纠删码机制,点击保存更改。
在这里插入图片描述
然后,去掉针对纠删码的检测

在这里插入图片描述
取消选中状态,点击保存更改。
在这里插入图片描述
此时,这个页面就不显示隐患信息了。
在这里插入图片描述
点击首页链接,回到首页
在这里插入图片描述
接着继续来解决这个安全隐患,点击这个红色感叹号
在这里插入图片描述
进入这个界面,点击查看详细解释
在这里插入图片描述
这里提示的是hdfs中block块的副本数不足,其实是因为现在hdfs中的数据默认需要存储3份,但是我们这个集群之后2个datanode,如果再多一个datanode节点就不会有这个问题,不过也不影响使用,如果大家在搭建的时候集群内的机器足够多的话是不会出现这个安全隐患的提示的。
在这里插入图片描述
针对CDH集群,如果我们想修改某一个组件的参数该如何修改了?
以hdfs组件为例,由于目前集群内只有2个datanode,那么我希望将副本的数量修改为2

如何修改了?先回到首页
在这里插入图片描述
进入hdfs的配置界面
在这里插入图片描述
输入关键词进行搜索
在这里插入图片描述
将副本因子改为2,点击保存更改按钮
在这里插入图片描述
改完配置之后,想要生效需要重新启动,此时页面也提示了,需要重启
可以选择只重启某一个组件(点击组件后面的按钮,在弹出框中选择重启),
或者全部重启(点击cluster1 右边的按钮,在弹出框中选择重启)。
在这里插入图片描述
在这里我们选择全部重启,因为大部分组件都提示需要重启读取最新的配置。
在这里插入图片描述
确认重启
在这里插入图片描述
等待集群重启
在这里插入图片描述
重启成功之后发现,这里还有一些提示,需要我们重新部署客户端配置
在这里插入图片描述
先点击HDFS后面的按钮
在这里插入图片描述
点击右下角的 部署客户端配置按钮
在这里插入图片描述
接着进入部署页面
在这里插入图片描述
部署成功之后点击完成按钮即可

在这里插入图片描述
然后可以跳转到首页,此时会发现就不显示那个蓝色的按钮了。
在这里插入图片描述
如果感觉这个红色的感叹号比较别扭,可以选择忽略这个问题,因为我们知道是什么原因造成的。
点击红色感叹号,然后点击suppress

在这里插入图片描述
在弹出的界面中点击确认即可
在这里插入图片描述
此时再回到首页,刷新几次页面,这个红色的感叹号就会消失了。
在这里插入图片描述
目前首页还显示的有一些黄色的警告信息,都是一些关于jvm内存配置的警告信息,根据提示去修改即可。

16、使用cdh集群中的hdfs

不管是使用apache官方的hadoop安装的hdfs,还是使用cdh集群安装的hdfs,操作都是一样的。
此时我们进入到cdh01节点中,操作一下hdfs

[root@cdh01 ~]# hdfs dfs -ls /
Found 2 items
drwxrwxrwt   - hdfs supergroup          0 2020-10-28 23:13 /tmp
drwxr-xr-x   - hdfs supergroup          0 2020-10-28 23:13 /user

创建文件夹

[root@cdh01 ~]# hdfs dfs -mkdir /data
mkdir: Permission denied: user=root, access=WRITE, inode="/":hdfs:supergroup:drwxr-xr-x

提示权限问题,创建失败。
CDH环境下Hadoop平台最高权限用户是hdfs,属于supergroup组。
默认HDFS会开启权限认证,所以操作时,需要将root用户切换到hdfs用户,否则会报错。
这样操作就可以了

[root@cdh01 ~]# sudo -uhdfs hdfs dfs -mkdir /data
[root@cdh01 ~]# hdfs dfs -ls /
Found 3 items
drwxr-xr-x   - hdfs supergroup          0 2020-10-29 00:10 /data
drwxrwxrwt   - hdfs supergroup          0 2020-10-28 23:13 /tmp
drwxr-xr-x   - hdfs supergroup          0 2020-10-28 23:13 /user

这样每次操作都需要切换不太方便,如yarn在调度时,通常会生成一些临时文件,执行完毕会删除,如果权限不够会导致出错。Hive和HBase读写hdfs,也很容易因为权限问题导致出错。但是关闭权限检查,任何用户都可以操作HDFS数据,数据安全性又没有保障,所以使用将用户添加到supergroup组的方式。
通常会把 root 或者需要的用户添加到 supergroup组,但Linux下默认是没有supergroup组。所以,先在Linux添加supergroup组,把root用户添加到supergroup里,再同步权限到HDFS。

17、停止cm和cdh集群

想要停止整个集群的话,可以分为两步
1:先停止cdh集群
2:再停止cm
分别点击对应按钮中的停止链接即可。

在这里插入图片描述

18、启动cm和cdh集群

想要启动整个集群的话,可以分为两步
1:先启动cm
2:再启动cdh集群
分别点击对应按钮中的启动链接即可。

在这里插入图片描述


版权声明:本文为weixin_40612128原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。