三台CentOS7.6虚拟机搭建Hadoop完全分布式集群(三)

这个是笔者大学时期的大数据课程使用三台CentOS7.6虚拟机搭建完全分布式集群的案例,已成功搭建完全分布式集群,并测试跑实例。

9 安装hbase

温馨提示:安装hbase先在master主节点上配置,然后远程复制到slave01或slave02 ,在配置环境即可。

9.1 解压并配置环境变量

9.1.1 解压安装包
1)使用WinSCP将hbase-2.2.2-bin.tar.gz的压缩包从windows系统传至master主节点机器上,并放置在/opt/software目录中,同时创建 /usr/hbase目录,后续将hbase-2.2.2-bin.tar.gz的压缩包解压到/usr/hbase即可。

2)在usr下创建hbase文件夹
mkdir -p /usr/hbase

3)将放置在/opt/software目录中hbase-2.2.2-bin.tar.gz解压到/usr/hbase目录下

tar --zxvf /opt/software/hbase-2.2.2-bin.tar.gz -C /usr/hbase

9.1.2 修改配置文件hbase-env.sh

1)先进入hbase配置目录conf
cd /usr/hbase/hbase-2.2.2/conf
2)修改配置文件hbase-env.sh
vim hbase-env.sh

3)并修改文件内容:

export HBASE_MANAGES_ZK=false
export JAVA_HOME=/usr/java/jdk1.8.0_162
export HBASE_CLASSPATH=/usr/hadoop/hadoop-2.7.3/etc/hadoop

注:
一个分布式运行的Hbase依赖一个zookeeper集群。所有的节点和客户端都必须能够访问zookeeper。默认的情况下Hbase会管理一个zookeep集群,即Hbase默认自带一个zookeep集群。这个集群会随着Hbase的启动而启动。而在实际的商业项目中通常自己管理一个zookeeper集群更便于优化配置提高集群工作效率,但需要配置Hbase。需要修改conf/hbase-env.sh里面的HBASE_MANAGES_ZK 来切换。这个值默认是true的,作用是让Hbase启动的时候同时也启动zookeeper.在本实验中,我们采用独立运行zookeeper集群的方式,故将其属性值改为false。

9.1.3 修改配置文件vim hbase-site.xml

xml 复制代码
<property>
  <name>hbase.rootdir</name>
  <value>hdfs://LBJ:9000/hbase</value>
</property>
<property>
  <name>hbase.cluster.distributed</name>
  <value>true</value>
</property>
<property>
  <name>hbase.master</name>
  <value>hdfs://LBJ:6000</value>
</property>
<property>
  <name>hbase.zookeeper.quorum</name>
  <value>LBJ,slave01,slave02</value>
</property>
<property>
  <name>hbase.zookeeper.property.dataDir</name>
  <value>/usr/zookeeper/zookeeper-3.4.10</value>
</property>

注:
要想运行完全分布式模式,加一个属性 hbase.cluster.distributed 设置为 true 然后把 hbase.rootdir 设置为HDFS的NameNode的位置;
hbase.rootdir:这个目录是region server的共享目录,用来持久化Hbase。URL需要是'完全正确'的,还要包含文件系统的scheme;hbase.cluster.distributed :Hbase的运行模式。false是单机模式,true是分布式模式。若为false,Hbase和Zookeeper会运行在同一个JVM里面。在hbase-site.xml配置zookeeper,当Hbase管理zookeeper的时候,你可以通过修改zoo.cfg来配置zookeeper,对于zookeepr的配置,你至少要在 hbase-site.xml中列出zookeepr的ensemble servers,具体的字段是 hbase.zookeeper.quorum.在这里列出Zookeeper集群的地址列表,用逗号分割。
hbase.zookeeper.property.clientPort:ZooKeeper的zoo.conf中的配置,客户端连接的端口。hbase.zookeeper.property.dataDir:ZooKeeper的zoo.conf中的配置。对于独立的Zookeeper,要指明Zookeeper的host和端口。需要在 hbase-site.xml中设置。

9.1.4 修改配置文件conf/regionservers

vim regionservers

将里面修改为:两个从节点名称
slave01
Slave02

