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 2009/12/08 03:40:19 UTC

ClientExamples reverted to revision 38 on Cassandra Wiki

Dear wiki user,

You have subscribed to a wiki page "Cassandra Wiki" for change notification.

The page ClientExamples has been reverted to revision 38 by gdusbabek.
The comment on this change is: Python and Ruby examples were borked..
http://wiki.apache.org/cassandra/ClientExamples?action=diff&rev1=39&rev2=40

--------------------------------------------------

  High level clients are available.  Use one of these if you can.  See the individual clients for documentation.
- 
   * Ruby:
    * http://github.com/fauna/cassandra/tree/master
    * http://github.com/NZKoz/cassandra_object/tree/master (for Rails)
@@ -22, +21 @@

  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, +42 @@

    $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, +76 @@

    $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, +105 @@

    $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, +141 @@

    print_r($result);
    $transport->close();
  
- 
+  
  
  } catch (TException $tx) {
     print 'TException: '.$tx->why. ' Error: '.$tx->getMessage() . "\n";
  }
  ?>
  }}}
+ 
  == Java ==
  {{{
  import java.util.List;
@@ -206, +206 @@

      }
  }
  }}}
- Alternatively, 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.  The following example comes from /contrib/client_only:
- 
- Writing
- {{{
- StorageService.instance().initClient();
- // sleep for a bit so that gossip can do its thing.
- try
- {
-     Thread.sleep(10000L);
- }
- catch (Exception ex)
- {
- }
- 
- // do some writing.
- for (int i = 0; i < 100; i++)
- {
-     RowMutation change = new RowMutation("Keyspace1", "key" + i);
-     ColumnPath cp = new ColumnPath("Standard1", null, ("colb").getBytes());
-     change.add(new QueryPath(cp), ("value" + i).getBytes(), 0);
- 
-     // don't call change.apply().  The reason is that is makes a static call into Table, which will perform
-     // local storage initialization, which creates local directories.
-     // change.apply();
- 
-     StorageProxy.insert(change);
-     try
-     {
-         Thread.sleep(50L);
-     }
-     catch (Exception ex)
-     {
-     }
-     System.out.println("wrote key" + i);
- }
- System.out.println("Done writing.");
- StorageService.instance().stopClient();
- }}}
- 
- Reading
- {{{
- StorageService.instance().initClient();
- // sleep for a bit so that gossip can do its thing.
- try
- {
-     Thread.sleep(10000L);
- }
- catch (Exception ex)
- {
- }
- 
- // do some queries.
- Collection<byte[]> cols = new ArrayList<byte[]>()
- {{
-     add("colb".getBytes());
- }};
- for (int i = 0; i < 100; i++)
- {
-     List<ReadCommand> commands = new ArrayList<ReadCommand>();
-     SliceByNamesReadCommand readCommand = new SliceByNamesReadCommand("Keyspace1", "key" + i, new QueryPath("Standard1", null, null), cols);
-     readCommand.setDigestQuery(false);
-     commands.add(readCommand);
-     try
-     {
-         List<Row> rows = StorageProxy.readProtocol(commands, ConsistencyLevel.ONE);
-         assert rows.size() == 1;
-         Row row = rows.get(0);
-         ColumnFamily cf = row.cf;
-         if (cf != null)
-         {
-             for (IColumn col : cf.getSortedColumns())
-             {
-                 System.out.println(new String(col.name()) + ", " + new String(col.value()));
-             }
-         }
-         else
-             System.err.println("This output indicates that nothing was read.");
-     }
-     catch (UnavailableException e)
-     {
-         throw new RuntimeException(e);
-     }
-     catch (TimedOutException e)
-     {
-         throw new RuntimeException(e);
-     }
- 
- }
- 
- // no need to do this:
- // StorageService.instance().decommission();
- // 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`
@@ -311, +217 @@

  
  `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.open
+ transport = Thrift::BufferedTransport.new(Thrift::Socket.new("localhost", "9160"))
+ 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()
-   . transport.open() """ Insert the data into Keyspace 1 """
+         """ Insert the data into Keyspace 1 """
-   client.insert(keyspace, key, column_path, value, timestamp, ConsistencyLevel.ZERO); """" Query for data """
+         client.insert(keyspace, key, column_path, value, timestamp, ConsistencyLevel.ZERO);
-   column_parent = ColumnParent(column_family="Standard1") slice_range = SliceRange(start="", finish="") predicate = SlicePredicate(slice_range=slice_range)
+         
+         """" 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)
+         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# ==
@@ -375, +316 @@

              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")
                                          };
  
@@ -419, +360 @@

                                            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
@@ -427, +368 @@

                                         };
  
              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)
@@ -450, +391 @@

      }
  }
  }}}
+ 
  == 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.