Apache HBase

Apache HBase 是一个开源、分布式、带版本、非关系型数据库,其模型源自 Google 的 Bigtable: Chang 等人的《一个用于结构化数据的分布式存储系统》。正如 Bigtable 利用 Google 文件系统提供的分布式数据存储一样,Apache HBase 在 Hadoop 和 HDFS 之上提供了类似 Bigtable 的功能。
HBase 设置
以下各节概述了 JanusGraph 与 Apache HBase 协同工作的各种方式。
本地服务器模式

HBase 可以作为独立数据库运行在与 JanusGraph 和终端用户应用程序相同的本地主机上。在此模式下,JanusGraph 和 HBase 通过 `localhost` 套接字相互通信。在 HBase 上运行 JanusGraph 需要以下设置步骤
-
从 https://apache.ac.cn/dyn/closer.cgi/hbase/stable/ 下载并解压一个稳定的 HBase 版本。
-
通过在解压后的 HBase 目录中的 *bin* 目录中调用 `start-hbase.sh` 脚本来启动 HBase。要停止 HBase,请使用 `stop-hbase.sh`。
$ ./bin/start-hbase.sh starting master, logging to ../logs/hbase-master-machine-name.local.out
现在,您可以如下创建 HBase JanusGraph
JanusGraph graph = JanusGraphFactory.build()
.set("storage.backend", "hbase")
.open();
请注意,您无需指定主机名,因为默认情况下会尝试进行本地主机连接。此外,在 Gremlin Console 中,您无法定义变量 `conf` 和 `g` 的类型。因此,只需省略类型声明即可。
远程服务器模式

当图需要扩展超出单台机器的限制时,HBase 和 JanusGraph 在逻辑上被分离到不同的机器中。在此模式下,HBase 集群维护图表示,任意数量的 JanusGraph 实例维护对 HBase 集群的基于套接字的读/写访问。终端用户应用程序可以直接在与 JanusGraph 相同的 JVM 中与 JanusGraph 交互。
例如,假设我们有一个正在运行的 HBase 集群,其 ZooKeeper quorum 由三台机器组成,IP 地址分别为 77.77.77.77、77.77.77.78 和 77.77.77.79,那么 JanusGraph 与集群的连接方式如下
JanusGraph g = JanusGraphFactory.build()
.set("storage.backend", "hbase")
.set("storage.hostname", "77.77.77.77, 77.77.77.78, 77.77.77.79")
.open();
`storage.hostname` 接受逗号分隔的 IP 地址和主机名列表,用于 HBase 集群中 JanusGraph 应连接的任何机器子集。此外,在 Gremlin Console 中,您无法定义变量 `conf` 和 `g` 的类型。因此,只需省略类型声明即可。
带 Gremlin 服务器的远程服务器模式

最后,Gremlin Server 可以封装在上一小节中定义的每个 JanusGraph 实例周围。通过这种方式,终端用户应用程序不必是基于 Java 的应用程序,因为它可以作为客户端与 Gremlin Server 通信。这种部署类型非常适合多语言架构,其中用不同语言编写的各种组件需要引用和计算图。
http://gremlin-server.janusgraph.machine1/mygraph/vertices/1
http://gremlin-server.janusgraph.machine2/mygraph/tp/gremlin?script=g.v(1).out('follows').out('created')
在这种情况下,每个 Gremlin Server 都将被配置为连接到 HBase 集群。以下显示了 Gremlin Server 配置中特定于图的部分。有关完整示例和如何配置服务器的更多信息,请参阅 JanusGraph 服务器。
...
graphs: {
g: conf/janusgraph-hbase.properties
}
scriptEngines: {
gremlin-groovy: {
plugins: { org.janusgraph.graphdb.tinkerpop.plugin.JanusGraphGremlinPlugin: {},
org.apache.tinkerpop.gremlin.server.jsr223.GremlinServerGremlinPlugin: {},
org.apache.tinkerpop.gremlin.tinkergraph.jsr223.TinkerGraphGremlinPlugin: {},
org.apache.tinkerpop.gremlin.jsr223.ImportGremlinPlugin: {classImports: [java.lang.Math], methodImports: [java.lang.Math#*]},
org.apache.tinkerpop.gremlin.jsr223.ScriptFileGremlinPlugin: {files: [scripts/empty-sample.groovy]}}}}
...
HBase 特有配置
有关所有 HBase 特有配置选项以及通用 JanusGraph 配置选项的完整列表,请参阅 配置参考。
配置 HBase 时,建议考虑以下 HBase 特有配置选项
- storage.hbase.table: 用于存储 JanusGraph 图的 HBase 表的名称。允许在同一个 HBase 集群中共存多个 JanusGraph 图。
请参阅 HBase 配置文档,了解更多 HBase 配置选项及其描述。通过在 JanusGraph 配置中将相应的 HBase 配置选项前缀为 `storage.hbase.ext`,它将在初始化时传递给 HBase。例如,要将 znode /hbase-secure 用于 HBase,请设置属性:`storage.hbase.ext.zookeeper.znode.parent=/hbase-secure`。此前缀允许通过 JanusGraph 配置任意 HBase 配置选项。
重要
HBase 后端使用毫秒作为时间戳。在 JanusGraph 0.2.0 及更早版本中,如果未明确设置 `graph.timestamps` 属性,则默认值为 `MICRO`。在这种情况下,必须将 `graph.timestamps` 属性明确设置为 `MILLI`。在任何情况下都不要将 `graph.timestamps` 属性设置为其他值。
全局图操作
JanusGraph over HBase 支持全局顶点和边迭代。但是,请注意,所有这些顶点和/或边都将加载到内存中,这可能导致 `OutOfMemoryException`。使用 JanusGraph with TinkerPop’s Hadoop-Gremlin 可以有效地迭代大型图中的所有顶点或边。
管理 HBase 集群的技巧和窍门
主服务器上的 HBase shell 可用于获取集群的整体状态检查。
$HBASE_HOME/bin/hbase shell
在 shell 中,以下命令通常有助于了解集群的状态。
status 'janusgraph'
status 'simple'
status 'detailed'
上述命令可以识别区域服务器是否已宕机。如果是这样,可以 `ssh` 到发生故障的区域服务器机器并执行以下操作
sudo -u hadoop $HBASE_HOME/bin/hbase-daemon.sh stop regionserver
sudo -u hadoop $HBASE_HOME/bin/hbase-daemon.sh start regionserver
使用 pssh 可以使此过程变得容易,因为无需单独登录每台机器来运行命令。将区域服务器的 IP 地址放入 `hosts.txt` 文件,然后执行以下操作。
pssh -h host.txt sudo -u hadoop $HBASE_HOME/bin/hbase-daemon.sh stop regionserver
pssh -h host.txt sudo -u hadoop $HBASE_HOME/bin/hbase-daemon.sh start regionserver
接下来,有时您需要重新启动主服务器(例如,连接拒绝异常)。为此,在主服务器上执行以下操作
sudo -u hadoop $HBASE_HOME/bin/hbase-daemon.sh stop master
sudo -u hadoop $HBASE_HOME/bin/hbase-daemon.sh start master
最后,如果 HBase 集群已部署并且主服务器或区域服务器需要更多内存,只需在相应的机器上编辑 `$HBASE_HOME/conf/hbase-env.sh` 文件,并设置所需的 `-Xmx -Xms` 参数。编辑后,按照前面所述停止/启动主服务器和/或区域服务器。