我建议您花几个小时阅读 Spark 和 C*。我在这篇文章的底部挑选了一些推荐的材料。
现在让我回答你的问题:
我派遣了一份工作。为什么是两个工人做的?一个工人在这里像主人一样吗?
可能与资源可用性或工作中的分区数量有关(可能是后者)。
正如 Russ 所说,“提高工作的并行度。尝试增加工作中的分区数量。通过将工作分成更小的数据集,在给定时间必须驻留在内存中的信息更少。对于 Spark Cassandra 连接器工作,这将意味着减少拆分大小变量。”
要在 1.2 中调整它,请使用:
spark.cassandra.input.split.size spark.cassandra.output.batch.size.rows spark.cassandra.output.batch.size.bytes
在较新的版本中,您还拥有: spark.cassandra.output.throughput_mb_per_sec
我发现一名工人的反序列化时间非常长。其他工人很快完成了这项工作(1 人用了 40 秒,2 人用了 1 秒)。你能对此有所了解吗?
来自实际将功能添加到 web ui的 Kay :
“相对于短作业的任务时间,反序列化任务的时间可能会很大,并且了解什么时候很长可以帮助开发人员意识到他们应该尝试减少闭包大小(例如,通过在任务描述中包含更少的数据)。”
两个工人似乎都与 Cassandra 建立了联系并返回了结果。所以,在我看来,两者都在做同样的工作。你能对此有所了解吗?
Spark 并行工作。因为这是一种分布式计算范式,您可以通过启动并行工作的执行程序来利用多个节点和多个内核。两个执行器都将从 C* 中提取数据,但它们会根据分区提取不同的数据。
有关详细信息,请参阅一些介绍视频。
我仍然想知道 RDD 的实现在哪里适合 Cassandra 的分布式领域。有人可以对此有所了解吗?多个工作人员如何知道他们必须处理 Cassandra 的哪个分区,例如,如果可以在 6 个工作人员之间拆分 10k 个分区?是不是全部由一名工人完成,而处理由其中 6 人完成?即使在这种情况下,所有工作人员的执行逻辑都保持不变(从 Cassandra 和进程中获取)。Spark 是如何做到这一点的?
每个人都将根据分区获取和处理自己的数据。
要获取有关如何划分作业的信息,请使用:
rdd.partitions
如果您将 Spark 和 Cassandra 放在一起,就像DSE中的情况一样,您将获得数据本地化的优势(无需将数据从 c* 流式传输到 spark 工作人员)。
想知道将 Spark 与 Cassandra 一起使用的真正优势。它是在内存管理级别还是有其他一些优势?
这里可能列出的太多了,请参阅推荐阅读/查看。大热门是用于批处理和流分析的 sql 样式查询(连接、聚合、groupby 等)+ 使用 MLLIB 的精美统计建模、使用 graphx 的分析图等。
以下是一些可以帮助您快速入门的好材料:
这是来自 Russ 的关于 Spark 和 C* 可能实现的高级演示:
http ://www.slideshare.net/planetcassandra/escape-from-hadoop
OReily 与来自 DataBricks 的 Sameer 就 DSE 如何与 Spark 集成的网络研讨会:
http ://www.oreilly.com/pub/e/3234
连接器如何读取数据:
https ://academy.datastax.com/demos/how-spark-cassandra-connector-reads-data
一旦您真正尝试使某些东西正常工作,有关故障排除 spark 的重要帖子将很有帮助。这些将回答您的大部分 opps/perf 问题:
http ://www.datastax.com/dev/blog/common-spark-troubleshooting
https://databricks.com/blog/2015/06/16/zen-and-the-art-of-spark-maintenance-with-cassandra.html
来自 Sandy 的两篇类似且有价值的帖子(非 c* 特定):
http: //blog.cloudera.com/blog/2015/03/how-to-tune-your-apache-spark-jobs-part-1/
http ://blog.cloudera.com/blog/2015/03/how-to-tune-your-apache-spark-jobs-part-2/