9.1.5 hadoop配置文件拷入hbase的目录下

hadoop配置文件拷入hbase的目录下(当前目录为/usr/hbase/hbase-2.2.2/conf)
cp /usr/hadoop/hadoop-2.7.3/etc/hadoop/hdfs-site.xml /usr/hbase/hbase-2.2.2/conf
cp /usr/hadoop/hadoop-2.7.3/etc/hadoop/core-site.xml /usr/hbase/hbase-2.2.2/conf

9.2 分发hbase到子节点并配置环境

9.2.1 分发hbase到子节点

scp -r /usr/hbase root@slave01:/usr/
scp -r /usr/hbase root@slave02:/usr/

9.2.2 子节点配置hbase环境(三台机器都需配置)

vim /etc/profile

需要配置Hbase环境变量 :

#hbase
export HBASE_HOME=/usr/hbase/hbase-2.2.2
export PATH=$PATH:$HBASE_HOME/bin

是配置生效:source /etc/profile

在master上:

在slave01上:

在slave02上:

9.3 运行和测试(在master上执行并保证hadoop和zookeeper已开启)

在/usr/hbaes/hbase-2.2.2目录下,cd /usr/hbaes/hbase-2.2.2/
bin/start-hbase.sh #开启hbase
jps
在master上

在slave01上

在slave02上

9.4 shell操作

9.4.1 进入shell界面

在/usr/hbaes/hbase-2.2.2目录下:cd /usr/hbaes/hbase-2.2.2/

bin/hbase shell

1)在HBase中用create命令创建表:
create 'student','Sname','Ssex','Sage','Sdept','course'

2)此时,即创建了一个"student"表,属性有:Sname,Ssex,Sage,Sdept,course。因为HBase的表中会有一个系统默认的属性作为行键,无需自行创建,默认为put命令操作中表名后第一个数据。创建完"student"表后,可通过describe命令查看"student"表的基本信息。
describe 'student'

9.4.2 hbase数据库基本操作

温馨提示:

在添加数据时,HBase会自动为添加的数据添加一个时间戳,故在需要修改数据时,只需直接添加数据,HBase即会生成一个新的版本,从而完成"改"操作,旧的版本依旧保留,系统会定时回收垃圾数据,只留下最新的几个版本,保存的版本数可以在创建表的时候指定。

1)添加数据

注:HBase中用put命令添加数据,注意:一次只能为一个表的一行数据的一个列,也就是一个单元格添加一个数据。

当运行命令:put 'student','95001','Sname','LiYing'时,即为student表添加了学号为95001,名字为LiYing的一行数据,其行键为95001。
put 'student','95001','Sname','LiYing'

put 'student','95001','course:math','90'

即为95001行下的course列族的math列添加了一个数据。

2)删除数据

delete:用于删除一个数据,是put的反向操作。

deleteall:操作用于删除一行数据

①delete:

delete 'student','95001','Ssex'

即删除了student表中95001行下的Ssex列的所有数据

②deleteall:

先put 'student','110','Sname','LBJ'

再deleteall 'student','110'

3)查看数据

get:用于查看表的某一行数据。

scan:用于查看某个表的全部数据。

①get:

get 'student','110'

②scan:

scan 'student'

4)删除表格

删除表有两步,第一步先让该表不可用,第二步删除表。

disable 'student'

drop 'student'

9.4.3 hbase数据库查询表历史数据
1)在创建表格时,指定保存的版本数(这里假设指定为5)
create 'teacher',{NAME=>'username',VERSIONS=>5}

2)插入数据然后更新数据,使其产生历史版本数据,用put命令插入数据和更新数据

put 'teacher','91001','username','LBJ'

put 'teacher','91001','username','AD'

put 'teacher','91001','username','GUI'

put 'teacher','91001','username','Melo'

put 'teacher','91001','username','KD'

put 'teacher','91001','username','Harden'

3)查询时,指定查询的历史版本数。默认会查询出最新的数据。(有效取值为1到5)

get 'teacher','91001',{COLUMN=>'username',VERSIONS=>5}

注:由于value为LBJ的数据最先插入,查询的数据有效取值为1~5,所以没有value为LBJ的数据。

9.4.4 退出hbase数据库

