Titan DB的一些问题
使用熟悉一点的系统来测试TitanDB,HBASE+ES,记录下来一些小tips。
1、首先TitanDB支持的Hadoop只有1.2.1,所以Hbase自然也只能取到0.98,虽然官网上提供了titan-1.0-hadoop2,但是并不好用,向hbase存数据时会报错,原因是因为hadoop1的configure格式和hadoop2的不同,创建的config hbase和hadoop没法用,只能退回到上述版本。(ES包是1.5.1,建议使用1.5.2避免奇怪的错误)
2、使用gremlin按照官方文档上的方法进行添加索引(参照官方文档第8节)
mgmt = graph.openManagement()
name = mgmt.getPropertyKey('name')
age = mgmt.getPropertyKey('age')
mgmt.buildIndex('byNameComposite', Vertex.class).addKey(name).buildCompositeIndex()
mgmt.buildIndex('byNameAndAgeComposite', Vertex.class).addKey(name).addKey(age).buildCompositeIndex()
mgmt.commit()
//Wait for the index to become available
mgmt.awaitGraphIndexStatus(graph, 'byNameComposite').call()
mgmt.awaitGraphIndexStatus(graph, 'byNameAndAgeComposite').call()
//Reindex the existing data
mgmt = graph.openManagement()
mgmt.updateIndex(mgmt.getGraphIndex("byNameComposite"), SchemaAction.REINDEX).get()
mgmt.updateIndex(mgmt.getGraphIndex("byNameAndAgeComposite"), SchemaAction.REINDEX).get()
mgmt.commit()
在执行完mgmt.commit()之后,第一个事物会关闭,一定要重新开一个management才能使用updateIndex。这和0.5.1版本不同
3、JAVA API在添加索引这里有个问题,titan建索引大致是这样:
(1)创建一个空索引,将其状态设置为registered(mgmt.buildIndex('byNameComposite', Vertex.class).addKey(name).buildCompositeIndex())
(2)修改索引状态,将其状态设置为install(mgmt.awaitGraphIndexStatus(graph, 'byNameComposite').call())
(3)将表中现有数据reindex(mgmt.updateIndex(mgmt.getGraphIndex("byNameComposite"), SchemaAction.REINDEX).get())
JAVA API中没有找到将索引状态转化为install的方法,还在摸索。但是使用gremlin创建的索引在java使用查询时是可以正确使用的。
这个titan由于活跃度较低,用eclipse import mvn project的方式导入出了各种各样的错误,最后只能用最原始的办法:下载源码包,然后将所有依赖包加进来,虽然还有编译错误,但是至少不影响代码阅读了,找到了Titanfactory.open方法,发现如下:
public static TitanGraph open(ReadConfiguration configuration) {
return new StandardTitanGraph(new GraphDatabaseConfiguration(configuration));
}
找到StandardTitanGraph的openManagement方法
public TitanManagement openManagement() {
return new ManagementSystem(this,backend.getGlobalSystemConfig(),backend.getSystemMgmtLog(), mgmtLogger, schemaCache);
}
好吧,原来是TitanManagement的子类,找到ManagementSystem类,查看其源码发现:
public static GraphIndexStatusWatcher awaitGraphIndexStatus(TitanGraph g, String graphIndexName) {
return new GraphIndexStatusWatcher(g, graphIndexName);
}
原来还是个静态方法,在gremlin中使用的个mgmt.awaitGraphIndexStatus来更改index状态,而在api中是调用静态方法ManagementSystem.awaitGraphIndexStatus(g, indexname)来更改的。。
不过感觉有点奇怪,我使用updateindex方法更改其状态,titan竟然是把这个更改放在了触发器里而不是直接更改,按理说在不commit的时候是不会涉及到修改底层数据的,为什么要做成触发而且写在log类里?
现在一套走下来没什么问题了,Titan+HBASE+ES的代码如下(scala):
val g = TitanFactory.open(conf)
var mgmt = g.openManagement
val name = mgmt getPropertyKey "movieId"
var index = mgmt.buildIndex("movie2WIndex666", classOf[Vertex]).addKey(name).buildCompositeIndex
mgmt.updateIndex(index, SchemaAction.REGISTER_INDEX)
mgmt.commit
val ms = ManagementSystem.awaitGraphIndexStatus(g, "movie2WIndex666").call
println(ms.getTargetStatus)
mgmt = g.openManagement
index = mgmt.getGraphIndex("movie2WIndex666")
println(index.getIndexStatus(name))
mgmt.updateIndex(index, SchemaAction.REINDEX).get
mgmt.commit
val res = g.traversal().V().has("movieId",12345).out()
println(res)
g.close
4、这个和HBASE连接使用的时get方法,每次get一条数据,所以在没索引的前提下1秒只能检索100条左右的数据,测试时18万条的数据做一遍g.V().has(XX)需要34分钟左右,建立好索引的话查询一条只需要200ms左右。
建立索引时也是做一遍scan(这里是逐条get),所以百万级的数据对一个属性做CompositeIndex需要好几个小时- -mix索引和更大规模的数据集总感觉有点不对劲。
5、由于上述原因,hbase的连接超时要设置的很长,目前我设置的为180000秒,配置文件如下。
<property>
<name>hbase.rootdir</name>
<value>hdfs://cloud12:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.master</name>
<value>cloud12:60000</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/Titan/hbase/zookeeperDir</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>192.168.12.148</value>
</property>
<property>
<name>hbase.regionserver.lease.period</name>
<value>180000000</value>
</property>
<property>
<name>hbase.rpc.timeout</name>
<value>180000000</value>
</property>
Titan DB的一些问题的更多相关文章
- Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part3:db安装和升级
Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part3:db安装和升级 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 5.安装Database软件 5. ...
- VS15 preview 5打开文件夹自动生成slnx.VC.db SQLite库疑惑?求解答
用VS15 preview 5打开文件夹(详情查看博客http://www.cnblogs.com/zsy/p/5962242.html中配置),文件夹下多一个slnx.VC.db文件,如下图: 本文 ...
- ODBC、OLE DB、 ADO的区别
转自:http://blog.csdn.net/yinjingjing198808/article/details/7665577 一.ODBC ODBC的由来 1992年Microsoft和Syba ...
- Linux平台 Oracle 11gR2 RAC安装Part3:DB安装
四.DB(Database)安装 4.1 解压DB的安装包 4.2 DB软件安装 4.3 ASMCA创建磁盘组 4.4 DBCA建库 4.5 验证crsctl的状态 Linux平台 Oracle 11 ...
- SSRS ----环境配置,没有 ReportServer DB 怎么办?
今天项目进入报表开发阶段,按照习惯,打开报表管理器,发现提示下面的错误: 错误:报表服务器无法打开与报表服务器数据库的连接.所有请求和处理都要求与数据库建立连接. 这是怎么回事儿呢,经过排查,发现数据 ...
- mongo DB for C#
(1)Download the MongoDB C#驱动. http://www.nuget.org/packages/mongocsharpdriver/. (2) Add Reference to ...
- jBPM4.4 no jBPM DB schema: no JBPM4_EXECUTION table. Run the create.jbpm.schema target first in the install tool.
jBPM4.4 no jBPM DB schema: no JBPM4_EXECUTION table. Run the create.jbpm.schema target first in the ...
- oracle db link的查看创建与删除
1.查看dblink select owner,object_name from dba_objects where object_type='DATABASE LINK'; 或者 select * ...
- Gc.Db之循序渐进
距离上次写Gc.Db框架已经有一段时间了,最近默默对框架代码已经做了不少优化和功能,且已经提交至nuget,大家如果想使用此框架,可以通过nuget搜索:Gc.Db进行下载和安装包. 本篇文章主要是介 ...
随机推荐
- SQL server 2008 安装问题解决
安装sqlserver2008 出现的一些问题解决方法 1,安装sqlserver的时候出现如下图所示,解决办法是:开始→运行→输入“regedit”→找到“HKEY_LOCAL_MACHINE\SY ...
- 图片上传即时显示javascript代码
这是基于javascript的一种图片上传即时显示方法,测试结果IE6和火狐浏览器可以正常使用.google浏览器不兼容. 这种方法兼容性比较差,仅供参考,建议使用ajax方法来即时显示图片. 1.首 ...
- 使用Playground编写第一个Swift程序
从控制台输出“HelloWorld”是我学习C语言的第一步,也是我人生中非常重要的一步.多年后的今天,我仍希望以HelloWorld作为第一步,与大家共同开启一个神奇.瑰丽的世界——Swift编程. ...
- template_1
0: 模板是一些为多种类型而编写的函数和类,而且这些类型都没有指定.当使用模板的时候,只需要把所希望的类型作为一个(显示或隐示的)实参传递给模板.模板是语言本身所具有的特效,她完全支持类型检查和作用域 ...
- socket设置为非阻塞方式(windows和linux)
Windows用以下方法将socket设置为非阻塞方式 : unsigned long ul=1; SOCKET s=socket(AF_INET,SOCK_STREAM,0); int ret=io ...
- awk!字符问题,修复中!.......
awk '条件类型1{动作1} 条件类型2{动作2}' file1 file2 变量名称:1.NF 每一行($0表示文本所有域)拥有的字段数. 2.NR目前awk处理的"第n行"数 ...
- Ubuntu 下 glpk 的安装及使用
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4156204.html glpk是一个开源的求解线性规划的包. 添加源: deb http:/ ...
- php总结:1.php介绍
1.什么是php PHP,即“Hypertext Preprocessor”,是一种被广泛应用的开源通用脚本语言,尤其适用于 Web 开发并可嵌入 HTML 中去.它的语法利用了 C.Java 和 P ...
- Spark小课堂Week6 启动日志详解
Spark小课堂Week6 启动日志详解 作为分布式系统,Spark程序是非常难以使用传统方法来进行调试的,所以我们主要的武器是日志,今天会对启动日志进行一下详解. 日志详解 今天主要遍历下Strea ...
- ItemsControl 使用Grid布局
ItemsControl控件经常用到,在ItemsPanel里大多是StackPanel,WrapPanel,以下项目演示如何使用Grid用于ItemsControl布局 1.先看运行效果 2.xam ...