1

ある cassandra クラスターから別の 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 を使用することを優先しません。

事前に感謝します。

4

4 に答える 4

3

既存のクラスターでスナップショットを作成し、ターゲット クラスターでバルク ローダーを使用します。Spark は必要ありません (そのようにすることもできます)。

手順に関するドキュメントは次のとおりですが、実行する必要があることの概要を説明します。

  1. 既存のクラスターでスナップショットを作成する
  2. scpスナップショットを新しいクラスタのノードに送信 ( )
  3. スキーマのクローンを作成します (すでにこれを行っていると言っていました)
  4. 一括ローダーを使用して、sstables をスナップショットから新しいクラスターにストリーミングします。
于 2015-09-07T13:02:13.927 に答える
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 ホスト プロパティのプロパティのperiod( .) を underscore( _)に変更するだけです。これが spark-cassandra コネクタのバグかどうかはわかりません。

于 2015-10-07T09:49:10.967 に答える
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")
  }

}

関連するドキュメントとサンプル コード スニペットを次に示します

于 2016-02-19T10:30:54.017 に答える