注:先退出shell命令界面,用exit退出。退出shell命令界面后,才能关闭hbase。

exit

关闭hbase:bin/stop-hbase.sh

10 安装hive

注:选用hive的远程模式,slave02安装mysql server用于存放元数据,slave01作为hive server作为thrift 服务器,master作为client客户端进行操作。

10.1 在slave02上安装MySQL server

1)查找yum源中是否有MySQL:
yum list | grep mysql

2)下载mysql的repo源:
wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm

3)安装mysql-community-release-el7-5.noarch.rpm包:
sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm

注:安装这个包后,就会获得两个mysql的yum repo源,如下:

4)安装mysql
sudo yum install mysql-server



5)查看mysqld服务是否开启
①查看mysqld服务
sudo service mysqld status

systemctl daemon-reload #重新加载某服务配置文件(包括Mysql)
service mysql start #开启mysql
systemctl enable mysqld #开启"mysqld"后再设置其开机自启,可不做
sudo netstat -tap | grep mysql #查看mysql的开放的端口

结果:发现还没有全部开启

⑤开放所有端口,以便远程连接。

在/etc/目录下找到my.cnf文件
vim my.cnf

在文件中添加:
bind-address = 0.0.0.0

所有端口开启成功:

安装成功
systemctl status mysql #验证"mysql.service"服务器正在运行

6)重新设置mysql密码

①将本地密码设置成:123456
mysqladmin -u root password '123456'

第一次设置都可以成功,如果不能成功设置,可以参考一下的步骤:

my.cnf文件中加入:skip-grant-tables #即可实现免密码登录

然后在mysql中修改密码即可:

修改成功:

不要忘记把skip-grant-tables删除:

②首先删除之前的root账户,然后建立可本机且远程访问的root
show databases;
use mysql;
select user,host, authentication_string from user;

注:

每个人的root用户不同,有的没有,有的可能 'root'@'localhost' 按自己情况删除
drop user 'root'@'localhost';
select user,host,authentication_string from user;

显示root已被删除

create user 'root'@'localhost' identified by '123456';

允许远程连接:

grant all privileges on . to 'root'@'localhost' identified by 'root' with grant option;

flush privileges;

由于远程连接可能会失败,所以建议把localhost改为:%:

允许远程连接:

grant all privileges on . to 'root'@'%' identified by 'root' with grant option;

并将登录密码改为:root

在终端中使用"root"用户和新设置的密码登入MySql即可,命令如下:
mysql -u root --p

更多修改登录密码的操作,可以参考:Mysql初始化root密码和允许远程访问 - 敏捷的水 - 博客园 (cnblogs.com)

本机mysql使用账号和密码:

③成功安装MySql数据库后,需要确保部署数据库的服务器上的3306端口已经开启,且可以使用数据库连接软件远程访问MySql数据库。

使用以下命令查看3306端口情况:
netstat -ntpl |grep 3306

3306端口成功侦听了全部地址

7)远程连接登录mysql测试:

最好使用navcat等远程连接mysql工具

ip:为机器的ip名。

8)用root登入mysql创建元数据库hive

create database hive;
show databases;
exit #退出mysql,仅退出,未关服务

10.2 在master和slave01上安装hive

1)使用WinSCP将apache-hive-2.1.1-bin.tar.gz的压缩包从windows系统传至master主节点机器上,并放置在/opt/software目录中,同时创建 /usr/hive目录,后续将apache-hive-2.1.1-bin.tar.gz的压缩包解压到/usr/hive即可。

cp /home/hadoop/tmp/apache-hive-2.1.1-bin.tar.gz /opt/software

2)在master上创建hive目录,并解压hive安装包
mkdir -p /usr/hive
cd /usr/hive

解压到:/usr/hive/下
tar -zxvf /opt/software/apache-hive-2.1.1-bin.tar.gz -C /usr/hive/

3)同时需要一些联机操作,在slave01上建立文件夹/usr/hive,然后在master中将安装包远程复制到slave1。
mkdir -p /usr/hive
scp -r /usr/hive/apache-hive-2.1.1-bin root@slave01:/usr/hive/

10.3 在master和slave01上配置hive的环境

