卡桑德拉的开始

事前准备 (Shì

安装,请参考Cassandra Wiki。
※ 使用Cassandra版本1.2.3。

创建keyspace

假设已经通过cassandra-cli连接到了Cassandra。并且假设keyspace的名称为Keyspace1。

创建

执行 create keyspace Keyspace1;。

创建 ColumnFamily

在这里,我们将要创建的ColumnFamily名字写为Standard1。

选择keyspace

执行Keyspace1。

制作

执行命令:创建列族Standard1。
* 由于未指定选项并默认运行,因此没有特别指定。

通过应用程序的连接

在这里,以Cassandra Wiki的ThriftExamples中Java部分为参考(用于学习语言本身),使用Scala、Gradle和TestNG,尝试创建一个简单的客户端。
请略去关于Scala语法、Gradle使用方法、TestNG使用方法以及项目创建的说明。

构建.gradle

使用的build.gradle如下所示。
“`build.gradle
应用插件:’java’
应用插件:’eclipse’
应用插件:’scala’

sourceCompatibility = 1.7
version = ‘1.0’
jar {
manifest {
attributes ‘Implementation-Title’: ‘Gradle快速入门’, ‘Implementation-Version’: version
}
}

repositories {
仓库 {
中央仓库()
}
}

依赖关系{
编译 ‘org.apache.thrift:libthrift:0.9.0’
编译 ‘org.apache.cassandra:cassandra-thrift:1.2.3’
测试编译 ‘org.testng:testng:6.8’
}

测试 {
系统属性 ‘property’: ‘value’
}

上传存档{
仓库{
平面目录{
目录 ‘repos’
}
}
}

客户代码

请忽略对于被标注为”(详细未调查)”的部分的评论内容,因为我们没有详细调查过,也不清楚具体情况。

package learning.client.cassandra

import org.apache.cassandra.thrift.Cassandra
import org.apache.cassandra.thrift.Column
import org.apache.cassandra.thrift.ColumnParent
import org.apache.cassandra.thrift.ConsistencyLevel
import org.apache.thrift.protocol.TBinaryProtocol
import org.apache.thrift.transport.TFramedTransport
import org.apache.thrift.transport.TSocket
import java.nio.ByteBuffer
import java.io.Closeable
import org.apache.cassandra.thrift.ColumnOrSuperColumn
import org.apache.cassandra.thrift.ColumnPath
import org.apache.cassandra.thrift.SliceRange
import org.apache.cassandra.thrift.SlicePredicate

/**
 * @author PoaD
 *
 */
class CassandraClient(hostname : String, port : Int, keyspace : String) extends Closeable {
    // おまじない(接続するための設定)
    private val transport = new TFramedTransport(new TSocket(hostname, port))
    private val protocol = new TBinaryProtocol(transport)
    // 接続
    transport.open()
    // Clientオブジェクトの生成
    private val client = new Cassandra.Client(protocol)
    // 使用するkeyspaceの設定
    client.set_keyspace(keyspace)

    /**
     * valueで指定された値をkeyおよび、parentに該当するcolumnとして書き込みます。
     *
     * @param key insertするデータのキー
     * @param parent insertする先のColumnFamily
     * @param value insertする値
     * @param level データ保持担当Nodeを決定するための値{@link http://lunarium.info/arc/index.php/Cassandra%E3%81%AE%E6%A7%8B%E9%80%A0#Data.E6.93.8D.E4.BD.9C.E3.81.AEAlgorithm} を参照
     */
    def insert(key : String, parent : ColumnParent, name : ByteBuffer, value : ByteBuffer, level : ConsistencyLevel) : Unit = {
        val timestamp = System.currentTimeMillis()
        val column = new Column()
        column.setName(name)
        column.setValue(value)
        column.setTimestamp(timestamp)
        client.insert(ByteBuffer.wrap(key.getBytes("UTF-8")), parent, column, level)
    }

    /**
     * keyおよび、parentに該当するcolumnの一覧を返します。
     *
     * @param key 取得するデータのキー
     * @param parent 取得する元のColumnFamily
     * @param start 取得するデータの範囲の開始位置?(詳細未調査)
     * @param end 取得するデータの範囲の終了位置?(詳細未調査)
     * @param reversed 並び順を反転?(詳細未調査)
     * @param count 取得するデータの最大数?(詳細未調査)
     * @param level データ保持担当Nodeを決定するための値{@link http://lunarium.info/arc/index.php/Cassandra%E3%81%AE%E6%A7%8B%E9%80%A0#Data.E6.93.8D.E4.BD.9C.E3.81.AEAlgorithm} を参照
     * @return keyおよび、parentに該当するcolumnの一覧
     */
    def getClumns(key : String, parent : ColumnParent, start : ByteBuffer, end : ByteBuffer, reversed : Boolean, count : Int, level : ConsistencyLevel) : java.util.List[ColumnOrSuperColumn] = {
        val predicate = new SlicePredicate()
        predicate.setSlice_range(new SliceRange(start, end, reversed, count))
        client.get_slice(ByteBuffer.wrap(key.getBytes("UTF-8")), parent, predicate, level)
    }

    /**
     * クライアントを終了します。
     */
    def close = {
        transport.flush()
        transport.close()
    }
}

测试代码

大致上是这样。写下来,读一遍,检查内容是否相同,就结束了。

package learning.client.cassandra

import org.testng.annotations.Test
import org.testng.annotations.BeforeClass
import org.apache.cassandra.thrift.ColumnPath
import org.apache.cassandra.thrift.ColumnParent
import org.apache.cassandra.thrift.ConsistencyLevel
import java.nio.ByteBuffer
import org.apache.cassandra.thrift.SlicePredicate
import org.apache.cassandra.thrift.SliceRange
import org.apache.cassandra.thrift.ColumnOrSuperColumn
import org.testng.Assert

import scala.collection.convert.DecorateAsJava

/**
 * @author PoaD
 *
 */
class CassandraClientTest {

    @Test
    def test() = {
        // テスト対象
        val target = new CassandraClient("localhost", 9160, "Keyspace1")

        val key = "1"
        val name = "name"
        val value = "test value"
        val parent = new ColumnParent("Standard1") // Column Familyの指定
        // 書き込み
        target.insert(
            key,
            parent,
            ByteBuffer.wrap(name.getBytes("UTF-8")),
            ByteBuffer.wrap(value.getBytes("UTF-8")),
            ConsistencyLevel.ALL)

        // 書き込んだ結果の取得
        val columns : java.util.List[ColumnOrSuperColumn] = target.getClumns(
            key,
            parent,
            ByteBuffer.wrap(new Array[Byte](0)),
            ByteBuffer.wrap(new Array[Byte](0)),
            false,
            100,
            ConsistencyLevel.ALL)
        // 取得内容の検証
        Assert.assertEquals(columns.size(), 1)
        Assert.assertEquals(columns.get(0).getColumn().getName(), name.getBytes("UTF-8"))
        Assert.assertEquals(columns.get(0).getColumn().getValue(), value.getBytes("UTF-8"))
        target.close // clientの終了
    }
}
bannerAds