Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
spark&x2B;hadoop数据局部性_Hadoop_Apache Spark_Hdfs - Fatal编程技术网

spark&x2B;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的功能之一,它可以提高其处理速度。

我得到了一个文件名的RDD,所以是一个RDD[String]。我通过并行化文件名列表(hdfs中的文件)来实现这一点

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


当我运行我的任务时,我使用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加载,而不是手动打开文件?