spark executor结果“通过blockmanager发送”是什么意思?

iugsix8n  于 2021-06-14  发布在  Cassandra
关注(0)|答案(1)|浏览(376)

我有一个主机运行一个spark master和3个spark workers,都在docker容器中。我有另一个主机充当spark驱动程序,从第一个主机读取数据。
只要返回的数据很小(<6000行),我就能够成功地从第一台主机检索数据,但当我尝试读取大数据块(100k+行)时,检索失败。
我检查了executor日志,当读取成功时,我得到以下日志消息:

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发送”,但当结果足够小时,它会“发送到驱动程序”。
那我怎么才能把结果都发给司机呢?

yzuktlbb

yzuktlbb1#

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

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

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

源代码
executor将结果存储在本地磁盘上,并使用 blockId 回到司机身边。
然后司机用netty via BlockManager 下载远程结果。
看看这里。
如果不够详细,请告诉我。

相关问题