使用 Spark 的 Cassandra 阅读基准
Cassandra Reading Benchmark with Spark
我正在对 Cassandra 的阅读性能进行基准测试。在测试设置步骤中,我创建了一个具有 1 / 2 / 4 个 ec2 实例和数据节点的集群。我用 1 亿个条目(~3 GB csv 文件)写了 1 table。然后我启动一个 Spark 应用程序,它使用 spark-cassandra-connector 将数据读入 RDD。
但是,我认为行为应该如下:Cassandra(Spark 上相同的实例数量)使用的实例越多,读取速度越快!通过写入,一切似乎都是正确的(如果集群大 2 倍,则快约 2 倍)。
但是:在我的基准测试中,1 个实例集群的读取总是比 2 个或 4 个实例集群更快!!!
我的基准测试结果:
集群大小 4:写入:1750 秒/读取:360 秒
集群大小 2:写入:3446 秒/读取:420 秒
集群大小 1:写入:7595 秒/读取:284 秒
额外尝试 - 使用 CASSANDRA-STRESS 工具
我在 Cassandra 集群(大小为 1 / 2 / 3 / 4 个节点)上启动了 "cassandra-stress" 工具,结果如下:
Clustersize Threads Ops/sek Time
1 4 10146 30,1
8 15612 30,1
16 20037 30,2
24 24483 30,2
121 43403 30,5
913 50933 31,7
2 4 8588 30,1
8 15849 30,1
16 24221 30,2
24 29031 30,2
121 59151 30,5
913 73342 31,8
3 4 7984 30,1
8 15263 30,1
16 25649 30,2
24 31110 30,2
121 58739 30,6
913 75867 31,8
4 4 7463 30,1
8 14515 30,1
16 25783 30,3
24 31128 31,1
121 62663 30,9
913 80656 32,4
结果:使用 4 或 8 个线程时,单节点集群与更大的集群一样快或更快!!!
结果如图:
数据集是集群大小 (1/2/3/4),x 轴是线程,y 轴是 ops/sec。
--> 这里的问题:这些结果是集群范围的结果还是这是对本地节点的测试(因此只有一个环实例的结果)???
有人可以解释一下吗?谢谢!
我 运行 在每个 Cassandra 节点上使用 spark worker 运行 进行了类似的测试。
使用具有 1500 万行(约 1.75 GB 数据)的 Cassandra table,我 运行 一个 spark 作业从 table 创建一个 RDD,每行作为字符串,然后打印行数。
这是我得到的时间:
1 C* node, 1 spark worker - 1 min. 42 seconds
2 C* nodes, 2 spark workers - 55 seconds
4 C* nodes, 4 spark workers - 35 seconds
因此,当 spark worker 与 C* 节点位于同一位置时,它似乎可以很好地扩展节点数量。
如果不将您的工作人员与 Cassandra 放在同一地点,您将迫使所有 table 数据通过网络传输。那会很慢,也许在您的环境中是一个瓶颈。如果您将它们放在一起,那么您将受益于数据局部性,因为 spark 将从每台机器本地的令牌创建 RDD 分区。
您可能还有其他一些瓶颈。我不熟悉 EC2 及其提供的功能。希望它有本地磁盘存储而不是网络存储,因为 C* 不喜欢网络存储。
我正在对 Cassandra 的阅读性能进行基准测试。在测试设置步骤中,我创建了一个具有 1 / 2 / 4 个 ec2 实例和数据节点的集群。我用 1 亿个条目(~3 GB csv 文件)写了 1 table。然后我启动一个 Spark 应用程序,它使用 spark-cassandra-connector 将数据读入 RDD。
但是,我认为行为应该如下:Cassandra(Spark 上相同的实例数量)使用的实例越多,读取速度越快!通过写入,一切似乎都是正确的(如果集群大 2 倍,则快约 2 倍)。
但是:在我的基准测试中,1 个实例集群的读取总是比 2 个或 4 个实例集群更快!!!
我的基准测试结果:
集群大小 4:写入:1750 秒/读取:360 秒
集群大小 2:写入:3446 秒/读取:420 秒
集群大小 1:写入:7595 秒/读取:284 秒
额外尝试 - 使用 CASSANDRA-STRESS 工具
我在 Cassandra 集群(大小为 1 / 2 / 3 / 4 个节点)上启动了 "cassandra-stress" 工具,结果如下:
Clustersize Threads Ops/sek Time
1 4 10146 30,1
8 15612 30,1
16 20037 30,2
24 24483 30,2
121 43403 30,5
913 50933 31,7
2 4 8588 30,1
8 15849 30,1
16 24221 30,2
24 29031 30,2
121 59151 30,5
913 73342 31,8
3 4 7984 30,1
8 15263 30,1
16 25649 30,2
24 31110 30,2
121 58739 30,6
913 75867 31,8
4 4 7463 30,1
8 14515 30,1
16 25783 30,3
24 31128 31,1
121 62663 30,9
913 80656 32,4
结果:使用 4 或 8 个线程时,单节点集群与更大的集群一样快或更快!!!
结果如图:
数据集是集群大小 (1/2/3/4),x 轴是线程,y 轴是 ops/sec。
--> 这里的问题:这些结果是集群范围的结果还是这是对本地节点的测试(因此只有一个环实例的结果)???
有人可以解释一下吗?谢谢!
我 运行 在每个 Cassandra 节点上使用 spark worker 运行 进行了类似的测试。
使用具有 1500 万行(约 1.75 GB 数据)的 Cassandra table,我 运行 一个 spark 作业从 table 创建一个 RDD,每行作为字符串,然后打印行数。
这是我得到的时间:
1 C* node, 1 spark worker - 1 min. 42 seconds
2 C* nodes, 2 spark workers - 55 seconds
4 C* nodes, 4 spark workers - 35 seconds
因此,当 spark worker 与 C* 节点位于同一位置时,它似乎可以很好地扩展节点数量。
如果不将您的工作人员与 Cassandra 放在同一地点,您将迫使所有 table 数据通过网络传输。那会很慢,也许在您的环境中是一个瓶颈。如果您将它们放在一起,那么您将受益于数据局部性,因为 spark 将从每台机器本地的令牌创建 RDD 分区。
您可能还有其他一些瓶颈。我不熟悉 EC2 及其提供的功能。希望它有本地磁盘存储而不是网络存储,因为 C* 不喜欢网络存储。