【phoenix-使用手册】开启transactions事务
2018-11-29 本文已影响0人
粮忆雨
测试版本:phoenix-4.14.1-HBase-1.1
目前phoenix的事务支持只是beta版,不建议在生产环境中使用。另外hbase1.1对应的phoenix已经停止维护了,建议升级hbase。
step 1:
有时间的话可以看看官方的说明步骤(与实际操作还是有些出入):https://phoenix.apache.org/transactions.html
首先在hbase集群安装目录下的conf/hbase-site.xml和phoenix服务端安装目录bin/hbase-site.xml添加如下配置:
<!-- 开启phoenix事务支持 -->
<property>
<name>phoenix.transactions.enabled</name>
<value>true</value>
</property>
<!-- 存储tx状态的快照目录 -->
<property>
<name>data.tx.snapshot.dir</name>
<value>/tmp/tephra/snapshots</value>
</property>
<!-- 事务超时时间 -->
<property>
<name>data.tx.timeout</name>
<value>60</value>
</property>
step 2:
首先升级hbase安装目录下的lib/guava-12.0.1.jar,要求guava-13.0.1.jar版本以上,否则启动tephra管理事务时报如下错误,启动日志目录默认/tmp/tephra-root/tephra-service-root-XXX.log :
Exception in thread "main" java.lang.NoClassDefFoundError: com/google/common/util/concurrent/Service$Listener
at org.apache.tephra.distributed.TransactionService.doStart(TransactionService.java:87)
at com.google.common.util.concurrent.AbstractService.start(AbstractService.java:90)
at com.google.common.util.concurrent.AbstractService.startAndWait(AbstractService.java:129)
at org.apache.tephra.TransactionServiceMain.start(TransactionServiceMain.java:118)
at org.apache.tephra.TransactionServiceMain.doMain(TransactionServiceMain.java:85)
at org.apache.tephra.TransactionServiceMain.main(TransactionServiceMain.java:49)
Caused by: java.lang.ClassNotFoundException: com.google.common.util.concurrent.Service$Listener
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 6 more
jar包可以通过maven下载,替换旧版本的guava jar.
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>13.0.1</version>
</dependency>
升级完guava,启动事务管理进程,进入phoenix装目录
./bin/tephra start
启动完成使用jps查看TransactionServiceMain进程。
step 3:
测试,首先关闭自动提交事务(默认!autocommit on)
!autocommit off
创建事务表使用 TRANSACTIONAL=true
CREATE TABLE my_table (k BIGINT PRIMARY KEY, v VARCHAR) TRANSACTIONAL=true;
修改已存在表成事务表 (注意:不能将事务性表切换回非事务性表,所以谨慎考虑)
ALTER TABLE my_other_table SET TRANSACTIONAL=true;
image.png
添加到事务表中的索引对于它们的增量维护也是事务性的。例如,以下添加到my_table的索引将在发生变化时保持其与数据表的事务一致:
CREATE INDEX my_table (k BIGINT PRIMARY KEY, v VARCHAR) TRANSACTIONAL=true;
已经启动的外部Tephra事务可以通过设置Phoenix连接的事务上下文与Phoenix一起使用:
setTransactionContext(TransactionContext txContext)