修改/etc/profile文件设置hive环境变量。(master和slave1都执行)
vim /etc/profile
#hive
export HIVE_HOME=/usr/hive/apache-hive-2.1.1-bin
export PATH=$PATH:$HIVE_HOME/bin

并生效: source /etc/profile
在master上:

在slave01上:

10.4 解决版本冲突和jar包依赖问题

由于客户端需要和hadoop通信,所以需要更改Hadoop中jline的版本。即保留一个高版本的jline jar包,从hive的lib包中拷贝到Hadoop中lib位置为/usr/hadoop/hadoop-2.7.3/share/hadoop/yarn/lib。(master中执行)

cp /usr/hive/apache-hive-2.1.1-bin/lib/jline-2.12.jar
/usr/hadoop/hadoop-2.7.3/share/hadoop/yarn/lib/

因为服务端需要和Mysql通信,所以服务端需要将Mysql的依赖包放在Hive的lib目录下。(slave01中进行)

先进入/usr/hive/apache-hive-2.1.1-bin/lib下:

cd /usr/hive/apache-hive-2.1.1-bin/lib

cp /home/hadoop/tmp/mysql-connector-java-5.1.47-bin.jar /usr/hive/apache-hive-2.1.1-bin/lib

10.5 将slave01作为服务器端并配置hive

10.5.1配置hive-env.sh文件

注:回到slave1,修改hive-env.sh文件中HADOOP_HOME环境变量。进入hive配置目录,因为hive中已经给出配置文件的范本hive-env.sh.template,直接将其复制一个进行修改即可:
cd $HIVE_HOME/conf

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

hive-env.sh文件中修改HADOOP_HOME环境变量。
HADOOP_HOME=/usr/hadoop/hadoop-2.7.3
export HIVE_CONF_DIR=/usr/hive/apache-hive-2.1.1-bin/conf
export HIVE_AUX_JARS_PATH=/usr/hive/apache-hive-2.1.1-bin/lib

10.5.2配置hive-site.xml文件
①配置hive-site.xml文件
注:conf里是没有这个文件的,我们自己创建配置,直接vim hive-site.xml,即可直接创建该新文件。保存退出即可(:wq)

xml 复制代码
<configuration>
<!-- Hive产生的元数据存放位置-->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/usr/hive_remote/warehouse</value>
</property>
<!-- 数据库连接JDBC的URL地址-->
<property>
<name>javax.jdo.option.ConnectionURL</name> 
<value>jdbc:mysql://slave02:3306/hive?createDatabaseIfNotExist=true</value>
</property>
<!-- 数据库连接driver,即MySQL驱动-->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<!-- MySQL数据库用户名-->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<!-- MySQL数据库密码-->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>root</value>
</property>
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
<property>
<name>datanucleus.schema.autoCreateAll</name>
<value>true</value>
</property>
</configuration>

②在/usr下用mkdir -p新建hive_remote/warehouse目录,在配置文件中用到,hive产生元数据的存储文件夹。

10.6 将master作为客户端配置hive

先进入hive修改配置文件目录
cd $HIVE_HOME/conf

10.6.1 配置 hive-site.xml
①配置hive-site.xml文件

vim hive-site.xml

xml 复制代码
<configuration>
<!-- Hive产生的元数据存放位置-->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/usr/hive_remote/warehouse</value>
</property>
<!--- 使用本地服务连接Hive,默认为true-->
<property>
<name>hive.metastore.local</name>
<value>false</value>
</property>
<!-- 连接服务器-->
<property>
<name>hive.metastore.uris</name>
<value>thrift://slave01:9083</value>
</property>
</configuration>

②在/usr下用mkdir -p新建hive_remote/warehouse目录,在配置文件中用到,hive产生元数据的存储文件夹。

10.6.2 配置 hive-env.sh文件
在master上
先拷贝hive-env.sh.template文件,命名为hive-env.sh

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

vim hive-env.sh

hive-env.sh文件中修改HADOOP_HOME环境变量。
HADOOP_HOME=/usr/hadoop/hadoop-2.7.3
export HIVE_CONF_DIR=/usr/hive/apache-hive-2.1.1-bin/conf
export HIVE_AUX_JARS_PATH=/usr/hive/apache-hive-2.1.1-bin/lib

