我想我还没有完全理解Spark是如何工作的。
这是我的设置:
我在独立模式下运行Spark群集。我正在使用4台机器:一台是大师,另外三台是工人。
我编写了一个从Cassandra集群读取数据的应用程序(参见https://github.com/journeymonitor/analyze/blob/master/spark/src/main/scala/SparkApp.scala#L118)。
3节点Cassandra集群在同样承载Spark Worker节点的机器上运行。 Spark Master节点不运行Cassandra节点:
Machine 1 Machine 2 Machine 3 Machine 4
Spark Master Spark Worker Spark Worker Spark Worker
Cassandra node Cassandra node Cassandra node
这背后的原因是我想优化数据局部性 - 当在集群上运行我的Spark应用程序时,每个Worker只需要与其本地Cassandra节点通信。
现在,通过从Machine 1(Spark Master)运行spark-submit --deploy-mode client --master spark://machine-1
将我的Spark应用程序提交到群集时,我希望如下:
127.0.0.1:9042
然而,情况似乎并非如此。相反,Spark Master尝试与Cassandra交谈(并且失败,因为Machine 1主机上没有Cassandra节点)。
我误解了什么?它的工作方式不同吗?事实上,驱动程序是否从Cassandra读取数据,并将数据分发给Executors?但是,即使我的集群的总内存足够,我也永远无法读取大于memory of Machine 1
的数据。
或者,驱动程序是否与Cassandra交谈不是为了读取数据,而是为了找出如何对数据进行分区,并指示执行者读取数据中的“他们”部分?
如果有人能够引起我的注意,那将非常感激。
答案 0 :(得分:6)
驱动程序负责在工作节点上创建SparkContext,SQLContext和调度任务。它包括创建逻辑和物理计划以及应用优化。为了能够做到这一点,它必须能够访问数据源模式和可能的其他信息,如模式或不同的统计信息。实现细节因源而异,但一般来说,这意味着数据应该可以在包括应用程序主机在内的所有节点上访问。
在一天结束时,您的期望几乎是正确的。在不通过驱动程序的情况下,每个工作人员单独获取数据块,但驱动程序必须能够连接到Cassandra以获取所需的元数据。