使用perl通過thrift連線hbase讀取資料

junsansi發表於2013-05-14
 

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有關的部分提示:

 
     

    checking for perl... /usr/bin/perl

      checking for perl module Bit::Vector... no
 

一看就知道,這是缺少模組,執行下列命令安裝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命令了:

 
    # yum install byacc
 

 

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相關包:

 
    # yum install flex
 

 

4、提示缺少perl模組

 
    Warning: prerequisite Class::Accessor 0 not found.
 

執行下列命令進行安裝:

 
    # perl -MCPAN -e ¨install Class::Accessor¨
 

 

出現上類錯誤,安裝軟體包後如果編譯仍然出錯,那麼就刪除MakeFile和config.log檔案,而後重新執行./configure命令編譯安裝。

 

安裝完成後,下面配置perl語言連線hbase。

 

首先要生成perl的對映,這段要在裝有HBase的環境上操作:

 
     

    # cp /data/software/thrift-0.8.0/lib/perl/lib/* ~/perl-src/ -r

      # /usr/local/thrift/bin/thrift --gen perl /usr/local/hbase-0.90.5/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift
 

而後將生成的gen-perl目錄中的Hbase目錄,複製到具有perl環境的伺服器適當路徑下:

 
     

    # mkdir perl-src/packages -p

      # cp -a gen-perl/Hbase perl-src/packages  
 

Hbase檔案中的*.pm就是我們要用到的連線模板。

 

下面建立一段perl指令碼,通過thrift連線HBase,輸出當前所有表名:

 
    # vi t_thrift.pl
 

增加下列內容:

 
     

    #!/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¨ for list of supported commands.

     

    Type "exit" 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並執行各種操作了。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7607759/viewspace-761360/,如需轉載,請註明出處,否則將追究法律責任。

相關文章