spark&x2B;hadoop数据局部性
我得到了一个文件名的RDD,所以是一个RDD[String]。我通过并行化文件名列表(hdfs中的文件)来实现这一点 现在我映射这个rdd,我的代码使用FileSystem.open(path)打开一个hadoop流。然后我处理它spark&x2B;hadoop数据局部性,hadoop,apache-spark,hdfs,Hadoop,Apache Spark,Hdfs,我得到了一个文件名的RDD,所以是一个RDD[String]。我通过并行化文件名列表(hdfs中的文件)来实现这一点 现在我映射这个rdd,我的代码使用FileSystem.open(path)打开一个hadoop流。然后我处理它 当我运行我的任务时,我使用spark UI/Stages,我看到所有任务的“本地级别”=“进程\本地”。我认为spark不可能以我运行任务的方式(在一个由4个数据节点组成的集群上)实现数据局部性,这是怎么可能的?数据局部性是spark的功能之一,它可以提高其处理速度。
当我运行我的任务时,我使用spark UI/Stages,我看到所有任务的“本地级别”=“进程\本地”。我认为spark不可能以我运行任务的方式(在一个由4个数据节点组成的集群上)实现数据局部性,这是怎么可能的?数据局部性是spark的功能之一,它可以提高其处理速度。数据局部性部分可以在中看到。在开始时,当您编写sc.textFile(“路径”)时此时,数据局部性级别将符合您指定的路径,但在此之后,spark会尝试使局部性级别处理_local,以便通过在数据存在的位置(本地)启动处理来优化处理速度 在Spark任务中执行
FileSystem.open(path)
时,文件
内容将加载到同一JVM进程中的局部变量中并准备
RDD(分区)。因此,RDD的数据位置始终是
本地处理
--有
已经对这个问题发表了评论
有关的其他信息: 基于数据的当前位置,存在多个级别的位置。从最近到最远的顺序:
- 进程\u LOCAL数据与运行代码位于同一JVM中。这是可能的最佳地点
- 节点\u LOCAL数据位于同一节点上。示例可能在同一节点上的HDFS中,或者在同一节点上的另一个执行器中。这比PROCESS_LOCAL稍微慢一点,因为数据必须在进程之间传输
- 无任何首选项从任何位置访问数据的速度都是一样快的,并且没有位置首选项
- 机架_LOCAL数据位于相同的服务器机架上。数据位于同一机架上的不同服务器上,因此需要通过网络发送,通常通过单个交换机发送
- 任何数据都位于网络的其他位置,而不在同一机架中
Spark更喜欢在最佳位置级别安排所有任务,但这并不总是可能的。在任何空闲执行器上没有未处理数据的情况下,Spark切换到较低的局部性级别。这是原始
RDD[String]
的数据局部性。通过调用`FileSystem.open(path)`您并不是在创建新的RDD。为什么不让Spark将所有文件作为RDD加载,而不是手动打开文件?