假设
在应用程序的第一阶段,我们通过sc.textFile("hdfs://...")
从HDFS读取文件。由于块大小为16MB,因此该阶段将具有64个任务(每个分区/块一个任务)。这些任务将分派到群集节点。我的问题是:
谢谢!
答案 0 :(得分:3)
一般来说,Spark对HDFS的访问可能与您认为的那样有效。 Spark使用Hadoop的FileSystem
对象来访问HDFS中的数据。
每个单独的任务是从HDFS获取自己的块,还是驱动程序在调度之前获取所有任务的数据,然后将数据发送到节点?
每个任务从HDFS中获取自己的块。
如果每个任务自己从HDFS中获取自己的块,它是否要求HDFS获取特定块,还是获取整个文件然后处理它自己的块?
它拉出一个特定的块。它不扫描整个文件以进入块。
假设HDFS在其中一个节点上没有文本文件的副本,比如节点一。 HDFS是否第一次从节点1请求文件块时,在节点1上复制文件的副本?如果不是,这是否意味着每次任务从节点1请求文件块时,它都必须等待HDFS从其他节点获取数据?
Spark将尝试根据RDD中分区的位置首选项分配任务。对于HadoopRDD
(来自sc.textFile
),每个分区的位置首选项是具有本地块的数据节点集。如果某个任务无法在数据本地运行,它将在一个单独的节点上运行,并且该块将从具有该块的datanode流式传输到该块上正在执行的任务。