No description
Find a file
Ben Johnson 3fdf63f84f
optimize sparse bitmap block checksums
This commit refactors the block checksumming by removing the
iteration over each block and instead only checking blocks which
have data. This requires merging the cache inspection with the
roaring iterator to reduce CPU time and memory allocations.
2016-07-07 10:03:38 -06:00
cmd merge 2016-05-25 09:18:57 -05:00
Godeps refactor in-memory bitmap storage 2016-05-24 15:01:49 -06:00
internal refactor in-memory bitmap storage 2016-05-24 15:01:49 -06:00
pql add bulk call support to the query endpoint 2016-03-08 14:34:37 -07:00
roaring optimize union() & difference() 2016-06-28 14:29:37 -06:00
vendor refactor in-memory bitmap storage 2016-05-24 15:01:49 -06:00
.gitignore optimize sparse bitmap block checksums 2016-07-07 10:03:38 -06:00
attr.go optimize bulk bitmap attribute update 2016-06-22 20:04:49 -06:00
attr_test.go add Range() support 2016-02-23 14:53:03 -07:00
bitmap.go optimize union() & difference() 2016-06-28 14:29:37 -06:00
cache.go refactor in-memory bitmap storage 2016-05-24 15:01:49 -06:00
client.go sort bits on import 2016-06-09 14:25:41 -06:00
client_test.go fix import cache updates 2016-05-11 17:32:28 -06:00
cluster.go use db in fragment allocation 2016-06-07 14:01:13 -06:00
cluster_test.go use db in fragment allocation 2016-06-07 14:01:13 -06:00
db.go active anti-entropy 2016-04-12 19:48:32 -06:00
db_test.go refactor attribute stores 2016-02-16 13:41:37 -07:00
executor.go optimize bulk bitmap attribute update 2016-06-22 20:04:49 -06:00
executor_test.go refactor in-memory bitmap storage 2016-05-24 15:01:49 -06:00
fragment.go optimize sparse bitmap block checksums 2016-07-07 10:03:38 -06:00
fragment_test.go optimize sparse bitmap block checksums 2016-07-07 10:03:38 -06:00
frame.go active anti-entropy 2016-04-12 19:48:32 -06:00
frame_test.go refactor attribute stores 2016-02-16 13:41:37 -07:00
handler.go added info to owns fragrment error message 2016-06-10 10:19:54 -05:00
handler_test.go optimize sparse bitmap block checksums 2016-07-07 10:03:38 -06:00
index.go check for early close during AAE 2016-06-29 10:18:24 -06:00
index_test.go refactor main into pilosa.Server 2016-05-13 14:39:09 -06:00
iterator.go consensus block merge 2016-05-06 16:19:10 -06:00
iterator_test.go consensus block merge 2016-05-06 16:19:10 -06:00
Makefile add protobuf/testdata, fix Makefile 2016-04-26 08:48:04 -06:00
NOTES refactor 2015-12-02 15:34:49 -07:00
pilosa.go add 'pilosactl bench' command 2016-03-31 15:49:57 -06:00
README.md fixed typos. changed -config flag to represent prefered Go format 2016-04-15 12:50:47 -05:00
server.go check for early close during AAE 2016-06-29 10:18:24 -06:00
time.go add Range() support 2016-02-23 14:53:03 -07:00
time_test.go add Range() support 2016-02-23 14:53:03 -07:00

pilosa

Pilosa is a bitmap index database.

Getting Started

Pilosa requires Go 1.6 or greater.

You can download the source by running go get:

$ go get github.com/umbel/pilosa

Now you can install the pilosa binary:

$ go install github.com/umbel/pilosa/...

Now run pilosa with the default configuration:

pilosa

Configuration

You can specify a configuration by setting the -config flag when running pilosa.

pilosa -config custom-config-file.cfg

The config file uses the TOML configuration file format, and should look like:

data-dir = "/tmp/pil0"
host = "127.0.0.1:15000"

[cluster]
replicas = 2

[[cluster.node]]
host = "127.0.0.1:15000"

[[cluster.node]]
host = "127.0.0.1:15001"

The first two configuration options will be unique to each node in the cluster:

data-dir: directory in which data is stored to disk

host: IP and port of the pilosa node

The remaining configuration options should be the same on every node in the cluster.

