我想使用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接口,但安装这些模块是一个令人头痛的问题,并且是最后的手段)
谢谢!
答案 0 :(得分:9)
经过一些阅读(最值得注意的是:blog.fingertap.org/?1a253760),我成功创建了一个Perl Thrift客户端,并使用它来查询我的服务器。
步骤:
下载,构建和安装Thrift:http://incubator.apache.org/thrift/download/。 不要忘记在lib / perl中安装代码。
在Hive安装(http://svn.apache.org/viewvc/hive/)的下方,从Hive的SVN下载基础架构的.thrift文件。我使用过的文件:fb303.thrift,queryplan.thrift,hive_metastore.thrift和thrift_hive.thrift。 我手动找到了它们,但可能有更好的方法。
使用thrift生成Perl代码:
thrift -r --gen perl hive_service.thrift
注意:我必须为所需的包构建目录树,并对此树的根使用-I
指令。我从错误节俭中得到了所需的结构,但同样,可能会有更优雅的方式来做到这一点。
现在,以下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();
答案 1 :(得分:2)
如果这有用,我最近将其上传到CPAN:
https://metacpan.org/module/Thrift::API::HiveClient
它尚未完全记录,并且没有测试,但我很乐意接受任何人想要发送的补丁! :)
答案 2 :(得分:1)
注意Thrift本身附带了lib文件夹中的Perl库可能会有所帮助。