我有一个主机运行一个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发送”,但当结果足够小时,它会“发送到驱动程序”。
那我怎么才能把结果都发给司机呢?
1条答案
按热度按时间yzuktlbb1#
每个执行器运行任务并将任务的结果发送回驱动程序。如果任务结果较小,则直接发送任务状态,如果结果较大,则按以下公式计算:
或
源代码
executor将结果存储在本地磁盘上,并使用
blockId
回到司机身边。然后司机用netty via
BlockManager
下载远程结果。看看这里。
如果不够详细,请告诉我。