HBASE-569 DemoClient.php
git-svn-id: https://svn.apache.org/repos/asf/hadoop/hbase/trunk@656511 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
100a1616d4
commit
7ddd733236
|
@ -27,7 +27,7 @@ Hbase Change Log
|
||||||
alls-well to the master
|
alls-well to the master
|
||||||
HBASE-614 Retiring regions is not used; exploit or remove
|
HBASE-614 Retiring regions is not used; exploit or remove
|
||||||
HBASE-538 Improve exceptions that come out on client-side
|
HBASE-538 Improve exceptions that come out on client-side
|
||||||
|
HBASE-569 DemoClient.php (Jim R. Wilson via Stack)
|
||||||
|
|
||||||
Release 0.1.2 - 05/13/2008
|
Release 0.1.2 - 05/13/2008
|
||||||
|
|
||||||
|
|
|
@ -66,6 +66,24 @@
|
||||||
reported back to the master.
|
reported back to the master.
|
||||||
</description>
|
</description>
|
||||||
</property>
|
</property>
|
||||||
|
<property>
|
||||||
|
<name>hbase.regionserver.dns.interface</name>
|
||||||
|
<value>default</value>
|
||||||
|
<description>Name of the network interface which a regionserver
|
||||||
|
should use to determine it's "real" IP address. This lookup
|
||||||
|
prevents strings like "localhost" and "127.0.0.1" from being
|
||||||
|
reported back to the master.
|
||||||
|
</description>
|
||||||
|
</property>
|
||||||
|
<property>
|
||||||
|
<name>hbase.regionserver.dns.interface</name>
|
||||||
|
<value>default</value>
|
||||||
|
<description>Name of the network interface which a regionserver
|
||||||
|
should use to determine it's "real" IP address. This lookup
|
||||||
|
prevents strings like "localhost" and "127.0.0.1" from being
|
||||||
|
reported back to the master.
|
||||||
|
</description>
|
||||||
|
</property>
|
||||||
<property>
|
<property>
|
||||||
<name>hbase.regionserver.info.port</name>
|
<name>hbase.regionserver.info.port</name>
|
||||||
<value>60030</value>
|
<value>60030</value>
|
||||||
|
|
|
@ -0,0 +1,217 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Copyright 2008 The Apache Software Foundation
|
||||||
|
*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
# Change this to match your thrift root
|
||||||
|
$GLOBALS['THRIFT_ROOT'] = dirname(__FILE__).'/thrift';
|
||||||
|
|
||||||
|
require_once( $GLOBALS['THRIFT_ROOT'].'/Thrift.php' );
|
||||||
|
|
||||||
|
require_once( $GLOBALS['THRIFT_ROOT'].'/transport/TSocket.php' );
|
||||||
|
require_once( $GLOBALS['THRIFT_ROOT'].'/transport/TBufferedTransport.php' );
|
||||||
|
require_once( $GLOBALS['THRIFT_ROOT'].'/protocol/TBinaryProtocol.php' );
|
||||||
|
|
||||||
|
# According to the thrift documentation, compiled PHP thrift libraries should
|
||||||
|
# reside under the THRIFT_ROOT/packages directory.
|
||||||
|
require_once( $GLOBALS['THRIFT_ROOT'].'/packages/Hbase/Hbase.php' );
|
||||||
|
|
||||||
|
function printRow( $row, $values ) {
|
||||||
|
echo( "row: {$row}, cols: \n" );
|
||||||
|
asort( $values );
|
||||||
|
foreach ( $values as $k=>$v ) {
|
||||||
|
echo( " {$k} => {$v}\n" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function printEntry( $entry ) {
|
||||||
|
printRow( $entry->row, $entry->columns );
|
||||||
|
}
|
||||||
|
|
||||||
|
$socket = new TSocket( 'localhost', 9090 );
|
||||||
|
$socket->setSendTimeout( 10000 ); // Ten seconds (too long for production, but this is just a demo ;)
|
||||||
|
$socket->setRecvTimeout( 20000 ); // Twenty seconds
|
||||||
|
$transport = new TBufferedTransport( $socket );
|
||||||
|
$protocol = new TBinaryProtocol( $transport );
|
||||||
|
$client = new HbaseClient( $protocol );
|
||||||
|
|
||||||
|
$transport->open();
|
||||||
|
|
||||||
|
$t = 'demo_table';
|
||||||
|
|
||||||
|
?><html>
|
||||||
|
<head>
|
||||||
|
<title>DemoClient</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<pre>
|
||||||
|
<?php
|
||||||
|
|
||||||
|
#
|
||||||
|
# Scan all tables, look for the demo table and delete it.
|
||||||
|
#
|
||||||
|
echo( "scanning tables...\n" );
|
||||||
|
$tables = $client->getTableNames();
|
||||||
|
sort( $tables );
|
||||||
|
foreach ( $tables as $name ) {
|
||||||
|
echo( " found: {$name}\n" );
|
||||||
|
if ( $name == $t ) {
|
||||||
|
echo( " deleting table: {$name}\n" );
|
||||||
|
$client->deleteTable( $name );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Create the demo table with two column families, entry: and unused:
|
||||||
|
#
|
||||||
|
$columns = array(
|
||||||
|
new ColumnDescriptor( array(
|
||||||
|
'name' => 'entry:',
|
||||||
|
'maxVersions' => 10
|
||||||
|
) ),
|
||||||
|
new ColumnDescriptor( array(
|
||||||
|
'name' => 'unused:'
|
||||||
|
) )
|
||||||
|
);
|
||||||
|
|
||||||
|
echo( "creating table: {$t}\n" );
|
||||||
|
try {
|
||||||
|
$client->createTable( $t, $columns );
|
||||||
|
} catch ( AlreadyExists $ae ) {
|
||||||
|
echo( "WARN: {$ae->message}\n" );
|
||||||
|
}
|
||||||
|
|
||||||
|
echo( "column families in {$t}:\n" );
|
||||||
|
$descriptors = $client->getColumnDescriptors( $t );
|
||||||
|
asort( $descriptors );
|
||||||
|
foreach ( $descriptors as $col ) {
|
||||||
|
echo( " column: {$col->name}, maxVer: {$col->maxVersions}\n" );
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Test UTF-8 handling
|
||||||
|
#
|
||||||
|
$invalid = "foo-\xfc\xa1\xa1\xa1\xa1\xa1";
|
||||||
|
$valid = "foo-\xE7\x94\x9F\xE3\x83\x93\xE3\x83\xBC\xE3\x83\xAB";
|
||||||
|
|
||||||
|
# non-utf8 is fine for data
|
||||||
|
$client->put( $t, "foo", "entry:foo", $invalid );
|
||||||
|
|
||||||
|
# try empty strings
|
||||||
|
$client->put( $t, "", "entry:", "" );
|
||||||
|
|
||||||
|
# this row name is valid utf8
|
||||||
|
$client->put( $t, $valid, "entry:foo", $valid );
|
||||||
|
|
||||||
|
# non-utf8 is not allowed in row names
|
||||||
|
try {
|
||||||
|
$client->put( $t, $invalid, "entry:foo", $invalid );
|
||||||
|
throw new Exception( "shouldn't get here!" );
|
||||||
|
} catch ( IOError $e ) {
|
||||||
|
echo( "expected error: {$e->message}\n" );
|
||||||
|
}
|
||||||
|
|
||||||
|
# Run a scanner on the rows we just created
|
||||||
|
echo( "Starting scanner...\n" );
|
||||||
|
$scanner = $client->scannerOpen( $t, "", array( "entry:" ) );
|
||||||
|
try {
|
||||||
|
while (true) printEntry( $client->scannerGet( $scanner ) );
|
||||||
|
} catch ( NotFound $nf ) {
|
||||||
|
$client->scannerClose( $scanner );
|
||||||
|
echo( "Scanner finished\n" );
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Run some operations on a bunch of rows.
|
||||||
|
#
|
||||||
|
for ($e=100; $e>=0; $e--) {
|
||||||
|
|
||||||
|
# format row keys as "00000" to "00100"
|
||||||
|
$row = str_pad( $e, 5, '0', STR_PAD_LEFT );
|
||||||
|
|
||||||
|
$client->put( $t, $row, "unused:", "DELETE_ME" );
|
||||||
|
printRow( $row, $client->getRow( $t, $row ) );
|
||||||
|
$client->deleteAllRow( $t, $row );
|
||||||
|
|
||||||
|
$client->put( $t, $row, "entry:num", "0" );
|
||||||
|
$client->put( $t, $row, "entry:foo", "FOO");
|
||||||
|
printRow( $row, $client->getRow( $t, $row ) );
|
||||||
|
|
||||||
|
$mutations = array(
|
||||||
|
new Mutation( array(
|
||||||
|
'column' => 'entry:foo',
|
||||||
|
'isDelete' => 1
|
||||||
|
) ),
|
||||||
|
new Mutation( array(
|
||||||
|
'column' => 'entry:num',
|
||||||
|
'value' => '-1'
|
||||||
|
) ),
|
||||||
|
);
|
||||||
|
$client->mutateRow( $t, $row, $mutations );
|
||||||
|
printRow( $row, $client->getRow( $t, $row ) );
|
||||||
|
|
||||||
|
$client->put( $t, $row, "entry:num", $e );
|
||||||
|
$client->put( $t, $row, "entry:sqr", $e * $e );
|
||||||
|
printRow( $row, $client->getRow( $t, $row ) );
|
||||||
|
|
||||||
|
$mutations = array(
|
||||||
|
new Mutation( array(
|
||||||
|
'column' => 'entry:num',
|
||||||
|
'isDelete' => '-999'
|
||||||
|
) ),
|
||||||
|
new Mutation( array(
|
||||||
|
'column' => 'entry:sqr',
|
||||||
|
'isDelete' => 1
|
||||||
|
) ),
|
||||||
|
);
|
||||||
|
$client->mutateRowTs( $t, $row, $mutations, 1 ); # shouldn't override latest
|
||||||
|
printRow( $row, $client->getRow( $t, $row ) );
|
||||||
|
|
||||||
|
$versions = $client->getVer( $t, $row, "entry:num", 10 );
|
||||||
|
echo( "row: {$row}, values: \n" );
|
||||||
|
foreach ( $versions as $v ) echo( " {$v};\n" );
|
||||||
|
|
||||||
|
try {
|
||||||
|
$client->get( $t, $row, "entry:foo");
|
||||||
|
throw new Exception ( "shouldn't get here! " );
|
||||||
|
} catch ( NotFound $nf ) {
|
||||||
|
# blank
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
$columns = array();
|
||||||
|
foreach ( $client->getColumnDescriptors($t) as $col=>$desc ) $columns[] = $col;
|
||||||
|
|
||||||
|
echo( "Starting scanner...\n" );
|
||||||
|
$scanner = $client->scannerOpenWithStop( $t, "00020", "00040", $columns );
|
||||||
|
try {
|
||||||
|
while (true) printEntry( $client->scannerGet( $scanner ) );
|
||||||
|
} catch ( NotFound $nf ) {
|
||||||
|
$client->scannerClose( $scanner );
|
||||||
|
echo( "Scanner finished\n" );
|
||||||
|
}
|
||||||
|
|
||||||
|
$transport->close();
|
||||||
|
|
||||||
|
?>
|
||||||
|
</pre>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
|
@ -2,14 +2,13 @@ Hbase Thrift Client Examples
|
||||||
============================
|
============================
|
||||||
|
|
||||||
Included in this directory are sample clients of the HBase ThriftServer. They
|
Included in this directory are sample clients of the HBase ThriftServer. They
|
||||||
all perform the same actions but are implemented in C++, Java, and Ruby
|
all perform the same actions but are implemented in C++, Java, Ruby, and PHP
|
||||||
respectively.
|
respectively.
|
||||||
|
|
||||||
To run/compile this clients, you will first need to install the thrift package
|
To run/compile this clients, you will first need to install the thrift package
|
||||||
(from http://developers.facebook.com/thrift/) and then run thrift to generate
|
(from http://developers.facebook.com/thrift/) and then run thrift to generate
|
||||||
the language files:
|
the language files:
|
||||||
|
|
||||||
thrift -cpp -java -rb \
|
thrift -cpp -java -rb -php \
|
||||||
../../../src/java/org/apache/hadoop/hbase/thrift/Hbase.thrift
|
../../../src/java/org/apache/hadoop/hbase/thrift/Hbase.thrift
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue