Spark 版本:1.6.2
Spark 配置:
执行人:18
每个执行器的内存:30g
核心 x 执行器:2
Kafka 配置:
- 分区:18
上下文:
我有一个 Spark 流管道,它使用 Kafka 的新直接方法而不是接收器。该管道从 kafka 接收数据,转换数据,然后插入到 Hive。我们发布了用作插入数据操作的触发器的局部性级别等于 RACK_LOCAL,而不是 PROCESS_LOCAL 或 NODE_LOCAL。此外,输入大小列显示网络信息而不是内存。我已设置配置变量 spark.locality.wait=30s
来测试 Spark 是否等待足够的时间来选择最佳局部模式,但没有显示出任何改进。
考虑到kafka分区= Spark中的num分区是相等的,我认为数据是在最后执行操作的同一个执行器中处理的,但我不确定观看结果。
有人知道如何强制任务NODE_LOCAL
或PROCESS_LOCAL
吗??
最佳答案
正如评论中所说,位置是指所使用的信息的来源。 KafkaDirect 方法最终使用 KafkaRDD它根据原始 Kafka 队列节点定义局部性。这意味着除非您的 Kafka 机器与 Spark 执行器位于同一位置,否则您将无法拥有更好的位置。
使用接收器方法,它会报告更好的局部性,但这只是因为它基本上忽略了 Kafka -> Spark 步骤。对于接收器,数据被传输然后保存在接收器的运行节点上。这意味着 Spark 可以将对该数据的工作报告为本地“进程”或“节点”,因为它可以处理该传输的数据而无需再次移动它,但相同的底层首次传输仍然会发生。
关于hadoop - 如何修复 Spark Streaming 中的数据局部性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44847710/