Spark版本: 1.6.2
Spark配置:
执行人:18
每个遗嘱执行人的记忆:30g
核心x执行者:2
Kafka配置:
上下文
我有一个Spark-streaming管道,它使用Kafka的新Direct方法而不是接收器。此管道从kafka接收数据,转换数据并插入Hive。我们发布用作插入数据的操作的触发器的位置级别等于RACK_LOCAL
,而不是PROCESS_LOCAL
或NODE_LOCAL
。此外,输入大小列显示网络信息而不是内存。我已经设置了配置变量spark.locality.wait=30s
来测试spark是否等到足以选择最佳的位置模式,但是没有显示任何改进。
考虑到 kafka分区= spark 中的num分区是相等的,我认为数据是在最后执行动作的同一执行器中处理的,但我不确定是否看到了结果
有人知道如何将任务强制为NODE_LOCAL
或PROCESS_LOCAL
??
答案 0 :(得分:2)
如评论中所述,Locality是指所使用信息的来源。 KafkaDirect方法最终使用KafkaRDD来定义原始Kafka Queue节点的位置。这意味着除非您的Kafka计算机与Spark执行程序共存,否则您将无法拥有更好的位置。
使用接收器方法它会报告更好的位置,但仅仅因为它基本上忽略了Kafka - >火花一步。对于接收器,数据正在传输,然后保存在Receiver的运行节点上。这意味着Spark可以将该数据的工作报告为“进程”或“节点”本地,因为它可以处理传输的数据而不会再次使用它,但仍然会发生相同的基础第一次传输传输。