replicas: the number of replicas within the cluster

[[cluster.node]]: specifies each node within the cluster

Usage

You can interact with Pilosa via HTTP requests to the host:port on which you have Pilosa running. The following examples illustrate how to do this using curl with a Pilosa cluster running on 127.0.0.1 port 15000.

Return the version of Pilosa:

$ curl "http://127.0.0.1:15000/version"

Return a list of all databases and frames in the index:

$ curl "http://127.0.0.1:15000/schema"

Queries

Queries to Pilosa require sending a POST request where the query itself is sent as POST data. You specify the database on which to perform the query with a URL argument db=database-name.

A query sent to database exampleDB will have the following format:

$ curl -X POST "http://127.0.0.1:15000/query?db=exampleDB" -d 'Query()'

The Query() object referenced above should be made up of one or more of the query types listed below. So for example, a SetBit() query would look like this:

$ curl -X POST "http://127.0.0.1:15000/query?db=exampleDB" -d 'SetBit(id=10, frame="foo", profileID=1)'

Query results have the format {"results":[]}, where results is a list of results for each Query(). This means that you can provide multiple Query() objects with each HTTP request and results will contain the results of all of the queries.

$ curl -X POST "http://127.0.0.1:15000/query?db=exampleDB" -d 'Query() Query() Query()'

SetBit()

SetBit(id=10, frame="foo", profileID=1)

A return value of {"results":[true]} indicates that the bit was toggled from 0 to 1. A return value of {"results":[false]} indicates that the bit was already set to 1 and therefore nothing changed.


ClearBit()

ClearBit(id=10, frame="foo", profileID=1)

A return value of {"results":[true]} indicates that the bit was toggled from 1 to 0. A return value of {"results":[false]} indicates that the bit was already set to 0 and therefore nothing changed.


SetBitmapAttrs()

SetBitmapAttrs(id=10, frame="foo", category=123, color="blue", happy=true)

Returns {"results":[null]}


Bitmap()

Bitmap(id=10, frame="foo")

Returns {"results":[{"attrs":{"category":123,"color":"blue","happy":true},"bits":[1,2]}]} where attrs are the attributes set using SetBitmapAttrs() and bits are the bits set using SetBit().


Union()

Union(Bitmap(id=10, frame="foo"), Bitmap(id=20, frame="foo")))

Returns a result set similar to that of a Bitmap() query, only the attrs dictionary will be empty: {"results":[{"attrs":{},"bits":[1,2]}]}. Note that a Union() query can be nested within other queries anywhere that you would otherwise provide a Bitmap().


Intersect()

Intersect(Bitmap(id=10, frame="foo"), Bitmap(id=20, frame="foo")))

Returns a result set similar to that of a Bitmap() query, only the attrs dictionary will be empty: {"results":[{"attrs":{},"bits":[1]}]}. Note that an Intersect() query can be nested within other queries anywhere that you would otherwise provide a Bitmap().


Difference()

Difference(Bitmap(id=10, frame="foo"), Bitmap(id=20, frame="foo")))

Difference() represents all of the bits that are set in the first Bitmap() but are not set in the second Bitmap(). It returns a result set similar to that of a Bitmap() query, only the attrs dictionary will be empty: {"results":[{"attrs":{},"bits":[2]}]}. Note that a Difference() query can be nested within other queries anywhere that you would otherwise provide a Bitmap().


Count()

Count(Bitmap(id=10, frame="foo"))

Returns the count of the number of bits set in Bitmap(): {"results":[28]}


Range()

Range(id=10, frame="foo", start="1970-01-01T00:00", end="2000-01-02T03:04")

TopN()

TopN(frame="bar", n=20)

Returns the top 20 Bitmaps from frame bar.

TopN(Bitmap(id=10, frame="foo"), frame="bar", n=20)

Returns the top 20 Bitmaps from bar sorted by the count of bits in the intersection with Bitmap().

Development

Updating dependencies

To update dependencies, you'll need to install godep:

$ go get -u github.com/tools/godep

Then save the dependencies in your project:

$ godep save ./...

Protobuf

If you update protobuf (pilosa/internal/internal.proto), then you need to run go generate

$ go generate

Version

In order to set the version number, compile Pilosa with the following argument:

$ go install --ldflags="-X main.Version=1.0.0"