cassandra eu 2012 - cql: then, now and when by eric evans

50
CQL: Then, Now, and When Eric Evans [email protected] Cassandra Europe March 28, 2012 Wednesday, March 28, 12

Upload: acunu

Post on 15-Jan-2015

2.709 views

Category:

Technology


1 download

DESCRIPTION

Eric Evans' talk about the latest on CQL given at Cassandra Europe on March 28 2012.

TRANSCRIPT

Page 1: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

CQL: Then, Now, and When

Eric [email protected]

Cassandra EuropeMarch 28, 2012

Wednesday, March 28, 12

Page 2: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

• Query language for Apache Cassandra

• SQL for the most part

• An alternative query interface

• Available since Cassandra 0.8.0

Cassandra Query Language(aka CQL)

Wednesday, March 28, 12

Page 3: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

Wednesday, March 28, 12

Page 4: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

Wednesday, March 28, 12

Page 5: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

Best Troll Ever?

Wednesday, March 28, 12

Page 6: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

Not a troll at all, actually.

Wednesday, March 28, 12

Page 7: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

• RPC-based query interface

• Low level; very little abstraction

• Implemented in Thrift

• Compact binary serialization

• Loads of supported languages

• Generated language code

Status Quo

Wednesday, March 28, 12

Page 8: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

Unstable$@#*!

NOT AGAIN!

Relax

It’ll take you 5 minutes toupdate your code.

Wednesday, March 28, 12

Page 9: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

Not User Friendly

Wednesday, March 28, 12

Page 10: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

This cannot be unseen!// Your columnColumn col = new Column(ByteBuffer.wrap(“name”.getBytes()));col.setValue(ByteBuffer.wrap(“value”.getBytes()));col.setTimestamp(System.currentTimeMillis());

// Don’t askColumnOrSuperColumn cosc = new ColumnOrSuperColumn();cosc.setColumn(cosc);

// Hang on, here we go...Mutation mutation = new Mutation();mutation.setColumnOrSuperColumn(cosc);

List<Mutation> mutations = new ArrayList<Mutation>();mutations.add(mutation);

Map mutations_map = new HashMap<ByteBuffer, Map<String, List<Mutation>>>();Map cf_map = new Map<String, List<Mutation>>();cf_map.set(“Standard1”, mutations);mutations_map.put(ByteBuffer.wrap(“key”.getBytes()), cf_map);

cassandra.batch_mutate(mutations_map, consistency_level);

Wednesday, March 28, 12

Page 11: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

This cannot be unseen!// Your columnColumn col = new Column(ByteBuffer.wrap(“name”.getBytes()));col.setValue(ByteBuffer.wrap(“value”.getBytes()));col.setTimestamp(System.currentTimeMillis());

// Don’t askColumnOrSuperColumn cosc = new ColumnOrSuperColumn();cosc.setColumn(cosc);

// Hang on, here we go...Mutation mutation = new Mutation();mutation.setColumnOrSuperColumn(cosc);

List<Mutation> mutations = new ArrayList<Mutation>();mutations.add(mutation);

Map mutations_map = new HashMap<ByteBuffer, Map<String, List<Mutation>>>();Map cf_map = new Map<String, List<Mutation>>();cf_map.set(“Standard1”, mutations);mutations_map.put(ByteBuffer.wrap(“key”.getBytes()), cf_map);

cassandra.batch_mutate(mutations_map, consistency_level);

Wednesday, March 28, 12

Page 12: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

A query interface should be...

Simple

Intuitive

Invisible

Performant(?)

Wednesday, March 28, 12

Page 13: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

Alternatives

• REST

• RPC (Thrift, Avro, Protobuf, etc)

• SQL (bahahaha)

• etc, etc

Wednesday, March 28, 12

Page 14: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

REST

Pros Cons

• Ubiquitous

• Frequently requested

• Client uniformity

• Fails expectations

• Slow

Wednesday, March 28, 12

Page 15: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

RPC

Pros Cons

• Easy to implement

• Performant

• Poor mental fit

• Heavy dependency

Wednesday, March 28, 12

Page 16: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

SQL

Pros Cons

• Ubiquitous

• Widely known

• Excellent mental fit

• Client uniformity

• People whinging

• Security(?)

Wednesday, March 28, 12

Page 17: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

SQL

Pros Cons

• Ubiquitous

• Widely known

• Excellent mental fit

• Client uniformity

• People whinging

• Security(?)

Wednesday, March 28, 12

Page 18: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

Wednesday, March 28, 12

Page 19: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

Hello...-- Create or updateINSERT INTO users (id, given, surname) VALUES (jericevans, Eric, Evans);

-- Create or updateUPDATE users SET given = Eric, surname = Evans WHERE id = jericevans;

SELECT surname, given FROM users WHERE id = jericevans;

Wednesday, March 28, 12

Page 20: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

-- Adding an indexCREATE INDEX surnameidx ON users (surname);

SELECT id, given FROM users WHERE surname = Evans;

-- Limiting the number of rowsSELECT id, given FROM users WHERE surname = Evans LIMIT 1000;

...is it me you’re looking for?

Wednesday, March 28, 12

