You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by Apache Wiki <wi...@apache.org> on 2010/01/31 04:21:58 UTC
[Cassandra Wiki] Trivial Update of "ClientExamples" by MichaelPearson
Dear Wiki user,
You have subscribed to a wiki page or wiki category on "Cassandra Wiki" for change notification.
The "ClientExamples" page has been changed by MichaelPearson.
The comment on this change is: Added PHP/Pandra to client examples.
http://wiki.apache.org/cassandra/ClientExamples?action=diff&rev1=46&rev2=47
--------------------------------------------------
High level clients are available. These are often more convenient than raw Thrift, which has a certain lowest-common-denominator flavor to it, because that's what it does. But, it's good to understand the Thrift [[API]] to have an idea of what's going on under the hood. See the individual clients for their respective documentation.
+
* Ruby:
* http://github.com/fauna/cassandra/tree/master
* http://github.com/NZKoz/cassandra_object/tree/master (for Rails)
@@ -16, +17 @@
* http://wiki.github.com/jboner/akka/ (Akka includes a Cassandra client but is more than that)
* Java :
* http://code.google.com/p/cassandra-java-client
+ * PHP :
+ * http://github.com/mjpearson/Pandra/tree/master
The rest of this page shows examples of using the low-level [[http://incubator.apache.org/thrift/|Thrift]] interface.
These examples are for Cassandra trunk, which will become 0.4. See ClientExamples03 for examples fitting the 03 API.
== PHP ==
-
Before working with Cassandra and PHP make sure that your [[http://us.php.net/manual/en/function.phpinfo.php|PHP installation]] has [[http://us.php.net/apc/|APC]] enabled. If it does not please re-compile [[http://us.php.net/manual/en/install.php|PHP]] and then recompile [[http://incubator.apache.org/thrift/|Thrift]]. [[http://us.php.net/apc/|APC]] drastically increases the performance of [[http://incubator.apache.org/thrift/|Thrift Interface]].
To create Cassandra.php and cassandra_types.php you must use thrift -gen php interface/cassandra.thrift of the cassandra package the rest of these files come from the main thrift package.
+
{{{
<?php
$GLOBALS['THRIFT_ROOT'] = '/usr/share/php/Thrift';
@@ -43, +46 @@
$protocol = new TBinaryProtocol($transport);
$client = new CassandraClient($protocol);
$transport->open();
-
-
+
+
/* Insert some data into the Standard1 column family from the default config */
-
+
// Keyspace specified in storage=conf.xml
$keyspace = 'Keyspace1';
-
+
// reference to specific User id
$keyUserId = "1";
-
+
// Constructing the column path that we are adding information into.
$columnPath = new cassandra_ColumnPath();
$columnPath->column_family = 'Standard1';
$columnPath->super_column = null;
$columnPath->column = 'email';
-
+
// Timestamp for update
$timestamp = time();
-
+
// We want the consistency level to be ZERO which means async operations on 1 node
$consistency_level = cassandra_ConsistencyLevel::ZERO;
-
+
- // Add the value to be written to the table, User Key, and path.
+ // Add the value to be written to the table, User Key, and path.
$value = "foobar@example.com";
$client->insert($keyspace, $keyUserId, $columnPath, $value, $timestamp, $consistency_level);
- // Add a new column path to be altered.
+ // Add a new column path to be altered.
$columnPath->column = 'age';
//Get a current timestamp
$timestamp = time();
@@ -77, +80 @@
$value = "24";
$client->insert($keyspace, $keyUserId, $columnPath, $value, $timestamp, $consistency_level);
- /*
+ /*
* use batch_insert to insert a supercolumn and its children using the standard config
* builds the structure
- *
+ *
* Super1 : {
* KeyName : {
- * SuperColumnName : {
+ * SuperColumnName : {
- * foo : fooey value
+ * foo : fooey value
- * bar : bar like thing
+ * bar : bar like thing
* }
- * }
+ * }
* }
*/
@@ -106, +109 @@
$super_column = new cassandra_SuperColumn();
$super_column->name = 'SuperColumnName';
$super_column->columns = array($column1, $column2);
-
+
// create columnorsupercolumn holder class that batch_insert uses
$c_or_sc = new cassandra_ColumnOrSuperColumn();
$c_or_sc->super_column = $super_column;
-
+
- // create the mutation (a map of ColumnFamily names to lists ColumnsOrSuperColumns objects
+ // create the mutation (a map of ColumnFamily names to lists ColumnsOrSuperColumns objects
$mutation['Super1'] = array($c_or_sc);
$client->batch_insert($keyspace, 'KeyName', $mutation, $consistency_level);
-
+
/* Query for data */
// Specify what Column Family to query against.
@@ -142, +145 @@
print_r($result);
$transport->close();
-
+
} catch (TException $tx) {
print 'TException: '.$tx->why. ' Error: '.$tx->getMessage() . "\n";
}
?>
}}}
-
== Java ==
{{{
import java.util.List;
@@ -207, +209 @@
}
}
}}}
-
In the trunk, there is a Java "Fat Client" that can be used to bring up a node in client-only mode. A client node may participate in reads or writes and has the added benefit of avoid thrift-related overhead. This is due to be released '''after''' version 0.5 (likely 0.9).
The following example comes from /contrib/client_only:
Writing
+
{{{
StorageService.instance().initClient();
// sleep for a bit so that gossip can do its thing.
@@ -248, +250 @@
System.out.println("Done writing.");
StorageService.instance().stopClient();
}}}
-
Reading
+
{{{
StorageService.instance().initClient();
// sleep for a bit so that gossip can do its thing.
@@ -304, +306 @@
// do this instead:
StorageService.instance().stopClient();
}}}
-
A caveat of doing things this way is that a client cannot go up and down, and then up again without shutting down the entire VM. I.e., you can't initClient(), stopClient() and then initClient() again.
== Ruby ==
-
Install the Thrift gem that will take advantage of the native libraries (previously installed. Reference [[http://chrischandler.name/ruby/using-cassandras-thrift-interface-with-ruby/|Using Cassandra's Thrift Interface with Ruby]])
`shell> sudo gem install thrift`
@@ -317, +317 @@
`shell> thrift --gen rb:new_style cassandra.thrift`
+ {{{#!/usr/bin/env ruby require './cassandra' require './cassandra_constants' require './cassandra_types' require 'pp'
- {{{
- #!/usr/bin/env ruby
- require './cassandra'
- require './cassandra_constants'
- require './cassandra_types'
- require 'pp'
- transport = Thrift::BufferedTransport.new(Thrift::Socket.new("localhost", "9160"))
+ transport = Thrift::BufferedTransport.new(Thrift::Socket.new("localhost", "9160")) transport.open
- transport.open
client = CassandraThrift::Cassandra::Client.new(Thrift::BinaryProtocol.new(transport))
+ keyspace = "Keyspace1" key = "dude_login" columnPath = CassandraThrift::ColumnPath.new(:column_family => "Standard1", :column => "email") value = " dude@example.com " t = Time.now timestamp = t.to_i * 1_000_000 + t.usec
- keyspace = "Keyspace1"
- key = "dude_login"
- columnPath = CassandraThrift::ColumnPath.new(:column_family => "Standard1", :column => "email")
- value = "dude@example.com"
- t = Time.now
- timestamp = t.to_i * 1_000_000 + t.usec
client.insert(keyspace, key ,columnPath, value, timestamp, CassandraThrift::ConsistencyLevel::ZERO)
begin
+
- pp client.get(keyspace, key, columnPath, CassandraThrift::ConsistencyLevel::ONE)
+ . pp client.get(keyspace, key, columnPath, CassandraThrift::ConsistencyLevel::ONE)
+
rescue CassandraThrift::NotFoundException => e
+
- puts "Key not found."
+ . puts "Key not found."
- end
- }}}
+
+ end }}}
== Python ==
+ {{{#!/usr/bin/env python # encoding: utf-8 """ Sample Cassandra Client
- {{{
- #!/usr/bin/env python
- # encoding: utf-8
- """
- Sample Cassandra Client
+ Created by Chris Goffinet on 2009-08-26. """ from thrift import Thrift from thrift.transport import TTransport from thrift.transport import TSocket from thrift.protocol.TBinaryProtocol import TBinaryProtocolAccelerated from cassandra import Cassandra from cassandra.ttypes import * import time, pprint
- Created by Chris Goffinet on 2009-08-26.
- """
- from thrift import Thrift
- from thrift.transport import TTransport
- from thrift.transport import TSocket
- from thrift.protocol.TBinaryProtocol import TBinaryProtocolAccelerated
- from cassandra import Cassandra
- from cassandra.ttypes import *
- import time, pprint
def main():
- socket = TSocket.TSocket("localhost", 9160)
- transport = TTransport.TBufferedTransport(socket)
- protocol = TBinaryProtocol.TBinaryProtocolAccelerated(transport)
- client = Cassandra.Client(protocol)
- pp = pprint.PrettyPrinter(indent = 2)
+ . socket = TSocket.TSocket("localhost", 9160) transport = TTransport.TBufferedTransport(socket) protocol = TBinaryProtocol.TBinaryProtocolAccelerated(transport) client = Cassandra.Client(protocol)
+ pp = pprint.PrettyPrinter(indent = 2) keyspace = "Keyspace1" column_path = ColumnPath(column_family="Standard1",column="email") key = "1" value = " foobar@example.com " timestamp = time.time() try:
- keyspace = "Keyspace1"
- column_path = ColumnPath(column_family="Standard1",column="email")
- key = "1"
- value = "foobar@example.com"
- timestamp = time.time()
-
- try:
- transport.open()
- """ Insert the data into Keyspace 1 """
+ . transport.open() """ Insert the data into Keyspace 1 """
+ client.insert(keyspace, key, column_path, value, timestamp, ConsistencyLevel.ZERO); """" Query for data """ column_parent = ColumnParent(column_family="Standard1") slice_range = SliceRange(start="", finish="") predicate = SlicePredicate(slice_range=slice_range) result = client.get_slice(keyspace, key, column_parent, predicate, ConsistencyLevel.ONE); pp.pprint(result)
- client.insert(keyspace, key, column_path, value, timestamp, ConsistencyLevel.ZERO);
-
- """" Query for data """
- column_parent = ColumnParent(column_family="Standard1")
- slice_range = SliceRange(start="", finish="")
- predicate = SlicePredicate(slice_range=slice_range)
-
- result = client.get_slice(keyspace, key, column_parent, predicate, ConsistencyLevel.ONE);
- pp.pprint(result)
-
- except Thrift.TException, tx:
+ except Thrift.TException, tx:
- print 'Thrift: %s' % tx.message
+ . print 'Thrift: %s' % tx.message
- finally:
+ finally:
- transport.close()
+ . transport.close()
if __name__ == '__main__':
+
- main()
+ . main()
+
}}}
== C# ==
@@ -416, +378 @@
TTransport transport = new TSocket("localhost", 9160);
TProtocol protocol = new TBinaryProtocol(transport);
Cassandra.Client client = new Cassandra.Client(protocol);
-
+
Console.WriteLine("Opening connection");
transport.Open();
System.Text.Encoding utf8Encoding = System.Text.Encoding.UTF8;
long timeStamp = DateTime.Now.Millisecond;
- ColumnPath nameColumnPath = new ColumnPath()
+ ColumnPath nameColumnPath = new ColumnPath()
- {
+ {
- Column_family = "Standard1",
+ Column_family = "Standard1",
Column = utf8Encoding.GetBytes("name")
};
@@ -460, +422 @@
Slice_range = new SliceRange()
{
//Start and Finish cannot be null
- Start = new byte[0],
+ Start = new byte[0],
Finish = new byte[0],
Count = 10,
Reversed = false
@@ -468, +430 @@
};
ColumnParent parent = new ColumnParent() { Column_family = "Standard1" };
- Dictionary<string , List<ColumnOrSuperColumn>> results = client.multiget_slice("Keyspace1",
+ Dictionary<string , List<ColumnOrSuperColumn>> results = client.multiget_slice("Keyspace1",
- new List<string>() { "1", "2"},
+ new List<string>() { "1", "2"},
- parent,
+ parent,
- predicate,
+ predicate,
ConsistencyLevel.ONE);
foreach (KeyValuePair<string, List<ColumnOrSuperColumn>> resultPair in results)
@@ -491, +453 @@
}
}
}}}
-
== Notes ==
-
The Cassandra.Client object is always sending its request to the same Cassandra node in the cluster. The server then determines if and where the request should be routed to (Server-based routing). DNS Round Robin or a Cassandra.Client object pool connected to several servers in the cluster can be used to get higher throughput and availability.
The get_string_property() method can be used to retrieve the active node list:
+
{{{
String jsonServerList = client.get_string_property("token map")
}}}
-
The Cassandra.Client object cannot be used concurrently by multiple threads (not thread safe). Each thread must use their own Cassandra.Client object.