spark + hadoop数据位置

时间:2015-06-23 15:10:39

标签: hadoop apache-spark hdfs

我有一个文件名的RDD,所以RDD [String]。我通过并行化文件名列表(hdfs中的文件)得到了它。

现在我映射这个rdd,我的代码使用FileSystem.open(path)打开一个hadoop流。然后我处理它。

当我运行任务时,我使用spark UI / Stages,我看到所有任务的“Locality Level”=“PROCESS_LOCAL”。我不认为spark可能像我运行任务那样实现数据局部性(在4个数据节点的集群上),这怎么可能?

2 个答案:

答案 0 :(得分:5)

  

在Spark任务中执行FileSystem.open(path)时,文件   内容将加载到同一JVM进程中的本地变量并准备   RDD(分区)。所以该RDD的数据位置始终如此   的 PROCESS_LOCAL

     

- vanekjar有   已经评论了问题

有关data locality in Spark的其他信息:

根据数据的当前位置,有多个级别的位置。从最近到最远的顺序:

  • PROCESS_LOCAL 数据与正在运行的代码位于同一JVM中。这是最好的地方
  • NODE_LOCAL 数据位于同一节点上。示例可能位于同一节点上的HDFS中,也可能位于同一节点上的另一个执行程序中。这比PROCESS_LOCAL慢一点,因为数据必须在进程之间传输
  • NO_PREF 可以从任何地方快速访问数据并且没有地区偏好
  • RACK_LOCAL 数据位于同一机架服务器上。数据位于同一机架上的不同服务器上,因此需要通过网络发送,通常通过单个交换机
  • 任何数据位于网络上的其他位置,而不在同一个机架中

Spark更喜欢在最佳位置级别安排所有任务,但这并非总是可行。在任何空闲执行程序上没有未处理数据的情况下,Spark会切换到较低的位置级别。

答案 1 :(得分:2)

数据位置是火花的功能之一,可以提高其处理速度。数据位置部分可以在spark tuning guide to Data Locality中看到。开始时写sc.textFile("路径&# 34;)此时数据位置级别将根据您指定的路径,但在此之后,spark尝试将位置级别设置为process_local,以便通过在数据存在的位置(本地)启动进程来优化处理速度。