Page 21: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

-- From column, to columnSELECT ‘2012-01-01’..’2012-03-28’ FROM NewsWHERE topic = cassandra

-- Last N columnsSELECT FIRST 10 REVERSED * FROM NewsWHERE topic = cassandra

Querying column ranges

Wednesday, March 28, 12

Page 22: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

-- Get your count onUPDATE inventory SET apples = apples + 1 WHERE id = fruit;

UPDATE inventory SET carrots = carrots - 1 WHERE id = vegetable;

Counting

Wednesday, March 28, 12

Page 23: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

BEGIN BATCH INSERT INTO msgs (owner, subject, body) VALUES(jericevans, ‘Hi’, ‘Howdy’); UPDATE subjects SET subject = now WHERE owner = jericevansAPPLY BATCH

Batching writes

Wednesday, March 28, 12

Page 24: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

A query interface should be...

Simple

Intuitive

Invisible

Performant(?)

Wednesday, March 28, 12

Page 25: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

Drivers• Not a replacement for high-level, idiomatic

libraries

• Avoids duplicating efforts, (error handling, pooling, etc)

• Consistently scoped, JDBC, etc

• Consistently hosted, licensed

• Discoverable

• More work needed...

Wednesday, March 28, 12

Page 26: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

Current lineup

• JDBC (Java)

• DB-API 2 (Python)

• PDO (PHP)

• Ruby

• Node.JS

Wednesday, March 28, 12

Page 27: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

And what about interfacestability?

Wednesday, March 28, 12

Page 28: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

CQL 1.0

0.8.0

Wednesday, March 28, 12

Page 29: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

CQL 2.0

0.8.01.0.0

• types made more consistent w/ SQL• count() returns rows, not columns

Wednesday, March 28, 12

Page 30: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

Wednesday, March 28, 12

Page 31: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

CQL 3.0

0.8.01.0.0

1.1.0

Wednesday, March 28, 12

Page 32: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

CQL 3.0-- A materialized timeline of tweetsCREATE COLUMNFAMILY timeline ( username text, posted_at timestamp, body text, posted_by text, PRIMARY KEY (username, posted_at));

Wednesday, March 28, 12

Page 33: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

CQL 3.0INSERT INTO timeline (username, posted_at, body, posted_by)VALUES (scotty, ‘2012-03-23 14:36’ ‘stupid klingons...’, jtkirk);

INSERT INTO timeline (username, posted_at, body, posted_by)VALUES (scotty, ‘2012-03-23 16:12’ ‘@jtkirk green?’, spock);

INSERT INTO timeline (username, posted_at, body, posted_by)VALUES (scotty, ‘2012-03-23 17:42’ ‘@spock yes, green’, jtkirk);

INSERT INTO timeline (username, posted_at, body, posted_by)VALUES (scotty, ‘2012-03-25 08:14’ ‘get off my lawn!’, bones);

Wednesday, March 28, 12

Page 34: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

In Cassandra’s eyes eye

scotty(23/03 14:36, body):

stupid klingons...(23/03 14:36, posted_by):

jtkirk(23/03 16:12, body):

@jtkirk green?...

Wednesday, March 28, 12

Page 35: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

-- Tweets in Scotty’s timeline, by dateSELECT * FROM timeline WHERE username = scotty AND posted_at > ‘2012-03-22’;

Wednesday, March 28, 12

Page 36: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

Is it a row, or a table?Yes.

username posted_at body posted_by

scotty 23/03 14:36 stupid klingons... jtkirk

scotty 23/03 16:12 @jtkirk green? spock

scotty 23/03 17:42 @spock yes, green jtkirk

scotty 25/03 08:14 get off my lawn! bones

Wednesday, March 28, 12

Page 37: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

Also...

• Column names are strictly UTF-8

• Column names are case-insensitive (unless quoted)

• Old slice notation is gone (<start>..<end>)

• Static column families are actually static (schema-enforced)

Wednesday, March 28, 12

Page 38: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

$@#*!

NOT AGAIN!

Wednesday, March 28, 12

Page 39: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

CQL 2.0 + 3.0 “beta”

0.8.01.0.0

1.1.0

You arehere

Wednesday, March 28, 12

Page 40: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

Wednesday, March 28, 12

Page 41: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

CQL 3.0

0.8.01.0.0

1.1.0

You will be here

1.2.0

Wednesday, March 28, 12

Page 42: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

A query interface should be...

Simple

Intuitive

Invisible

Performant(?)

Wednesday, March 28, 12

Page 43: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

Performanceinserts

Wednesday, March 28, 12

Page 44: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

Performanceinserts w/ index

Wednesday, March 28, 12

Page 45: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

Performancecounter increments

Wednesday, March 28, 12

Page 46: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

Performancereads

Wednesday, March 28, 12

Page 47: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

Wednesday, March 28, 12

Page 48: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

A query interface should be...

Simple

Intuitive

Invisible

Performant

Wednesday, March 28, 12

Page 49: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

Help Wanted

• Writing tests

• Documentation

• Feedback

• Drivers

Wednesday, March 28, 12

Page 50: Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

Wednesday, March 28, 12