【问题标题】:Connecting cassandra cluster through scala通过scala连接cassandra集群
【发布时间】:2013-10-24 03:16:19
【问题描述】:

我是 scala 和 cassandra 的新手。我知道 cassandra 与 java 使用 hector 的连接性。但我不知道如何通过scala连接cassandra。我想要一个简单的例子。

【问题讨论】:

    标签: scala playframework cassandra


    【解决方案1】:

    我正在使用 datastax java 驱动程序。它的开发仍在 github 上进行。我早些时候看着赫克托,但它似乎死了。这里的文档很有帮助:http://www.datastax.com/documentation/developer/java-driver/1.0/webhelp/index.html#java-driver/quick_start/qsQuickstart_c.html。我将第一个示例翻译成 scala。另外,请查看 typesafe activator 中的 akka-cassandra 示例。干杯。

    object Hello extends App {
    
      import com.datastax.driver.core.Cluster;
      import com.datastax.driver.core.Host;
      import com.datastax.driver.core.Metadata;
      import scala.collection.JavaConversions._
    
      var cluster: Cluster = null
      private var session: Session = null
    
      def connect(node: String) {
        cluster = Cluster.builder().addContactPoint(node).build()
        val metadata = cluster.getMetadata()
        printf("Connected to cluster: %s\n",
          metadata.getClusterName())
        metadata.getAllHosts() map {
          case host =>
            printf("Datatacenter: %s; Host: %s; Rack: %s\n",
              host.getDatacenter(), host.getAddress(), host.getRack())
        }
      }
    
      def close() {
        cluster.shutdown()
      }
    
      this.connect("127.0.0.1");
      this.close();
    }
    

    【讨论】:

    • 你能告诉我我必须放入 sbt 文件中的库依赖项吗?
    • libraryDependencies += "com.datastax.cassandra" % "cassandra-driver-core" % "1.0.4"
    • 我收到错误消息 - “无法找到抽象类型类 'org.apache.cassandra.db.marshal.TimestampType']”
    • @Jagveer 我正在使用发布在 github 页面 "com.datastax.cassandra" % "cassandra-driver-core" % "2.0.0-beta2" 上的最新驱动程序。它编译没有问题。这一行 `private var session: Session = null` 需要删除,否则你必须导入 Session。它是在转录驱动程序示例的第 2 部分时留下的。
    • 是的!我的问题解决了..现在我正在使用 datastax 驱动程序,但它检索记录的速度非常慢,大约是使用 hector 的 10 倍......
    【解决方案2】:

    我一直致力于 Java 驱动程序的 Scala 包装器,以尽量减少样板代码。你可以在这里找到它: https://github.com/InnovaCo/binders-cassandra

    这是一个与某些 Cassandra DB 一起使用的类的示例:

    class Db(session: com.datastax.driver.core.Session) {
    
      implicit val cache = new SessionQueryCache[PlainConverter](session)
    
      // class for binding input/output parameters
      case class User(userId: Int, name: String)
    
      def insertUser(user: User): Future[Unit] = cql"insert into users(userid, name) values (?, ?)".bind(user).execute
    
      // returns Future[Iterator[User]]
      def selectAllUsers: Future[Iterator[User]] = cql"select * from users".all[User]
    
      // if no user is found will throw NoRowsSelectedException
      def selectUser(userId: Int) = cql"select * from users where userId = $userId".one[User]
    
      // if no user is found will return None, otherwise Some(User)
      def selectUserIfFound(userId: Int) = cql"select * from users where userId = $userId".oneOption[User]
    }
    

    要在您的 playframework 项目中使用库,请将此行添加到 build.sbt 文件中:

    libraryDependencies += "eu.inn" %% "binders-cassandra" % "0.2.0"
    

    【讨论】:

      【解决方案3】:

      出现了一些支持 Cassandra 连接的 Scala 项目,包括 Twitter 的 cassie,但它们似乎都已消亡。

      由于您了解 Hector,如果您的类路径中有 Hector jar,您可以根据需要在 Scala 中简单地使用 Hector API。

      例如,借用documentation,你可以这样做:

      val myCluster = HFactory.getOrCreateCluster("test-cluster","localhost:9160")
      

      val template = new ThriftColumnFamilyTemplate[String, String](ksp, columnFamily, StringSerializer.get(), StringSerializer.get())
      

      我是徒手写的,所以语法可能不对,但你明白了。

      【讨论】:

      • 这是个坏建议。您应该按照@kfer38 的建议使用本机 Java 驱动程序。
      • 告诉某人在圣代冰淇淋中添加塔巴斯科酱是“糟糕的建议”。您错过了更广泛的观点,即您可以使用 Scala 语法合并任何 Java API(而不是使用 Scala 构建的 API),由于 OP 的经验,我以 Hector 为例。感谢 @kfer38 提出我的观点的另一个例子。 Datastax 驱动程序如何与作为 Cassandra 客户端的 Hector 进行比较超出了问题的范围。
      • 也许“坏建议”太强了。在你的辩护中,他确实特别询问了赫克托。然而,也很明显(从他第一次使用 Scala 访问 Cassandra 的事实来看)他正在编写新代码,在这种情况下,不建议使用有效弃用的库。在这一点上,本机 Java 库应该被认为是唯一有效的基于 JVM 的选项。
      • 在我今天写这篇文章时,对 Hector 的最后一次更改是在 17 天前对 test 目录和一个月前对 src 目录进行的:github.com/hector-client/hector。对我来说,这听起来几乎没有“过时”。无论如何,你关于赫克托货币的观点是题外话。我将留给 OP 的判断来决定哪个库最适合他的需要。我只能想象当他问你“想试试新的寿司店吃晚饭吗?”时,他必须忍受什么?你的反应会转化为白米与糙米的营养价值。
      • 我正在使用 Play! 2.4 框架和 Cassandra 2.2 版本。我也无法从我的代码连接 Cassandra。我在我的应用程序中使用 Kundera 3.2 库依赖项来通过 Kundera 进行连接。但仍然无法从我的应用程序连接 cassandra db。如果有人可以帮助您在 Play 中正确配置昆德拉!框架并在 build.sbt 文件或 persistence.xml 文件中进行必要的更改?我得到的错误是com.impetus.kundera.KunderaException: All hosts are down. please check servers manully. 请帮忙!!!
      【解决方案4】:

      Datastax 驱动程序 3 Scala 集成

      我找到了一些文章(example)Maga library 展示了如何将 Java Driver 与 Scala 更好地集成,看起来并不难。

      结果是我自己的库,你可以在 GitHub 上找到:https://github.com/atais/scassandra

      它允许在 Scala 中无缝集成 CQL 查询和操作 ListenableFuture 而无需将其映射到 scala.Future

      implicit protected val session: com.datastax.driver.core.Session
      implicit protected val executor: java.util.concurrent.Executor
      
      val selectCQL: ListenableFuture[PreparedStatement] = cql"SELECT * FROM $table WHERE key = ?"
      val result: ListenableFuture[ResultSet] = execute(selectCQL, "my-key")
      
      result.map(rs => rs.one())
            .map(...)
      

      享受:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-19
        • 2018-12-04
        • 2013-06-24
        • 2021-02-23
        • 1970-01-01
        • 2019-11-28
        • 2020-10-04
        相关资源
        最近更新 更多