web-dev-qa-db-ja.com

CassandraからCSVに大量のデータをエクスポートします

私はCassandra 2.0.9を使用して、非常に大量のデータを格納します。たとえば、1つの列ファミリーで100Gbとします。このデータを高速でCSVにエクスポートしたいと思います。

  • sstable2json-解析が難しい非常に大きなjsonファイルが生成される-ツールがデータを1行に入れ、複雑なスキーマを使用するため(例:300Mbデータファイル=〜2Gb json)、時間がかかるダンプし、Cassandraは、内部メカニズムに従ってソースファイル名を変更するのが好きです
  • [〜#〜] copy [〜#〜]-多数のレコードの非常に高速なEC2インスタンスでタイムアウトを引き起こす
  • [〜#〜] capture [〜#〜]-上記と同様に、タイムアウトが発生します
  • ページネーションで読み込み-timeuuidを使用しましたが、1秒あたり約1.5kレコードを返します

高速ストレージ、15 GBのRAMおよび4コアのAmazon Ec2インスタンスを使用しています

ギガバイトのデータをCassandraからCSVにエクスポートするためのより良いオプションはありますか?

21
KrzysztofZalasa

Cassandraから数百万行のテーブルをエクスポートしようとすると、COPYの使用は非常に困難になるため、cassandraテーブルを作成し、CSVにエクスポートします。

見てください サンプルソリューション Javaライブラリを使用)。

3
Firman Gautama

また、データがクラスター化されていて巨大な場合に、さまざまなソリューションを特別に試した後も諦めました。
私は Spark ジョブを使用してすべてのデータをファイル(S3など)にエクスポートしましたが、うまくいきました。

1
user1859675

@ user1859675の答えに触発され、Sparkを使用してCassandraからデータをエクスポートする方法を示します

val cassandraHostNode = "10.xxx.xxx.x5,10.xxx.xxx.x6,10.xxx.xxx.x7";
val spark = org.Apache.spark.sql.SparkSession
                                    .builder
                                    .config("spark.cassandra.connection.Host",  cassandraHostNode)
                                    .appName("Awesome Spark App")
                                    .master("local[*]")
                                    .getOrCreate()

val dataSet = spark.read.format("org.Apache.spark.sql.cassandra")
                        .options(Map("table" -> "xxxxxxx", "keyspace" -> "xxxxxxx"))
                        .load()

val targetfilepath = "/opt/report_values/"
dataSet.write.format("csv").save(targetfilepath)  // Spark 2.x

これが機能するには、クラスパスに "spark-cassandra-connector"が必要です。
使用しているバージョンは以下のとおりです

    <groupId>com.datastax.spark</groupId>
    <artifactId>spark-cassandra-connector_2.11</artifactId>
    <version>2.3.2</version>
1
Remis Haroon