我有一个文件名的RDD,所以RDD [String]。我通过并行化文件名列表(hdfs中的文件)得到了它。
现在我映射这个rdd,我的代码使用FileSystem.open(path)打开一个hadoop流。然后我处理它。
当我运行任务时,我使用spark UI / Stages,我看到所有任务的“Locality Level”=“PROCESS_LOCAL”。我不认为spark可能像我运行任务那样实现数据局部性(在4个数据节点的集群上),这怎么可能?
答案 0 :(得分:5)
在Spark任务中执行
FileSystem.open(path)
时,文件 内容将加载到同一JVM进程中的本地变量并准备 RDD(分区)。所以该RDD的数据位置始终如此 的PROCESS_LOCAL
强>- vanekjar有 已经评论了问题
有关data locality in Spark的其他信息:
根据数据的当前位置,有多个级别的位置。从最近到最远的顺序:
Spark更喜欢在最佳位置级别安排所有任务,但这并非总是可行。在任何空闲执行程序上没有未处理数据的情况下,Spark会切换到较低的位置级别。
答案 1 :(得分:2)
数据位置是火花的功能之一,可以提高其处理速度。数据位置部分可以在spark tuning guide to Data Locality中看到。开始时写sc.textFile("路径&# 34;)此时数据位置级别将根据您指定的路径,但在此之后,spark尝试将位置级别设置为process_local,以便通过在数据存在的位置(本地)启动进程来优化处理速度。