如何在 cassandra 中制作 100 万个插入
how to make 1 million inserts in cassandra
我正在从我的应用程序解析数以千计的 csv 文件,并且我正在为每个解析的行插入到 Cassandra 中。似乎让它 运行 它停止在 2048 插入并抛出 BusyConnection 错误。
我制作大约 100 万个插入的最佳方法是什么?
我是否应该将插入内容作为字符串导出到一个文件中,然后 运行 该文件直接从 CQL 生成这些大量的插入内容,这样我实际上就不会通过网络进行操作?
我们使用脚本解决此类问题。
脚本遍历输入数据并...
- 每次从输入中获取特定数量的数据。
- 等待特定的时间。
- 继续读取和插入数据。
ad 1. 对于我们的配置和数据(最多 10 列,主要是数字和短文本),我们发现 500 到 1000 行是最佳的。
ad 2. 我们将等待时间定义为 n * t。其中 n 是在单个 运行 脚本中处理的行数。 t 是以毫秒为单位的时间常数。 t 的值在很大程度上取决于您的配置;然而,对我们来说t = 70 ms 足以使过程顺利进行。
100 万个请求 - 这并不是一个很大的数字,您可以使用 COPY FROM
命令从 cqlsh
加载它。但是您也可以通过 Java 代码加载这些数据。
从错误消息看来,您正在使用异步 API。您可以将它用于高性能插入,但您需要控制同时处理多少请求(所谓的,飞行中的请求)。
这里有几个方面:
- 从协议的版本 3 开始,每个连接最多可以有 32k 个正在运行的请求,而不是默认使用的 1024 个。你can configure it when creating Cluster object.
- 您需要通过将
session.executeAsync
与一些计数器包装在一起来控制正在运行的请求数,例如 in this example (不是最好的,因为它限制了每个会话的总请求数,而不是在与单个主机的连接上——这将需要更多的逻辑,尤其是围绕令牌感知请求。
我正在从我的应用程序解析数以千计的 csv 文件,并且我正在为每个解析的行插入到 Cassandra 中。似乎让它 运行 它停止在 2048 插入并抛出 BusyConnection 错误。
我制作大约 100 万个插入的最佳方法是什么?
我是否应该将插入内容作为字符串导出到一个文件中,然后 运行 该文件直接从 CQL 生成这些大量的插入内容,这样我实际上就不会通过网络进行操作?
我们使用脚本解决此类问题。
脚本遍历输入数据并...
- 每次从输入中获取特定数量的数据。
- 等待特定的时间。
- 继续读取和插入数据。
ad 1. 对于我们的配置和数据(最多 10 列,主要是数字和短文本),我们发现 500 到 1000 行是最佳的。
ad 2. 我们将等待时间定义为 n * t。其中 n 是在单个 运行 脚本中处理的行数。 t 是以毫秒为单位的时间常数。 t 的值在很大程度上取决于您的配置;然而,对我们来说t = 70 ms 足以使过程顺利进行。
100 万个请求 - 这并不是一个很大的数字,您可以使用 COPY FROM
命令从 cqlsh
加载它。但是您也可以通过 Java 代码加载这些数据。
从错误消息看来,您正在使用异步 API。您可以将它用于高性能插入,但您需要控制同时处理多少请求(所谓的,飞行中的请求)。
这里有几个方面:
- 从协议的版本 3 开始,每个连接最多可以有 32k 个正在运行的请求,而不是默认使用的 1024 个。你can configure it when creating Cluster object.
- 您需要通过将
session.executeAsync
与一些计数器包装在一起来控制正在运行的请求数,例如 in this example (不是最好的,因为它限制了每个会话的总请求数,而不是在与单个主机的连接上——这将需要更多的逻辑,尤其是围绕令牌感知请求。