3

Perl スクリプトからApache Hiveに接続しようとしていますが、次のエラーが発生します。

Thrift::TException=HASH(0x122b9e0)

Hadoop バージョン 2.7.0、Hive バージョン 1.1.0、および Thrift::API::HiveClient バージョン 0.003 で実行しています。私が使用しているスクリプトは次のとおりです。

#!/usr/bin/perl

use English;
use Thrift::API::HiveClient;

connecttoHive();

sub connecttoHive {
    my $client = Thrift::API::HiveClient->new( host => 'localhost', port => 10000 );

    $client->connect() or die "Failed to connect";

    $client -> execute('select count(1) from Koushik.emp2');
    my $result = $client -> fetchAll();
}

これはバージョンの問題が原因である可能性がありますか、それとも他の何かですか?


Thrift-API-HiveClient-0.003ディストリビューションに付属している次のスクリプトも実行してみました。

#!/usr/bin/env perl
use lib 'lib';
use Data::Dumper;
use Try::Tiny;
use Thrift::API::HiveClient;
#use Moose;

my ($host, $port) = (localhost => 10000);

try sub {
  my $client = Thrift::API::HiveClient->new( host => $host, port => $port );
  $client->connect;
  print "Connected\n";
  $client->execute(
    q{ create table if not exists t_foo (foo STRING, bar STRING) }
  );
  $client->execute('show tables');
  print Dumper $client->fetchAll;
  print Dumper $client->getClusterStatus;
  print Dumper $client->get_fields( 'default', 't_foo');
},
catch sub {
  print "ZOMG\n";
  print Dumper($_);
  exit 1;
};

次の出力が得られます。

hduser@ubuntu:~/perl_script$ perl test-thrift.pl
Connected
ZOMG
$VAR1 = bless( {
                 'message' => 'Missing version identifier',
                 'code' => 0
               }, 'Thrift::TException' );

hive-site.xml を変更して HiveServer2 で NOSASL 認証を有効にすると、別のエラーが発生するようになりました。

hduser@ubuntu:~/perl_script$ perl test-thrift.pl
Connected
ZOMG
$VAR1 = bless( {
                 'message' => 'Invalid method name: \'execute\'',
                 'code' => 1
               }, 'TApplicationException' );

を使用して動作しましたThrift::API::HiveClient2

hduser@ubuntu:~/perl_script$ cat test-thrift-client2.pl
#!/usr/bin/env perl
use lib 'lib';
use Data::Dumper;
use Try::Tiny;
use Thrift::API::HiveClient2;
#use Moose;

my ($host, $port) = (localhost => 10000);

try sub {
  my $client = Thrift::API::HiveClient2->new( host => $host, port => $port );
  $client->connect;
  print "Connected\n";
  $client->execute(
    q{ create table if not exists t_foo (foo STRING, bar STRING) }
  );
  $client->execute('show tables');
  print Dumper $client->fetch;
# print Dumper $client->getClusterStatus;
# print Dumper $client->get_fields( 'default', 't_foo');
},
catch sub {
  print "ZOMG\n";
  print Dumper($_);
  exit 1;
};

hduser@ubuntu:~/perl_script$ perl test-thrift-client2.pl
Connected
$VAR1 = [
          [
            'drv_cdr_mp'
          ],
          [
            'emp1'
          ],
          [
            'emp3'
          ],
          [
            'emp_1'
          ],
          [
            'emp_bucket'
          ],
          [
            'emp_incr_test'
          ],
          [
            'emp_rslt'
          ],
          [
            'log_detail'
          ],
          [
            't_foo'
          ],
          [
            'test1_emp1'
          ]
        ];
$VAR2 = '';
4

2 に答える 2

0

HiveServer2 を使用しているので、Thrift::API::HiveClient2 を使用してみてください。それでもうまくいかない場合は、クライアントにデバッグ プリントを出力して、タイムアウトなど、ネットワークに対して何かが起こっているかどうかを確認できます。

于 2016-03-23T23:09:07.040 に答える
0

Thrift::API::HiveServer は、長い間廃止されてきた HiveServer 用です。最近のすべての Hadoop ディストリビューションには HiveServer2 が搭載されているため、Thrift::API::HiveServer2 が必要です。また、 get_tables および get_columns メソッドを確認してください。これにより、例で試したものよりも優れた情報が得られます。

于 2016-05-14T23:34:45.047 に答える