10.7 启动hive

注:启动前,按顺序将之前所有的hadoop,zookeeper,hbase服务启动,否则在master上输入bin/hive命令时会报错。
1)启动hive server服务(slave01上)

先进入 /usr/hive/apache-hive-2.1.1-bin/

接着:bin/hive --service metastore(hive后面后空格)

启动成功(注:slave01启动hive后有些关于ssl的warn如下,应该是slave02和其余节点未免密,以后安装集群在一开始集群免密还是要三台机器都互相免密)

2)在master上启动hive client

①进入/usr/hive/apache-hive-2.1.1-bin/目录:
cd /usr/hive/apache-hive-2.1.1-bin/
bin/hive #启动hive

②测试hive是否启动成功:
show databases;

创建数据库hive_db:create database hive_db;(之前已经创建)

③查看runjar(启动成功的标志)

先不要关闭当前终端会话,去外面打开一个新的终端会话,打开另一个terminal:
jps

11 安装Spark

11.1 安装scala环境

1)使用WinSCP将scala-2.11.12.tgz的压缩包从windows系统传至master主节点机器上,并放置在/opt/software目录中,同时创建 /usr/scala目录,后续将scala-2.11.12.tgz的压缩包解压到/usr/scala即可。(先在master配置好,在分发到slave01、slave02节点上)

cp /home/hadoop/tmp/scala-2.11.12.tgz /opt/software/

2)创建 /usr/scala目录,并解压scala
mkdir -p /usr/scala
cd /usr/scala

tar -zxvf /opt/software/scala-2.11.12.tgz -C /usr/scala/

rm -rf /opt/software/scala-2.11.12.tgz

3)配置scala的环境变量并生效:
vim /etc/profile

xml 复制代码
#scala
export SCALA_HOME=/usr/scala/scala-2.11.12
export PATH=$SCALA_HOME/bin:$PATH

source /etc/profile

4)查看scala是否安装成功:
scala -version

5)将scala分发复制到其他节点:

scp -r /usr/scala root@slave01:/usr/
scp -r /usr/scala root@slave02:/usr/

并在其他节点配置环境变量,并使之生效。

在slave01查看scala是否安装成功:

在slave02查看scala是否安装成功:

做完这一步,scala安装完成了!!!

11.2 安装Spark(具体)

1)使用WinSCP将spark-2.4.0-bin-hadoop2.7.tgz的压缩包从windows系统传至master主节点机器上,并放置在/opt/software目录中,同时创建 /usr/spark目录,后续将spark-2.4.0-bin-hadoop2.7.tgz的压缩包解压到/usr/spark即可。(先在master配置好,在分发到slave01、slave02节点上)

cp /home/hadoop/tmp/spark-2.4.0-bin-hadoop2.7.tgz /opt/software/

2)创建 /usr/spark目录,并解压spark
mkdir -p /usr/spark
cd /usr/spark
tar -zxvf /opt/software/spark-2.4.0-bin-hadoop2.7.tgz -C /usr/spark

rm -rf /opt/software/spark-3.0.3-bin-hadoop2.7.tgz

3)配置spark-env.sh文件:
由于没有spark-env.sh文件,需要复制一份spark-env.sh.template
cd spark-3.0.3-bin-hadoop2.7/conf/
cp spark-env.sh.template spark-env.sh
vim spark-env.sh

添加以下内容:

xml 复制代码
export SPARK_MASTER_IP=LBJ
export SCALA_HOME=/usr/scala/scala-2.11.12
export SPARK_WORKER_MEMORY=8g
export JAVA_HOME=/usr/java/jdk1.8.0_162
export HADOOP_HOME=/usr/hadoop/hadoop-2.7.3
export HADOOP_CONF_DIR=/usr/hadoop/hadoop-2.7.3/etc/hadoop

4)配置spark从节点,修改slaves文件
注:注意slaves节点中只包含节点信息,其他注释不需要
由于没有slaves文件,需要复制一份slaves.template

cp slaves.template slaves
vim slaves

5)将spark分发复制到其他节点:

scp -r /usr/spark root@slave01:/usr/
scp -r /usr/spark root@slave02:/usr/

