Cassandra Day Denver 2014: Building Java Applications with Apache Cassandra

Post on 05-Dec-2014

1.189 views 1 download

description

Speaker: Tim Berglund, Global Director of Training at DataStax So you’re a JVM developer, you understand Cassandra’s architecture, and you’re on your way to knowing its data model well enough to build descriptive data models that perform well. What you need now is to know the Java Driver. What seems like an inconsequential library that proxies your application’s queries to your Cassandra cluster is actually a sophisticated piece of code that solves a lot of problems for you that early Cassandra developers had to code by hand. Come to this session to see features you might be missing and examples of how to use the Java driver in real applications.

Transcript of Cassandra Day Denver 2014: Building Java Applications with Apache Cassandra

JavaApplica)ons

Building

with  Cassandra

2000

4000

6000

8000

A000

C000

E000

0000

Client Machine

Load Balancer

tim name: Tim

role: teacher

kristenname: Kristen

role: marketing

billy role: CEO

matt name: Matt

role: founder

status: active

status: chill

https://github.com/datastax/java-­‐driver

DataStax  Java  Driver

• Open  source  (ASL  2.0)  • Where  CQL  happens  • Ac9vely  developed  • Now  faster  than  ThriD  • Doesn’t  make  you  want  to  die

Every Use Casehas a Story

YourStory:

apply plugin: 'java'repositories { jcenter()} dependencies { compile 'com.datastax.cassandra:cassandra-driver-core:2.1.2' testCompile 'org.testng:testng:6.8.8' testCompile 'junit:junit:4.11'}

Gradle Build

session.execute( "INSERT INTO sensor \ (sensor_id, reading, time) \ VALUES \ (24601, 2.171828, now())”);

ClusterInterfaceCluster cluster = Cluster.builder() .addContactPoints(“192.168.50.1”) .build(); Session session = cluster.connect(“IoT_keyspace");

YourStory:

ResultSet resultSet = session.execute("SELECT * FROM sensor");

List<Row> rows = resultSet.all();

for(Row row : rows) { String sensorId = row.getString("sensor_id" ); double reading = row.getDouble("reading" ); Date time = row.getDate("time" ); }

BasicQueries

PreparedStatement insertReading = session.prepare( "INSERT INTO sensor \ (sensor_id, reading, time) VALUES (?, ?, ?)” ); Statement statement = insertReading .bind(24601, 2.71828, new Date()) .setConsistencyLevel(ConsistencyLevel.QUORUM);

session.execute(statement);

PreparedStatements

YourStory:

2000

4000

6000

8000

A000

C000

E000

0000

Client Machine

ClusterInterface

Cluster cluster = Cluster.builder() .addContactPoints(“192.168.50.1”) .build();

ClusterInterface

Cluster cluster = Cluster.builder() .addContactPoints(“192.168.50.1”, “192.168.50.4”, “192.168.50.8”) .build();

YourStory:

2000

4000

6000

8000

A000

C000

E000

0000

Client Machine

2000

4000

6000

8000

A000

C000

E000

0000

Client Machine

1.2ms

2.9ms

15.3ms

Outsmar(ng  Yourself

• Pick  one  node  • Send  all  coordina9on  traffic  to  that  node  • Hey,  maybe  make  it  a  fat  node!  • WhiteListPolicy

List<InetSocketAddress> whiteList = new ArrayList<InetSocketAddress>();whiteList.add(...);Cluster c = Cluster.builder().withLoadBalancingPolicy( new WhiteListPolicy( new RoundRobinPolicy(), whiteList)).build();

WhiteListing

YourStory:

apply plugin: 'java'repositories { jcenter()} dependencies { compile 'com.datastax.cassandra:cassandra-driver-core:2.1.2' compile 'com.datastax.cassandra:cassandra-driver-mapping:2.1.2' testCompile 'org.testng:testng:6.8.8' testCompile 'junit:junit:4.11'}

MapperObject

CREATE TABLE sensor ( sensor_id int, reading double, time timestamp );

MapperObject

@UDT(keyspace = "IoT_keyspace", name = "sensor") public class Sensor { private int sensorId; private double reading; private Date Time; // getters and setters elided with extreme prejudice...}

MapperObject

MappingManager manager = new MappingManager(session);Mapper mapper = manager.mapper(Sensor.class);Sensor reading = mapper.get("24601");

YourStory:

ResultSetFuture future = session.executeAsync("SELECT * FROM sensor");

// Returns immediately// Go do productive things here…// Then finally block on the results when you must

ResultSet futureResults = future.get();List<Row> rows = resultSet.all();

FutureResults

Executor executor = Executors.newCachedThreadPool();ResultSetFuture future = session.executeAsync("SELECT * FROM sensor");

future.addListener(new Runnable() { public void run() { // Do the things here… } }, executor);

FutureResults

YourStory:

ThankYou!