pilosa分布式位图数据库(1)

Pilosa

  • 能够轻松横向扩展,并且保证速度的位图数据库,支持数据版本的粗粒度的时间序列(最小粒度到小时)
  • 适合高频次的流数据处理,使用场景例如,如果你的业务主体数据达到10亿量级,并且该数据的附加属性数量达到百万级别,当你需要实时的筛选符合各种属性组合条件的业务主体数据,Pilosa会是个好帮手
  • Pilosa的数据存储不像现有的关系型数据mysql、oracle的行式存储(一行是一个业务实体,一列是同一种数据实体同一个属性),包括index,column、frame、row、cell,是列式存储
  • 一个index类似一张表,数据查询不能跨index
  • 一个column表示一个业务实体,有业务意义,包括多个frame一行row的组合,从平面形象上看是纵向的
  • 一个frame,表示一个业务实体的属性,有业务意义,是row的集合,从平面形象上看是横向的
  • 一个row表示一个属性的一行数据存储,是cell的集合,从平面形象上看是横向的
  • 一个cell就是0/1,是数据存储的逻辑最小单元

安装

MacOS

1
(workspace) ➜ brew install pilosa

二进制包

1
2
3
(workspace) ➜ curl -L -O https://github.com/pilosa/pilosa/releases/download/v0.4.0/pilosa-v0.4.0-darwin-amd64.tar.gz
(workspace) ➜ tar xfz pilosa-v0.4.0-darwin-amd64.tar.gz
(workspace) ➜ cp -i pilosa-v0.4.0-darwin-amd64/pilosa /usr/local/bin

go源码

1
2
3
(workspace) ➜ go get -d github.com/pilosa/pilosa
(workspace) ➜ cd $GOPATH/src/github.com/pilosa/pilosa
(workspace) ➜ make install

docker

1
2
(workspace) ➜ docker pull pilosa/pilosa:latest
(workspace) ➜ docker run --rm pilosa/pilosa:latest help

使用

业务场景

Star Trace是一个跟踪github开源项目的关注情况的业务,有1000条最近有更新并且名称包含go的项目数据,数据字段包括编程语言,标签,项目的关注者。

启server

1
2
(workspace) ➜ pilosa --help
(workspace) ➜ pilosa server

client操作

  • 建表,column是repository,frame是stargazer和language,构成了业务
1
2
3
4
5
6
7
8
9
10
11
12
13
14
(workspace) ➜ curl localhost:10101/status
(workspace) ➜ curl localhost:10101/schema
(workspace) ➜ curl localhost:10101/index/repository \
-X POST \
-d '{"options": {"columnLabel": "repo_id"}}'
(workspace) ➜ curl localhost:10101/index/repository/frame/stargazer \
-X POST \
-d '{"options": {"rowLabel": "stargazer_id",
"timeQuantum": "YMD",
"inverseEnabled": true}}'
(workspace) ➜ curl localhost:10101/index/repository/frame/language \
-X POST \
-d '{"options": {"rowLabel": "language_id",
"inverseEnabled": true}}'
  • 数据导入
1
2
3
4
(workspace) ➜ curl -O https://raw.githubusercontent.com/pilosa/getting-started/master/stargazer.csv
(workspace) ➜ curl -O https://raw.githubusercontent.com/pilosa/getting-started/master/language.csv
(workspace) ➜ pilosa import -i repository -f stargazer stargazer.csv
(workspace) ➜ pilosa import -i repository -f language language.csv
  • 查询操作,查询的结果都是列id

查14号用户关注的repository

1
2
3
(workspace) ➜ curl localhost:10101/index/repository/query \
-X POST \
-d 'Bitmap(frame="stargazer", stargazer_id=14)'

查编程语言是5的repository

1
2
3
(workspace) ➜ curl localhost:10101/index/repository/query \
-X POST \
-d 'TopN(frame="language", n=5)'

查14号用户和19号用户的关注的repository交集

1
2
3
(workspace) ➜ curl localhost:10101/index/repository/query \
-X POST \
-d 'Intersect(Bitmap(frame="stargazer", stargazer_id=14), Bitmap(frame="stargazer", stargazer_id=19))'

查14号用户和19号用户的关注的repository并集

1
2
3
(workspace) ➜ curl localhost:10101/index/repository/query \
-X POST \
-d 'Union(Bitmap(frame="stargazer", stargazer_id=14), Bitmap(frame="stargazer", stargazer_id=19))'

查14号用户和19号用户的共同关注的并且语言是1的repository

1
2
3
(workspace) ➜ curl localhost:10101/index/repository/query \
-X POST \
-d 'Intersect(Bitmap(frame="stargazer", stargazer_id=14), Bitmap(frame="stargazer", stargazer_id=19), Bitmap(frame="language", language_id=1))'

在frame为stargazer里面,加一行关注者为99999数据,列上repository为77777的cell为1

1
2
3
(workspace) ➜ curl localhost:10101/index/repository/query \
-X POST \
-d 'SetBit(frame="stargazer", repo_id=77777, stargazer_id=99999)'

经过基本的使用,我觉得pilosa比传统的关系型数据库更侧重于关系,而通过列式存储的架构,方便了大数据的实时聚合计算,所以pilosa是为了在某些场景替代传统关系型数据库,对于文档数据库mongo和嵌入式数据库没有影响。在一些业务庞大的公司里面应该是可以考虑引入的。如果要继续了解pilosa,请阅读pilosa分布式位图数据库(2)