hadoop - 如何修复 Spark Streaming 中的数据局部性?

标签 hadoop apache-spark spark-streaming

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分区是相等的,我认为数据是在最后执行操作的同一个执行器中处理的,但我不确定观看结果。

Spark task screenshot DAG

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

最佳答案

正如评论中所说,位置是指所使用的信息的来源。 KafkaDirect 方法最终使用 KafkaRDD它根据原始 Kafka 队列节点定义局部性。这意味着除非您的 Kafka 机器与 Spark 执行器位于同一位置,否则您将无法拥有更好的位置。

使用接收器方法,它会报告更好的局部性,但这只是因为它基本上忽略了 Kafka -> Spark 步骤。对于接收器,数据被传输然后保存在接收器的运行节点上。这意味着 Spark 可以将对该数据的工作报告为本地“进程”或“节点”,因为它可以处理该传输的数据而无需再次移动它,但相同的底层首次传输仍然会发生。

关于hadoop - 如何修复 Spark Streaming 中的数据局部性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44847710/

相关文章:

hadoop - 确定配置单元表中的存储桶数?

linux - 如何知道文件是否成功从本地传输到 hdfs

apache-spark - 在 Spark ML 中,为什么在具有数百万个不同值的列上安装 StringIndexer 会产生 OOM 错误?

java - 使用Spark-Java读取存储在HDFS中的Avro表和架构

java - Drools In Spark 流文件

apache-spark - 无法在 hadoop 二进制文件中找到可执行文件 null\bin\winutils.exe

java - 无法从 Hadoop 中的空字符串创建路径

hadoop - 来自集群未知主机名的主机的 Spark YARN 客户端作业?

java - Spark - 流数据帧/数据集不支持非基于时间的窗口;

java - Spark 流作业已退出,代码为 11