Created
August 31, 2017 00:15
-
-
Save paul-brebner/2b5e8d0914d644066b856d4e1fa18656 to your computer and use it in GitHub Desktop.
Instaclustr Technology Evangelism Blog - Java client code sample for connecting to trial cluster
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package test1; | |
import java.util.Date; | |
import com.datastax.driver.core.*; | |
import com.datastax.driver.core.policies.DCAwareRoundRobinPolicy; | |
/* | |
* Simple Java client test to connect to trial cluster, create a time series data table, fill it, query it, and save it as csv for graphing. | |
*/ | |
public class CassTest1 { | |
// the 3 node trial Cassandra test cluster Public IPs. These are dummy values. | |
static String n1PubIP = "01.23.45.678"; | |
static String n2PubIP = "01.234.56.78"; | |
static String n3PubIP = "01.23.456.78"; | |
static String dcName = "hal_sydney"; // this is the DC name you used when created | |
static String user = "user"; | |
static String password = "password"; | |
public static void main(String[] args) { | |
long t1 = 0; // time each CQL operation, t1 is start time t2 is end time, time is t2-t1 | |
long t2 = 0; | |
long time = 0; | |
Cluster.Builder clusterBuilder = Cluster.builder() | |
.addContactPoints( | |
n1PubIP, n2PubIP, n3PubIP // provide all 3 public IPs | |
) | |
.withLoadBalancingPolicy(DCAwareRoundRobinPolicy.builder().withLocalDc(dcName).build()) // your local data centre | |
.withPort(9042) | |
.withAuthProvider(new PlainTextAuthProvider(user, password)); | |
Cluster cluster = null; | |
try { | |
cluster = clusterBuilder.build(); | |
Metadata metadata = cluster.getMetadata(); | |
System.out.printf("Connected to cluster: %s\n", metadata.getClusterName()); | |
for (Host host: metadata.getAllHosts()) { | |
System.out.printf("Datacenter: %s; Host: %s; Rack: %s\n", host.getDatacenter(), host.getAddress(), host.getRack()); | |
} | |
Session session = cluster.connect(); | |
ResultSet rs; | |
boolean createTable = true; | |
if (createTable) { | |
rs = session.execute("CREATE KEYSPACE IF NOT EXISTS hals WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 3}"); | |
rs = session.execute("DROP TABLE IF EXISTS hals.sensordata"); | |
rs = session.execute("CREATE TABLE hals.sensordata(host text, metric text, time timestamp, value double, PRIMARY KEY ((host, metric), time) ) WITH CLUSTERING ORDER BY (time ASC)"); | |
System.out.println("Table hals.sensordata created!"); | |
} | |
// Fill the table with some realistic sensor data. if createTable=false we just ADD data to the table | |
double startValue = 100; // start value for random walk | |
double nextValue = startValue; // next value in random walk, initially startValue | |
int numHosts = 100; // how many host names to generate | |
int toCreate = 1000; // how many times to pick a host name and create all metrics for it | |
boolean usePrepared = false; | |
PreparedStatement prepared = null; | |
// prepare a prepared statement | |
if (usePrepared) | |
{ | |
System.out.println("Using PREPARED statements for INSERT"); | |
prepared = session.prepare("insert into hals.sensordata (host, metric, time, value) values (?, ?, ?, ?)"); | |
} | |
t1 = System.currentTimeMillis(); | |
System.out.println("Creating data... iterations = " + toCreate); | |
for (int r=1; r <= toCreate; r++) { | |
long now = System.currentTimeMillis(); | |
Date date = new Date(now); | |
// generate a random host name | |
String hostname = "host" + (long)Math.round((Math.random() * numHosts)); | |
// do a random walk to produce realistic data | |
double rand = Math.random(); | |
if (rand < 0.5) | |
// 50% chance that value doesn't change | |
; | |
else if (rand < 0.75) | |
// 25% chance that value increases by 1 | |
nextValue++; | |
else | |
// 25% chance that value decreases by 1 | |
nextValue--; | |
// never go negative | |
if (nextValue < 0) | |
nextValue = 0; | |
// comparison of prepared vs. non-prepared statements | |
if (usePrepared) { | |
session.execute(prepared.bind("'" + hostname + "'", "'m1'", date, nextValue)); | |
session.execute(prepared.bind("'" + hostname + "'", "'m2'", date, nextValue * 10)); | |
session.execute(prepared.bind("'" + hostname + "'", "'m3'", date, nextValue * 100)); | |
} | |
else { | |
// fake three metrics (m1, m2, m3) which are somehow related. | |
rs = session.execute("insert into hals.sensordata (host, metric, time, value) values (" + "'" + hostname + "'" + ", " + "'m1'" + ", " + now + "," + (nextValue) + ");" ); | |
rs = session.execute("insert into hals.sensordata (host, metric, time, value) values (" + "'" + hostname + "'" + ", " + "'m2'" + ", " + now + "," + (nextValue * 10) + ");" ); | |
rs = session.execute("insert into hals.sensordata (host, metric, time, value) values (" + "'" + hostname + "'" + ", " + "'m3'" + ", " + now + "," + (nextValue * 100) + ");" ); | |
} | |
} | |
t2 = System.currentTimeMillis(); | |
System.out.println("Created rows = " + toCreate*3 + " in time = " + (t2-t1)); | |
// find the max value for a sample | |
System.out.println("Getting max value for sample..."); | |
t1 = System.currentTimeMillis(); | |
rs = session.execute("select max(value) from hals.sensordata where host='host1' and metric='m1'"); | |
t2 = System.currentTimeMillis(); | |
time = t2-t1; | |
Row row = rs.one(); | |
System.out.println("Max value = " + row.toString() + " in time = " + time); | |
// get all the values for a sample | |
System.out.println("Getting all rows for sample..."); | |
t1 = System.currentTimeMillis(); | |
rs = session.execute("select * from hals.sensordata where host='host1' and metric='m1'"); | |
for (Row rowN : rs) { | |
System.out.println(rowN.toString()); | |
} | |
t2 = System.currentTimeMillis(); | |
time = t2-t1; | |
System.out.println("time = " + time); | |
// get all host/metric permutations | |
System.out.println("Getting all host/metric permutations"); | |
t1 = System.currentTimeMillis(); | |
rs = session.execute("select distinct host, metric from hals.sensordata"); | |
for (Row rowN : rs) { | |
System.out.println(rowN.toString()); | |
} | |
t2 = System.currentTimeMillis(); | |
time = t2-t1; | |
System.out.println("time = " + time); | |
// Note that SELECT * will return all results without limit (even though the driver might use multiple queries in the background). | |
// To handle large result sets, you use a LIMIT clause in your CQL query, or use one of the techniques described in the paging documentation. | |
System.out.println("Select ALL..."); | |
t1 = System.currentTimeMillis(); | |
rs = session.execute("select * from hals.sensordata"); | |
System.out.println("Got rows (without fetching) = " + rs.getAvailableWithoutFetching()); | |
int i = 0; | |
long numBytes = 0; | |
// example use of the data: count rows and total bytes returned. | |
for (Row rowN : rs) | |
{ | |
i++; | |
numBytes += rowN.toString().length(); | |
} | |
t2 = System.currentTimeMillis(); | |
time = t2-t1; | |
System.out.println("Returned rows = " + i + ", total bytes = " + numBytes + ", in time = " + time); | |
} finally { | |
if (cluster != null) cluster.close(); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment