spark + hadoop数据位置

kos*_*ios 6 hadoop hdfs apache-spark

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

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

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

mrs*_*vas 5

FileSystem.open(path)在星火任务得到执行,文件的内容将被加载到局部变量在同一个JVM进程,并准备RDD(分区(S))。因此该RDD的数据位置始终是 PROCESS_LOCAL

- vanekjar已经发表意见的问题上


有关Spark中数据局部性的其他信息:

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

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

Spark倾向于在最佳位置级别安排所有任务,但这并不总是可能的。在任何空闲执行器上没有未处理数据的情况下,Spark会切换到较低的本地级别。


kbt*_*kbt 2

数据局部性是 Spark 的功能之一,可提高其处理速度。数据局部性部分可以在Spark 数据局部性调整指南中看到。 开始时,当您编写 sc.textFile("path") 时,此时数据局部性级别将根据您指定的路径,但之后 Spark 尝试将局部性级别设置为 process_local,以便通过在数据存在的位置(本地)启动进程来优化处理速度。