7

我想使用 Perl 连接到基于 Hadoop 的 Hive 数据存储。Hive 允许使用 Thrift 接口 ( http://wiki.apache.org/hadoop/Hive/HiveClient ) 进行连接,并且 Perl 有一个 Thrift 实现 (例如http://metacpan.org/pod/Thrift::XS ) . 但是,我发现的唯一 Thrift 客户端是 Cassandra 客户端。

如果存在这样的客户,或者如何创建它,有什么想法吗?也许甚至可以在没有明确定义的情况下进行连接?

(PS - Hive 也有一个 ODBC/JDBC 接口,但是安装这些模块是一件令人头疼的事情,并且将是最后的手段)

谢谢!

4

3 回答 3

9

经过一番阅读(最值得注意的是:blog.fingertap.org/?1a253760),我成功地创建了一个 Perl Thrift 客户端,并使用它来查询我的服务器。

脚步:

  1. 下载、构建和安装 Thrift:http: //incubator.apache.org/thrift/download/。不要忘记在 lib/perl 中安装代码。

  2. 从 Hive 的 SVN 下载基础架构的 .thrift 文件,位于 Hive 安装的 dist 下 ( http://svn.apache.org/viewvc/hive/ )。我使用过的文件:fb303.thrift、queryplan.thrift、hive_metastore.thrift 和 thrift_hive.thrift。我已经手动定位了它们,但可能有更好的方法来做到这一点。

  3. 使用 thrift 生成 Perl 代码: thrift -r --gen perl hive_service.thrift
    注意:我必须为所需的包含构建目录树,并使用-I该树根的指令。我从 thrift 扔给我的错误中得到了所需的结构,但同样,可能有更优雅的方法可以做到这一点。

现在,以下 Perl 代码围绕 Hive 客户端 Wiki 中的 python 示例的行编写,适用于我:

use Thrift;  

use Thrift::Socket;  
use Thrift::FramedTransport;  
use Thrift::BinaryProtocol;  
use lib <LOCATION OF GENERATED PERL CODE>;  
use ThriftHive;  

# init variables ($host, $port, $query)
#  
  
my $socket = Thrift::Socket->new($host, $port);  
my $transport = Thrift::BufferedTransport->new($socket);  
my $protocol = Thrift::BinaryProtocol->new($transport);  
my $client = ThriftHiveClient->new($protocol);  
  
eval {$transport->open()}; #do something with Exceptions  
eval {$client->execute($query)};  
  
for (my $i = 0; $i < $count; $i++)  
{         
   my $row;  
   eval {$row = $client->fetchOne()};  
  
   #use $row  
}  
  
$transport->close();  
于 2011-03-15T13:09:09.553 回答
2

如果这有帮助,我最近将其上传到 CPAN:

https://metacpan.org/module/Thrift::API::HiveClient

它还没有完全记录,也没有测试,但我很高兴接受任何人想要发送的任何补丁!:)

于 2012-09-13T14:50:54.783 回答
1

注意 Thrift 本身在 lib 文件夹中附带了一个 Perl 库可能会有所帮助。

http://svn.apache.org/viewvc/thrift/trunk/lib/perl/lib/

于 2011-03-15T12:30:38.743 回答