【问题标题】:how to make 1 million inserts in cassandra如何在 cassandra 中进行 100 万次插入
【发布时间】:2018-10-31 16:10:22
【问题描述】:

我正在解析我的应用程序中的数千个 csv 文件,并且对于每个解析的行,我都在 Cassandra 中进行插入。似乎让它运行后它在 2048 插入处停止并引发 BusyConnection 错误。

对我来说制作大约 100 万次插入的最佳方法是什么?

我是否应该将插入作为字符串导出到文件中,然后直接从 CQL 运行该文件以进行这些大量插入,这样我实际上就不用通过网络进行操作了?

【问题讨论】:

    标签: database cassandra bulkinsert cassandra-3.0


    【解决方案1】:

    我们使用脚本解决此类问题。

    脚本会遍历输入数据并...

    1. 每次从输入中获取特定数量的数据。
    2. 等待特定的时间。
    3. 继续读取和插入数据。

    ad 1. 对于我们的配置和数据(最多 10 列,主要是数字和短文本),我们发现 500 到 1000 行是最佳的。

    ad 2. 我们将等待时间定义为 n * t。其中 n 是单次运行脚本中处理的行数。 t 是以毫秒为单位的时间常数。 t 的值很大程度上取决于您的配置;但是,对我们来说 t = 70 ms 足以让这个过程顺利进行。

    【讨论】:

    • 您使用什么语言有效地执行步骤 1、2 和 3?这些插入也是从客户端完成的(即通过网络)吗?
    • 另外,当您想一次查询(选择)数千行并将它们发送给客户端时,您会怎么做?我的设计设置方式是将所有数据点存储在一个表中,并且要查询共享属性的数据点,我必须创建一个新表并根据该属性对它们进行索引(这意味着存储重复数据)。您是否建议我只存储第一个大表中的索引名称而不是复制数据,然后对于每个索引(可能是数千个),我去大表并逐个查询它们?
    • @stark0323 什么语言:java。这些插入是否从客户端完成:是的,我们使用分布式微服务架构,我们的一些应用程序从节点执行大型插入,通过网络发送到直接与 cassandra 通信的主节点。但是,我们不允许客户端(连接在前端的应用程序用户)执行如此大的操作。
    • @stark0323(选择)毫不犹豫地使用 Cassandra 复制数据。当我们需要向用户发送数千行时,我们使用分页。但在大多数情况下,我们的用户使用大数据指定部分的聚合/投影。在这些情况下,我们应该始终先预处理数据并将结果存储到新表中。如果原始数据可以更改,则需要定期进行预处理,根据数据一天或两天进行一次。
    • 等待不是很好的方法 - 等待时间可能会根据服务器的负载而有所不同,并且可能导致 Cassandra 过载(如果时间太短),或者不使用它的电源(如果时间太长了)。
    【解决方案2】:

    100 万个请求——这个数字真的不是很大,你可以使用COPY FROM 命令从cqlsh 加载它。但是您也可以通过 Java 代码加载这些数据。

    从错误消息看来,您使用的是异步 API。您可以将其用于高性能插入,但您需要控制同时处理多少请求(所谓的进行中的请求)。

    这里有几个方面:

    1. 从协议的版本 3 开始,每个连接最多可以有 32k 个进行中的请求,而不是默认使用的 1024 个。你can configure it when creating Cluster object
    2. 您需要控制有多少请求在进行中,方法是将session.executeAsync 与一些计数器包装起来,例如in this example(不是最好的,因为它限制每个会话的总请求数,而不是连接到单个主机 - 这将需要更多逻辑,尤其是在令牌感知请求方面)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-15
      • 1970-01-01
      • 2017-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多