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

description

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

Transcript of Cassandra EU 2012 - CQL: Then, Now and When by Eric Evans

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