Akutan(阿库坦)
有一篇博文是 对 Akutan 的一个很好的介绍。
Akutan 是一个分布式知识图存储,有时也被称为 RDF 存储或三层存储。知识图适合于对那些由多种类型关系、高度互联的数据进行建模,比如关于世界的百科信息。知识图存储可以对其数据进行丰富的查询,这些查询可用于驱动实时界面,补充机器学习应用,并在现有知识的背景下理解新的非结构化信息。
如何将数据建模为知识图,以及如何查询数据,对于来自 SQL、NoSQL 和属性图存储的人来说,感觉会有些不同。在知识图中,数据被表示为单个事实表,其中每个事实都有一个主题、谓语和对象。这种表示方式使存储能够筛选数据进行复杂的查询,并应用推理规则,提高抽象程度。下面是一个微小图的例子:
subject | predicate | object |
---|---|---|
<John_Scalzi> |
<born> |
<Fairfield> |
<John_Scalzi> |
<lives> |
<Bradford> |
<John_Scalzi> |
<wrote> |
<Old_Mans_War> |
要了解如何在 Akutan 中表示和查询数据,请参阅 docs/query.md。
Akutan 的设计是为了存储无法在单一服务器上容纳的大型图形。它是可扩展的,它可以存储多少数据,它可以执行查询的速度。但是,Akutan 通过中心日志对图形的所有变化进行序列化,这从根本上限制了总的变化率。变化率不会随着服务器数量的增加而提高,但一个典型的部署应该能够处理每秒数万次的变化。作为这种限制的交换,Akutan 的架构是一个相对简单的架构,可以实现很多功能。例如,Akutan 支持事务性更新和历史全局快照。我们相信,这种权衡适合大多数知识图谱用例,它积累了大量的数据,但这样做是在一个适度的速度。要了解更多关于 Akutan 的架构和这种权衡,请参阅 docs/central_log_arch.md。
Akutan 还没有做好生产关键型部署的准备,但它现在对某些用例很有用。为了开发目的,我们已经运行了 20 台服务器的 Akutan 部署和离线用例大约一年了,我们通常装载了大约 25 亿个事实的数据集。我们相信 Akutan 目前的能力超过了这个能力和规模:我们还没有把 Akutan 推向极限。该项目具有良好的架构基础,可以在此基础上构建其他功能,并实现更高的性能。
Akutan 需要更多的关爱才能用于关键生产的部署。Akutan 的大部分代码都是由高质量、文档化、单元测试的模块组成的,但是代码库的一些部分继承了 Akutan 早期的原型,仍然需要注意。在其他地方,Akutan 在用作关键的生产数据存储之前缺乏一些功能,包括删除事实、备份存储和自动化集群管理。我们已经为这些和其他一些事情提交了 GitHub 问题。此外,Akutan 还有一些地方可以改进,但不一定会阻止生产使用。例如,Akutan 的查询语言与 Sparql 不太兼容,它的推理引擎也很有限。
所以,Akutan 有一个很好的基础,可能对一些人有用,但它也需要额外的关爱。如果不适合您,这里有一些可供选择的开源知识和属性图存储(我们与这些项目没有关联)
- Blazegraph:一个 RDF 存储。支持多种查询语言,包括 SPARQL 和 Gremlin。基于磁盘,单主站,只用于读取。似乎无人维护。Powers https://query.wikidata.org/。
- Dgraph:一个面向三层的属性图存储。类似 GraphQL 的查询语言,不支持 SPARQL。基于磁盘,可扩展。
- Neo4j:一个属性图存储。Cypher 查询语言,不支持 SPARQL。单主,只对读进行扩展。
也可以参考维基百科的 比较 Triplestores 页面。
本 README 的其余部分描述了如何让 Akutan 启动和运行。docs/ 目录下的几个文档更详细地描述了 Akutan 的各个方面,请参阅 docs/README.md 的概述。
安装依赖关系和构建 Akutan
Akutan 有以下系统依赖性:
它是用Go语言编写的,你需要v1.11.5或更新的版本。你需要v1.11.5或更新的版本。
Akutan广泛使用 Protocol Buffers 为 gRPC 编码消息,数据变化的日志,并存储在磁盘上。你需要 protobuf 版本 3。我们推荐 3.5.2 或更高版本。请注意,3.0.x 是许多 Linux 发行版的默认值,但不支持 Akutan 构建工作。
Akutan的磁盘视图将他们的事实存储在 RocksDB 中。
在 Mac OS X 上,这些都可以通过 Homebrew 安装。
$ brew install golang protobuf rocksdb zstd
在 Ubuntu 上,参考 docker/ 目录下的文件,了解使用 apt-get 的包名。
克隆 Akutan 仓库后,拉下几个 Go 库和额外的 Go 工具。
$ make get
最后,建立项目:
$ make build
在本地运行 Akutan
在本地运行 Akutan 的最快方法是启动内存中的日志存储:
$ bin/plank
然后打开另一个终端,运行:
$ make run
这将在本地启动几个 Akutan 服务器。它启动一个 API 服务器,在 localhost 上监听端口 9987 的 gRPC 请求和端口 9988 的 HTTP 请求,如 http://localhost:9988/stats.txt。
与 API 服务器交互的最简单方法是使用 bin/akutan-client。请看 docs/query.md 的例子。API 服务器公开了在 proto/api/akutan_api.proto 中定义的 FactStore gRPC 服务。
部署问题
日志
之前,我们使用 bin/plank 作为日志存储,但这并不适合实际使用! Plank 只在内存中,不被复制,而且默认情况下,它一次只保留 1000 个条目。它只用于开发。
Akutan 还支持使用 Apache Kafka 作为其日志存储。在任何部署中,推荐使用这种方法。要使用 Kafka,请按照 Kafka 快速入门指南安装 Kafka,启动 ZooKeeper,并启动 Kafka。然后创建一个名为 "akutan" 的主题(而不是 Kafka 指南中的 "test"),并将分区设置为 1,您将需要配置 Kafka 以同步地将条目写入磁盘。
要将 Kafka 与 Akutan 一起使用,在你的 Akutan 配置中设置 akutanLog 的类型为 kafka(默认:local/config.json),并相应地更新定位器的地址(Kafka 默认使用 9092 端口)。在重启集群之前,你需要清除 Akutan 的 Disk Views 的数据。磁盘视图默认将数据存储在 $TMPDIR/rocksdb-akutan-diskview-{space}-{partition} 中,所以你可以用 rm -rf $TMPDIR/rocksdb-akutan-diskview* 将它们全部删除。
Docker 和 Kubernetes
这个资源库包括支持在 Docker 和 Minikube 内运行 Akutan。这些环境对于开发目的来说可能很繁琐,但作为迈向现代和强大的生产部署的一步,它们是有用的。
请参阅 cluster/k8s/Minikube.md 文件,了解在 Minikube 中构建和部署 Akutan 服务的步骤。它还包括构建 Docker 镜像的步骤。
分布式追踪
Akutan 生成分布式 OpenTracing 跟踪,供 Jaeger 使用。要尝试它,请按照 Jaeger 入门指南来运行多合一的 Docker 映像。默认的 make run 被配置为将 traces 发送到那里,你可以在 http://localhost:16686 查询。Minikube 集群还包括一个 Jaeger 一体机实例。
开发
VS Code
你可以使用任何你喜欢的编辑器,但这个资源库包含了 VS Code 的一些配置。我们建议使用以下扩展。
用 ./vscode-settings.json5 覆盖 .vscode/settings.json 中的默认设置。
测试目标
Makefile 中包含了与运行测试有关的各种目标。
目标 | 描述 |
---|---|
make test |
使测试运行所有 akutan 单元测试。 |
make cover |
使覆盖运行所有 akutan 单元测试,并打开基于 Web 的覆盖查看器。 |
make lint |
运行基本代码 linting |
make vet |
运行所有静态分析测试,包括 linting 和格式化测试 |
许可证信息
Copyright 2019 eBay Inc.
主要作者:Simon Fell、Diego Ongaro、Raymond Kroeker、Sathish Kandasamy。
根据 Apache 许可证 2.0 版("License")授权;除非符合许可证的规定,否则您不得使用该文件。您可以在 https://www.apache.org/licenses/LICENSE-2.0 获得许可证的副本。
除非适用的法律要求或书面同意,根据许可证发布的软件是在 "AS IS" 的基础上发布的,没有任何形式的明示或暗示的保证或条件。请参阅许可证中关于许可证下权限和限制的具体语言。
(The first version translated by vz on 2020.12.26)