Spark 批量写入 Cassandra:Spark-Cassandra-Connector 与 SSTableLoader(Cassandra Bulk Loader)

Spark Batch Write to Cassandra: Spark-Cassandra-Connector vs SSTableLoader (Cassandra Bulk Loader)

我们正在使用 Datastax spark-cassandra-connector 写入与 spark 部署在不同集群上的 Cassandra 集群。

我们观察到批量加载,即约 500M 记录我们的写入运行(约 1 小时),并且读取性能在写入操作期间下降。虽然写入性能非常好,但这在我们的环境中是不可接受的,因为一些读取请求很关键,应该始终在特定时间范围内响应。

我在 SSL Table Loader Use Case, which appears to solve the same issue by using SSLTableLoader(CassandraBulkLoader 上阅读了一篇文章。

我还阅读了一些 SO 问题,例如 提到与 spark-cassandra-connector 相比,SSLTableLoader 的写入速度可能非常慢。

现在,使 spark-cassandra-connector 更快但导致批量加载读取延迟低的根本原因是什么?此外,SSLTableLoader 除了速度慢之外还有其他缺点吗?

这是正常现象 - 如果您尽可能快地写入数据,则会在磁盘系统上产生负载,并且您的读取速度会变慢。除了将数据写入磁盘之外,您还需要考虑压缩等对 IO 系统造成的额外负载。也有可能你的压缩吞吐量不是很好,因此你的压缩可能会滞后,这可能会导致额外的读取延迟,因为你有太多的 sstable 文件。

您不一定需要使用 sstableloader 进行数据加载。您可以只调整写入参数,这样 Spark 就不会使您的节点过载。例如,这可能包括 following parameters:

  • spark.cassandra.output.concurrent.writes - 将其减少到 2 或 3 而不是默认的 5 - 这将增加加载时间,但应该减少服务器的负载
  • 也许可以调整 spark.cassandra.output.throughputMBPerSec,但我建议从上一个选项开始。

批量加载数据的另一种选择是 DataStax's DSBulk, that can load data from CSV & JSON files. By default it also tries to load the data as fast as possible, but it has options for controlling throughput