首页 文章

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

提问于
浏览
6

我想我还没有完全理解Spark是如何工作的 .

这是我的设置:

我在独立模式下运行Spark集群 . 我正在使用4台机器:一台是大师,另外三台是 Worker .

我编写了一个从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应用程序提交到集群时,我希望如下:

  • 在Spark Master上启动了驱动程序实例

  • 驱动程序在每个Spark Worker上启动一个Executor

  • 驱动程序将我的应用程序分发给每个Executor

  • 我的应用程序在每个执行程序上运行,并从那里通过 127.0.0.1:9042 与Cassandra交谈

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

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

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

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

1 回答

  • 6

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

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

相关问题