【问题标题】:Export large amount of data from Cassandra to CSV将大量数据从 Cassandra 导出到 CSV
【发布时间】:2014-09-13 19:15:21
【问题描述】:

我使用 Cassandra 2.0.9 在一个列族中存储大量数据,比如说 100Gb。我想快速将此数据导出为 CSV。我试过了:

  • sstable2json - 它会产生相当大的 json 文件,很难解析 - 因为工具将数据放在一行中并使用复杂的模式(例如 300Mb 数据文件 = ~2Gb json),这需要很多时间转储,Cassandra 喜欢根据其内部机制更改源文件名
  • COPY - 在相当快的 EC2 实例上导致大量记录超时
  • CAPTURE - 同上,导致超时
  • 分页读取 - 我使用了 timeuuid,但它每秒返回大约 1,5k 条记录

我使用具有快速存储、15 Gb RAM 和 4 个内核的 Amazon Ec2 实例

有没有更好的选择将千兆字节的数据从 Cassandra 导出到 CSV?

【问题讨论】:

  • 您是否考虑过为此制作自己的小玩意儿?使用 datastax 驱动程序,您可以轻松地发出提取数据的请求,然后将它们序列化到 csv 文件中,几乎没有 Java 代码?这将确保您获得您想要的确切结果(不过需要一点努力)。
  • 此外,我没有得到“分页读取”的方法和问题。
  • 使用分页读取 - 使用 python 驱动程序我尝试使用限制(测试值 100 - 10000,基于 TimeUuid)和偏移量读取内容,它真的很慢,Cassandra 是能够在 3 个实例和复制因子 2 上每秒读取大约 1.5k 条记录,我无法想象,仅使用驱动程序就可以构建快速读取,因为对于每一行 Cassandra 必须检查存储了哪些节点数据。

标签: csv cassandra bigdata cassandra-2.0


【解决方案1】:

因为当您尝试从 Cassandra 导出具有数百万行的表时,使用 COPY 将非常具有挑战性,所以我所做的是创建简单的工具来从 cassandra 表中逐块(分页)获取数据并导出将其转换为 CSV。

看看我的example solution使用来自datastax的java库。

【讨论】:

  • 正如我之前写的:我尝试了这个解决方案,但它非常慢 - 它可能每秒传送 1,5k 条记录。您对副本集和 100Gb 数据是否有任何基准?
  • 我们数据集中最大的表是:22gb 的数据 ~ 1.22 亿行 ~ 在 444m38.061 秒内提取。 (使用 1 台主机 cassandra 服务器 4core 8gb ram sata hdd)(大约 4.5k 行/秒,这对我们来说已经足够了,因为我们这样做只是为了将数据迁移到其他地方)
【解决方案2】:

受@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>

【讨论】:

    【解决方案3】:

    2020 年更新:DataStax 提供了一个名为 DSBulk 的特殊工具,用于从 Cassandra(从 Cassandra 2.1 开始)和 DSE(从 DSE 4.7/4.8 开始)加载和卸载数据。在最简单的情况下,命令行如下所示:

    dsbulk unload -k keyspace -t table -url path_to_unload
    

    DSBulk 针对加载/卸载操作进行了高度优化,并且有很多选项,包括从压缩文件导入/导出,提供自定义查询等。

    有一系列关于 DSBulk 的博文,可以提供更多信息和示例:123456

    【讨论】:

      猜你喜欢
      • 2015-09-01
      • 1970-01-01
      • 2019-08-13
      • 2015-07-11
      • 2015-12-19
      • 2021-07-11
      • 2017-01-30
      • 2017-06-15
      • 1970-01-01
      相关资源
      最近更新 更多