6)配置spark环境变量(三台机器都做,一样操作)

vim /etc/profile

添加内容:

xml 复制代码
#spark
export SPARK_HOME=/usr/spark/spark-2.4.0-bin-hadoop2.7
export PATH=$SPARK_HOME/bin:$PATH

使之生效:source /etc/profile


7)开启spark(在master节点上)
/usr/spark/spark-2.4.0-bin-hadoop2.7/sbin/start-all.sh
jps
在master上:

在slave01上:

在slave02上:

做完这一步,spark安装完成了!!!

11.3 运行例程

注:运行spark自带例程和shell命令板块。
1)运行自带例程进行验证

cd /usr/spark/spark-2.4.0-bin-hadoop2.7/
bin/run-example SparkPi

bin/run-example SparkPi 2>&1 | grep "Pi is"

2)shell命令验证

进入shell命令界面:bin/spark-shell

加载text文件
spark创建sc,可以加载本地文件和HDFS文件创建RDD。这里用Spark自带的本地文件README.md文件测试。

val textFile = sc.textFile("file:///usr/spark/spark-2.4.0-bin-hadoop2.7/README.md")

简单RDD操作

//获取RDD文件textFile的第一行内容

textFile.first()

//获取RDD文件textFile所有项的计数

textFile.count(

)

//抽取含有"Spark"的行,返回一个新的RDD

val lineWithSpark = textFile.filter(line => line.contains("Spark"))

//统计新的RDD的行数

lineWithSpark.count()

可以通过组合RDD操作进行组合,可以实现简易MapReduce操作

//找出文本中每行的最多单词数

textFile.map(line => line.split(" ").size).reduce((a, b) => if (a > b) a else b)

退出Spark Shell

输入exit,即可退出spark shell
:quit

做完这一步,运行例程验证完成了!!!

12 安装eclipse

1)使用WinSCP将eclipse-committers-2020-03-R-linux-gtk-x86_64.tar.gz的压缩包从windows系统传至master主节点机器上,在master上解压安装在/usr/即可。

tar -zxvf /home/hadoop/tmp/eclipse-committers-2020-03-R-linux-gtk-x86_64.tar.gz -C /usr/

启动eclipse


做完这一步,安装eclipse完成了!!!
后续使用eclipse编程会在后续实现。
做完以上操作,hadoop的完全分布式集群搭建成功!!!

三台CentOS7.6虚拟机搭建Hadoop完全分布式集群(三)笔记到此完结,笔者归纳、创作不易,大佬们给个3连再起飞吧

相关推荐
Yz98767 分钟前
hive的存储格式
大数据·数据库·数据仓库·hive·hadoop·数据库开发
青云交7 分钟前
大数据新视界 -- 大数据大厂之 Hive 数据导入:多源数据集成的策略与实战(上)(3/ 30)
大数据·数据清洗·电商数据·数据整合·hive 数据导入·多源数据·影视娱乐数据
武子康10 分钟前
大数据-230 离线数仓 - ODS层的构建 Hive处理 UDF 与 SerDe 处理 与 当前总结
java·大数据·数据仓库·hive·hadoop·sql·hdfs
武子康12 分钟前
大数据-231 离线数仓 - DWS 层、ADS 层的创建 Hive 执行脚本
java·大数据·数据仓库·hive·hadoop·mysql
运维&陈同学24 分钟前
【zookeeper01】消息队列与微服务之zookeeper工作原理
运维·分布式·微服务·zookeeper·云原生·架构·消息队列
时差95326 分钟前
Flink Standalone集群模式安装部署
大数据·分布式·flink·部署
锵锵锵锵~蒋29 分钟前
实时数据开发 | 怎么通俗理解Flink容错机制,提到的checkpoint、barrier、Savepoint、sink都是什么
大数据·数据仓库·flink·实时数据开发
二进制_博客30 分钟前
Flink学习连载文章4-flink中的各种转换操作
大数据·学习·flink
大数据编程之光33 分钟前
Flink入门介绍
大数据·flink
菠萝咕噜肉i39 分钟前
超详细:Redis分布式锁
数据库·redis·分布式·缓存·分布式锁