docker - Spark 执行器结果“通过 BlockManager 发送”是什么意思?
问题描述
我有一个运行 spark-master 的主机和 3 个 spark-workers,都在 docker 容器中。我有另一台主机充当 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 发送”,但当结果足够小时,它会“发送给驱动程序”。
那么我如何获得它以便将每个结果都发送给驱动程序?
解决方案
每个 Executor 运行任务并将任务的结果发送回驱动程序。如果任务结果小,则直接与任务状态一起发送,但如果结果大,则按以下公式计算:
taskResultSize > conf.getSizeAsBytes("spark.task.maxDirectResultSize", 1L << 20)
或者
taskResultSize > conf.get("spark.driver.maxResultSize")
Executor 将结果存储在本地磁盘上并将IndirectTaskResult发送blockId
回驱动程序。
然后驱动程序使用 netty viaBlockManager
下载远程结果。
看看这里。
如果不够详细,请告诉我。
推荐阅读
- javascript - 我如何在组件内的 JavaScript 等角度 .ts 上的 If 中使用全局变量
- javascript - 画廊从文本 2 而不是文本 1 开始
- python - 在python中将列表中的条目格式化为8位二进制
- java - MacOS 上带有 JavaFX 的状态菜单
- regex - 使用正则表达式匹配带有破折号的单词
- r - 为什么 ddply 在更改函数顺序时会给出 NA 值?
- c - 在 C 中正确打印二叉树
- codeigniter - Codeigniter,将参数传递给语言文件
- python - 如何使用 execute_script 在新选项卡中提交表单
- cmake - 如何在现代 CMake 中覆盖优化级别标志