1

过去两周我一直在研究 Cassandra,我被困在几个地方,我希望你能帮我解决这个问题。

我已经安装了 apache-cassandra-2.0.1、perlcassa-master、Perl5.10、Thrift::XS 和 Time::HiRes。我仍然无法连接到 Cassandra。当我运行 perl Makefile.PL 我得到以下警告

“警告:未找到先决条件 Class::Accessor 0。为 perlcassa 编写 Makefile” 运行脚本时忽略警告,出现以下错误。“基类包“Class::Accessor”为空。(也许您需要先“使用”定义该包的模块,或者使该模块在@INC 中可用(@INC 包含:/usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perlenter code here/usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .)。在 /usr/local/share/perl5/Cassandra/Types.pm 第 38 行开始失败 - 在 /usr/local/share/perl5/Cassandra/Types.pm 第 38 行中止编译。在 /usr/local 的要求中编译失败/share/perl5/Cassandra/Cas​​sandra.pm 第 11 行。BEGIN 失败 - 在 /usr/local/share/perl5/Cassandra/Cas​​sandra.pm 第 11 行中止编译。在 /usr/local/share/perl5 的要求中编译失败/perlcassa/Client.pm 第 18 行。BEGIN failed - 编译在 /usr/local/share/perl5/perlcassa/Client.pm 第 18 行中止。编译在 /usr/local/share/perl5/perlcassa.pm 处失败第 159 行。BEGIN 失败 - 在 /usr/local/share/perl5/perlcassa.pm 处中止编译 第 159 行。在 ./cassconn.pl 第 2 行的 require 中编译失败。BEGIN failed - 在 ./cassconn 处中止编译。

我的脚本 cassconn.pl

 #!/usr/bin/perl
 use perlcassa;

    my $result = $obj->exec(
    "SELECT n,ei,toj,sal,d FROM sample.test WHERE n='divya'",
    {key_value => 'n'}
     );
    my $row = $result->fetchone();
    print "Row key, col01: ".$row->{key}.", ".$row->{col01}."\n";
4

1 回答 1

0

我不知道它是否会帮助你,我会解释我是如何做到的。

在您的机器上下载并安装 Thrift 编译器。

使用 cpan 为 Perl 客户端应用程序安装 Thrift 库

cpan 节俭

移动到你安装 Cassandra 的目录,里面有interface目录

cd /path/to/cassandra/interface/

然后使用之前安装的 Thrift 为 Perl 生成 Cassandra 库

/path/to/thrift/binary/Thrift --gen Perl cassandra.thrift

它将gen-perl在当前目录中创建一个目录,您需要use在 Perl 脚本中使用语句将其包含在内。这是一个示例脚本,尽管它不适用于最新版本的 Cassandra 和 Thrift,但它非常相似,如果您遇到问题,我会为您提供使用Cassandra-2.0.8and的示例Thrift-0.9.1

#!/usr/bin/perl -w

use strict;
use warnings;

# Change for your environment
use lib '/path/to/cassandra/interface/gen-perl';
use Cassandra::Cassandra;
use Cassandra::Constants;
use Cassandra::Types;

use Thrift;
use Thrift::BinaryProtocol;
use Thrift::Socket;
use Thrift::FramedTransport;

use Data::Dumper;

# localhost and 9160 are default in storage conf for rpc listener
my $socket = new Thrift::Socket('localhost', 9160);
my $transport = new Thrift::FramedTransport($socket);
my $protocol = new Thrift::BinaryProtocol($transport);
my $client = new Cassandra::CassandraClient($protocol);

eval {
    $transport->open();
    my $consistency_level = Cassandra::ConsistencyLevel::ONE;
    my $keyspace = 'DEMO';
    my $column_parent = new Cassandra::ColumnParent();
    $column_parent->{column_family} = "User";
    $column_parent->{super_column} = undef;
    $column_parent->{column} = 'age';

    $client->set_keyspace($keyspace);

    my $column = new Cassandra::Column();

    my $row_key = 'Spider-Man';

    $column->{name} = 'first';
    $column->{value} = 'Peter';
    $column->{timestamp} =  time;
    $client->insert($row_key, $column_parent, $column, $consistency_level);

    $column->{name} = 'last';
    $column->{value} = 'Parker';
    $column->{timestamp} =  time;
    $client->insert($row_key, $column_parent, $column, $consistency_level);

    $column->{name} = 'age';
    $column->{value} = '18';
    $column->{timestamp} =  time;
    $client->insert($row_key, $column_parent, $column, $consistency_level);

    $transport->close();
}; if($@){
    warn(Dumper($@));
}
1;

它向 Cassandra 键空间添加一个条目,DEMO其中包含键spider-man和以下列值peterparker18

这是cassandra-cli执行此脚本后的查询结果:

[default@DEMO] list User;
Using default limit of 100
Using default cell limit of 100
(...)
-------------------
RowKey: spidey
=> (name=age, value=18, timestamp=1404222046)
=> (name=first, value=Peter, timestamp=1404222046)
=> (name=last, value=Parker, timestamp=1404222046)
(...)

4 Rows Returned.
Elapsed time: 367 msec(s).
于 2014-07-01T13:45:45.940 回答