Hive之——锁

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/l1028386804/article/details/88649821

转载请注明出处:https://blog.csdn.net/l1028386804/article/details/88649821

Hive结合Zookeeper支持锁功能

这里,我们使用3个zookeeper节点:zk1.site.pvt、zk2.site.pvt、zk3.site.pvt
下载并压缩一个Zookeeper发行包,通过如下一系列命令,我们就可以将Zookeeper安装到/opt目录下。

cd /opt
wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.13/zookeeper-3.4.13.tar.gz
tar -zxvf zookeeper-3.4.13.tar.gz
ln -s zookeeper-3.4.13 zookeeper

创建一个目录用来存放Zookeeper的数据

mkdir /var/zookeeper

创建一个Zookeeper配置文件/opt/zookeeper/conf/zoo.cfg。配置内容如下,可根据实际情况修改:

tickTime=2000
dataDir=/var/zookeeper
clientPort=2181
initLimit=5
syncLimit=2
server.1=zk1.site.pvt:2888:3888
server.2=zk2.site.pvt:2888:3888
server.3=zk3.site.pvt:2888:3888

在每台服务器上都需要创建一个myid文件,并确保文件内容和配置文件中配置的ID匹配。例如,对于zk1.site.pvt这个节点服务器上myid文件,用户可以通过如下命令进行创建:

echo 1 > /var/zookeeper/myid

启动zookeeper

/opt/zookeeper/bin/zkServer.sh start

一旦Zookeeper节点间相互通信,可能就会在一台Zookeeper节点上创建数据,而从另一个节点上读取数据。例如:在某个节点上执行如下这个会话:

/opt/zookeeper/bin/zkCli.sh -server zk1.site.pvt:2181
[zk:zk1.site.pvt:2181(CONNECTED) 3] ls /
[zookeeper]
[zk:zk1.site.pvt:2181(CONNECTED) 4] create /zk_test my_data
Created /zk_test

然后,从其他某个节点上执行这个会话,或者在之前的那个节点上重新开一个控制台来执行这个会话:

/opt/zookeeper/bin/zkCli.sh -server zk2.site.pvt:2181
[zk:zk2.site.pvt:2181(CONNECTED) 0] ls /
[zookeeper, zk_test]
[zk:zk2.site.pvt:2181(CONNECTED) 1]

接下来配置Hive,让其可以使用这些Zookeeper节点来启用并发支持
在$HIVE_HOME/hive-site.xml这个配置文件中,需要增加如下配置属性:

<property>
	<name>hive.zookeeper.quorum</name>
	<value>zk1.site.pvt,zk2.site.pvt,zk3.site.pvt</value>
</property>

<property>
	<name>hive.support.concurrency</name>
	<value>true</value>
</property>

配置好这些属性,Hive会对特定的查询自动启动获取锁,用户可以通过SHOW LOCKS命令查看当前的所有锁:

hive> SHOW LOCKS;

假设places是分区表,如在这些更加集中的查询也是支持的,其中的省略号可以换成一个适当的分区描述:

扫描二维码关注公众号,回复: 5588497 查看本文章
hive> show locks places extended;
hive> show locks places partition(...);
hive> show locks places partition(...) extended;

Hive中提供了2中类型的锁,开启并发功能后,它们也就自动被启用了。某个表被读取的时候需要使用共享锁,多重并发共享锁也是允许使用的。
对于其他那些会以某种方式修改表的操作都是需要使用独占锁的。其不仅会冻结其他表修改操作,同时也会阻止其他进程进行查询。

当表是分区表时,对一个分区获取独占锁时会导致需要对表本身获取共享锁来防止发生不相容的变更,例如当一个分区正在被修改的时候尝试删除这个表,当然,对表使用独占锁会全局影响所有的分区。

显示锁和独占锁

可以显示的管理锁。例如:假设某个Hive火花对表people创建了一个显示锁:

hive> lock table people exclusive;

下面是另一个Hive会话,其尝试查询这个被锁定的表:

hive> select count(*) from people;
conflicting lock present for default@people mode SHARED
FAILED: ERROR in accquiring locks: locks on the underlying objects
cannot be acquired. retry after some time

通过unlock table语句可以对表进行解锁,解锁后其他会话的查询就可以正常工作了:

hive> unlock table people;

猜你喜欢

转载自blog.csdn.net/l1028386804/article/details/88649821