我有一个主机,在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发送” 但是,当它足够小时,它会“发送给驱动程序”。
那我该如何获取所有结果都发送给驱动程序?
答案 0 :(得分:0)
每个执行器运行任务,并将任务结果发送回驱动程序。 如果任务结果较小,则将任务状态直接发送给任务,但是如果结果较大,则通过以下公式计算得出:
taskResultSize > conf.getSizeAsBytes("spark.task.maxDirectResultSize", 1L << 20)
或
taskResultSize > conf.get("spark.driver.maxResultSize")
执行程序将结果存储在本地磁盘上,并将IndirectTaskResult和blockId
发送回驱动程序。
然后,驱动程序通过BlockManager
使用netty下载远程结果。
Take a look here.
如果不够详细,请告诉我。