Thrift是一种跨语言的服务部署框架,通过一种中间语言定义RPC接口,然后通过编译器生成不同语言的代码,能够支持常见的开发语言,包括c#,java,python,php,ruby等等。本文尝试使用perl语言,通过thrift连接Hbase。
下载thrift,可至任意apache镜像站下载:http://mirror.bit.edu.cn/apache/thrift/
执行编译命令如下:
# ./configure --prefix=/usr/local/thrift/ --with-cshare=no --with-java=no --with-erlang=no --with-python=no --with-php=no --with-php_extension=no --with-ruby=no --with-haskell=no --with-go=no --with-perl=yes
# make
# make install
在我的个人环境中,安装时出现一些错误,经过检查主要是缺少依赖包,安装好相关依赖包后,编译安装过程就能够顺利进行下去。
主要出现的错误如下:
1、没有编译perl的链接库
尽管我们在编译时强制指定编译perl的链接库,但实际编译时仍然没有编译perl的链接库,输出信息如下:
Building code generators ..... :
Building C++ Library ......... : no
Building C (GLib) Library .... : no
Building Java Library ........ : no
Building C# Library .......... : no
Building Python Library ...... : no
Building Ruby Library ........ : no
Building Haskell Library ..... : no
Building Perl Library ........ : yes
Building PHP Library ......... : no
Building Erlang Library ...... : no
Building Go Library .......... : no
您说其它语言的没有也就算了,因为我们明确地禁用了,但perl为什么没有呢,经过检查configure的输出日志,发现与在perl有关的部分提示:
一看就知道,这是缺少模块,执行下列命令安装Bit::Vector模块:
# perl -MCPAN -e ¨install Bit::Vector¨
2、提示缺少yacc命令
编译时抛出错误信息如下:
/bin/sh ../../ylwrap `test -f ¨src/thrifty.yy¨ || echo ¨./¨`src/thrifty.yy y.tab.c thrifty.cc y.tab.h thrifty.h y.output thrifty.output -- yacc -d
../../ylwrap: line 109: yacc: command not found
直接通过yum命令安装byacc,然后就有yacc命令了:
3、提示缺少flex命令
/bin/sh ../../ylwrap `test -f ¨src/thriftl.ll¨ || echo ¨./¨`src/thriftl.ll .c thriftl.cc -- /bin/sh /data/software/thrift-0.8.0/missing --run flex
/data/software/thrift-0.8.0/missing: line 52: flex: command not found
通过yum命令安装flex相关包:
4、提示缺少perl模块
Warning: prerequisite Class::Accessor 0 not found.
执行下列命令进行安装:
# perl -MCPAN -e ¨install Class::Accessor¨
出现上类错误,安装软件包后如果编译仍然出错,那么就删除MakeFile和config.log文件,而后重新执行./configure命令编译安装。
安装完成后,下面配置perl语言连接hbase。
首先要生成perl的映射,这段要在装有HBase的环境上操作:
而后将生成的gen-perl目录中的Hbase目录,复制到具有perl环境的服务器适当路径下:
Hbase文件中的*.pm就是我们要用到的连接模板。
下面创建一段perl脚本,通过thrift连接HBase,输出当前所有表名:
增加下列内容:
#!/bin/env perl
use strict;
use warnings;
use lib ¨./perl-src¨;
use lib ¨./perl-src/packages¨;
use Data::Dumper;
use Thrift;
use Thrift::BinaryProtocol;
use Thrift::Socket;
use Thrift::BufferedTransport;
use Hbase::Hbase;
my $host = ¨192.168.30.203¨;
my $port = ¨9090¨;
my $socket = new Thrift::Socket($host,$port);
my $transport = new Thrift::BufferedTransport($socket,1024,1024);
my $protocol = new Thrift::BinaryProtocol($transport);
my $client = new Hbase::HbaseClient($protocol);
eval { $transport->open () };
my $tables = $client->getTableNames();
foreach my $table (sort @{$tables})
{
print " found {$table}\n";
}
启动HBase thrift服务:
$ /usr/local/hbase-0.90.5/bin/hbase-daemon.sh start thrift
执行t_thrift.pl脚本:
# perl t_thrift.pl
found {rlog}
found {t}
found {t1}
found {t2}
found {t3}
检查一下输出的结果是您连接的HBase中创建的表对象吗:
$ hbase shell
HBase Shell; enter ¨help<RETURN>¨ for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 0.90.5, r1212209, Fri Dec 9 05:40:36 UTC 2011
hbase(main):001:0> list
TABLE
rlog
t
t1
t2
t3
5 row(s) in 0.6890 seconds
如果没有报错,那么就可以在此基础之上进行扩展,实现通过perl连接HBase并执行各种操作了。
|