当Spark执行程序结果“通过BlockManager发送”是什么意思?

时间:2019-07-23 22:38:12

标签: docker apache-spark cassandra pyspark containers

我有一个主机,在3个docker容器中同时运行spark-master和3个spark-worker。我有另一台主机充当Spark驱动程序,从第一台主机读取数据。

只要返回的数据很小(<6000行),我就能从第一台主机成功检索数据 但是当我尝试读取大块(超过100k行)时,它就失败了。

我检查了执行程序日志,当读取成功时,我收到以下日志消息:

19/07/23 21:54:17 INFO CassandraConnector: Connected to Cassandra cluster: DataMonitor
19/07/23 21:54:17 INFO Executor: Finished task 0.0 in stage 1.0 (TID 4). 1014673 bytes result sent to driver
19/07/23 21:54:24 INFO CassandraConnector: Disconnected from Cassandra cluster: DataMonitor 

但是当读取失败时,我会收到以下日志消息:

19/07/23 22:21:55 INFO CassandraConnector: Connected to Cassandra cluster: DataMonitor
19/07/23 22:22:03 INFO MemoryStore: Block taskresult_13 stored as bytes in memory (estimated size 119.2 MB, free 2.4 GB)
19/07/23 22:22:03 INFO Executor: Finished task 0.3 in stage 4.0 (TID 13). 124969484 bytes result sent via BlockManager)
19/07/23 22:22:10 INFO CassandraConnector: Disconnected from Cassandra cluster: DataMonitor

当结果足够大时,它看起来像是“通过BlockManager发送” 但是,当它足够小时,它会“发送给驱动程序”。

那我该如何获取所有结果都发送给驱动程序?

1 个答案:

答案 0 :(得分:0)

每个执行器运行任务,并将任务结果发送回驱动程序。 如果任务结果较小,则将任务状态直接发送给任务,但是如果结果较大,则通过以下公式计算得出:

taskResultSize > conf.getSizeAsBytes("spark.task.maxDirectResultSize", 1L << 20)

taskResultSize > conf.get("spark.driver.maxResultSize")

source code

执行程序将结果存储在本地磁盘上,并将IndirectTaskResultblockId发送回驱动程序。

然后,驱动程序通过BlockManager使用netty下载远程结果。
Take a look here.

如果不够详细,请告诉我。

相关问题