如何在Spark Streaming中修复数据局部性?

时间:2017-06-30 13:29:59

标签: hadoop apache-spark spark-streaming

Spark版本: 1.6.2

Spark配置:

  • 执行人:18

  • 每个遗嘱执行人的记忆:30g

  • 核心x执行者:2

Kafka配置:

  • 分区:18

上下文

我有一个Spark-streaming管道,它使用Kafka的新Direct方法而不是接收器。此管道从kafka接收数据,转换数据并插入Hive。我们发布用作插入数据的操作的触发器的位置级别等于RACK_LOCAL,而不是PROCESS_LOCALNODE_LOCAL。此外,输入大小列显示网络信息而不是内存。我已经设置了配置变量spark.locality.wait=30s来测试spark是否等到足以选择最佳的位置模式,但是没有显示任何改进。

考虑到 kafka分区= spark 中的num分区是相等的,我认为数据是在最后执行动作的同一执行器中处理的,但我不确定是否看到了结果

Spark task screenshot DAG

有人知道如何将任务强制为NODE_LOCALPROCESS_LOCAL ??

1 个答案:

答案 0 :(得分:2)

如评论中所述,Locality是指所使用信息的来源。 KafkaDirect方法最终使用KafkaRDD来定义原始Kafka Queue节点的位置。这意味着除非您的Kafka计算机与Spark执行程序共存,否则您将无法拥有更好的位置。

使用接收器方法它会报告更好的位置,但仅仅因为它基本上忽略了Kafka - >火花一步。对于接收器,数据正在传输,然后保存在Receiver的运行节点上。这意味着Spark可以将该数据的工作报告为“进程”或“节点”本地,因为它可以处理传输的数据而不会再次使用它,但仍然会发生相同的基础第一次传输传输。