2011-03-13 18 views
6

Me gustaría conectarme a un almacén de datos Hive basado en Hadoop usando Perl. Hive permite la conexión usando la interfaz Thrift (http://wiki.apache.org/hadoop/Hive/HiveClient), y hay una implementación Thrift para Perl (por ejemplo, http://metacpan.org/pod/Thrift::XS). Sin embargo, el único cliente de Thrift que encontré es un cliente de Cassandra.Perl Thrift client to Hive?

¿Alguna idea de si existe tal cliente o cómo crearlo? Tal vez incluso es posible conectarse sin definir uno de manera explícita.

(PS - también hay una interfaz ODBC/JDBC a la colmena, pero la instalación de estos módulos es un dolor de cabeza, y sería un último recurso)

gracias!

Respuesta

8

Después de leer un poco (sobre todo: blog.fingertap.org/?1a253760), que tuvieron éxito en la creación de un cliente Perl Thrift, y usarlo para consultar mi servidor.

Pasos:

  1. Descargar, construir e instalar Ahorro: http://incubator.apache.org/thrift/download/. No olvide hacer instalar el código en lib/perl.

  2. Descargue los archivos .thrift de la infraestructura del SVN de Hive, bajo la destilación de su instalación de Hive (http://svn.apache.org/viewvc/hive/). Los archivos que he usado: fb303.thrift, queryplan.thrift, hive_metastore.thrift y thrift_hive.thrift. Los he localizado manualmente, pero podría haber mejores formas de hacerlo.

  3. Generar el código de segunda mano utilizando Perl: thrift -r --gen perl hive_service.thrift
    Nota: tenía que construir el árbol del directorio para la requerida incluye, y el uso de la directiva -I a raíz de este árbol. Obtuve la estructura requerida de los errores que me arrojó el ahorro, pero de nuevo, podría haber formas más elegantes de hacerlo.

Ahora, el siguiente código de Perl, escrito alrededor de las líneas del ejemplo de pitón en el cliente de la colmena Wiki, funciona para mí:

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(); 
2

En caso de que esto sea útil, he subido recientemente esta al CPAN:

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

todavía no es todavía completamente documentado, y tiene no hay pruebas, pero me Estoy feliz de tomar cualquier parche que alguien quiera enviar! :)

+0

¡trabajo increíble! ¿Esto también funcionaría con Hive Server 2? Gracias. – Tagar

+0

también, ¿funciona con clústeres Kerberized? gracias de nuevo. – Tagar