如何将columnfamily从一个cassandra集群复制到另一个?

时间:2015-09-06 19:03:55

标签: cassandra apache-spark apache-spark-sql spark-cassandra-connector

如何将列家庭从一个cassandra集群复制到另一个?

情境:

  1. 我只拥有主机的IP(源集群和目标集群),端口,key_space名称和column_family名称。
  2. 我已经在目标集群中创建了元数据(只需要复制数据)。
  3. 最优先,我希望使用spark-cassandra连接器JAVA API在单个/多个spark作业(中间创建DataFrame,然后保存它)中完成此操作。
  4. 中等优先,使用来自datastax的cassandra-java驱动程序。
  5. 最不优先,使用cassandra-jdbc驱动程序和spark-cassandra连接器JAVA API。
  6. 任何帮助将不胜感激。谢谢。

3 个答案:

答案 0 :(得分:3)

在现有群集上拍摄快照,并在目标群集上使用批量加载器,不需要Spark(尽管你可以这样做)。

以下是关于程序的the docs,但我将提供您需要做的事情的高级概述。

  1. 在现有群集上拍摄快照
  2. 将快照发送(scp)到新群集上的节点
  3. 创建架构的克隆(你说你已经完成了这个)
  4. 使用批量加载程序将快照中的sstables流式传输到新群集中。

答案 1 :(得分:3)

经过大量努力,我们找到了解决方案。这个解决方案非常简单和疯狂。我们可以使用spark来做到这一点,让我们看看。

我们在做什么(哪些没效果):

// Reading from first cassandra cluster

dataframe = cassandraSQLContext.read().format("org.apache.spark.sql.cassandra").options("otherOptionsMap").option("spark.cassandra.connection.host","firstClusterIP").load();

// Writing to second cassandra cluster

dataframe.write.mode("saveMode").options("otherOptionsMap").option("spark.cassandra.connection.host","secondClusterIP").save();

什么工作正常:

// Reading from first cassandra cluster

dataframe = cassandraSQLContext.read().format("org.apache.spark.sql.cassandra").options("otherOptionsMap").option("spark_cassandra_connection_host","firstClusterIP").load();

// Writing to second cassandra cluster

dataframe.write.mode("saveMode").options("otherOptionsMap")option("spark_cassandra_connection_host","secondClusterIP").save();

是的,这是正确的,您只需将期间(. 更改为下划线(_,以获取spark-cassandra主机中的属性属性。我不知道这是不是spark-cassandra连接器中的错误。

答案 2 :(得分:2)

如果您正在使用spark-cassandra-connector,则默认情况下它支持连接多个群集。相关的代码段如下:

import com.datastax.spark.connector._
import com.datastax.spark.connector.cql._

import org.apache.spark.SparkContext


def twoClusterExample ( sc: SparkContext) = {
  val connectorToClusterOne = CassandraConnector(sc.getConf.set("spark.cassandra.connection.host", "127.0.0.1"))
  val connectorToClusterTwo = CassandraConnector(sc.getConf.set("spark.cassandra.connection.host", "127.0.0.2"))

  val rddFromClusterOne = {
    // Sets connectorToClusterOne as default connection for everything in this code block
    implicit val c = connectorToClusterOne
    sc.cassandraTable("ks","tab")
  }

  {
    //Sets connectorToClusterTwo as the default connection for everything in this code block
    implicit val c = connectorToClusterTwo
    rddFromClusterOne.saveToCassandra("ks","tab")
  }

}

Here是相关文档和示例代码段。