Apache Spark:驱动程序(而不仅仅是执行程序)尝试连接到Cassandra

Man*_*ing 6 scala cassandra apache-spark

我想我还没有完全理解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
Run Code Online (Sandbox Code Playgroud)

这背后的原因是我想优化数据局部性 - 当在集群上运行我的Spark应用程序时,每个Worker只需要与其本地Cassandra节点通信.

现在,当通过spark-submit --deploy-mode client --master spark://machine-1从Machine 1(Spark Master)运行将我的Spark应用程序提交到集群时,我期望以下内容:

  • 在Spark Master上启动Driver实例
  • 驱动程序在每个Spark Worker上启动一个Executor
  • 驱动程序将我的应用程序分发给每个Executor
  • 我的应用程序在每个Executor上运行,并从那里与Cassandra通过谈话 127.0.0.1:9042

但是,情况似乎并非如此.相反,Spark Master尝试与Cassandra交谈(并且失败了,因为Machine 1主机上没有Cassandra节点).

我误解了什么?它的工作方式不同吗?事实上,驱动程序是否从Cassandra读取数据,并将数据分发给Executors?但是memory of Machine 1,即使我的集群的总内存足够,我也永远无法读取大于的数据.

或者,驱动程序是否与Cassandra联系不读取数据,而是查找如何对数据进行分区,并指示执行者读取数据中的"他们"部分?

如果有人能够引起我的兴趣,那将非常感激.

zer*_*323 6

驱动程序负责在工作节点上创建SparkContext,SQLContext和调度任务.它包括创建逻辑和物理计划以及应用优化.为了能够做到这一点,它必须能够访问数据源模式和可能的其他信息,如模式或不同的统计信息.实现细节因源而异,但一般来说,这意味着数据应该可以在包括应用程序主机在内的所有节点上访问.

在一天结束时,您的期望几乎是正确的.在不通过驱动程序的情况下,每个工作人员单独获取数据块,但驱动程序必须能够连接到Cassandra以获取所需的元数据.

  • 在这种情况下,它是关于令牌范围的元数据以及它在节点+1之间的划分方式 (2认同)