Spark任务如何访问HDFS?

时间:2016-07-09 17:04:47

标签: hadoop apache-spark hdfs

假设

  • 对Spark应用程序的输入是HDFS上的1GB文本文件,
  • HDFS块大小为16MB,
  • Spark群集有4个工作节点。

在应用程序的第一阶段,我们通过sc.textFile("hdfs://...")从HDFS读取文件。由于块大小为16MB,因此该阶段将具有64个任务(每个分区/块一个任务)。这些任务将分派到群集节点。我的问题是:

  1. 每个单独的任务是从HDFS获取自己的块,还是驱动程序在调度之前获取所有任务的数据,然后将数据发送到节点?
  2. 如果每个任务自己从HDFS中获取自己的块,它是否要求HDFS获取特定块,还是获取整个文件然后处理它自己的块?
  3. 假设HDFS在其中一个节点上没有文本文件的副本,比如节点一。 HDFS是否第一次从节点1请求文件块时,在节点1上复制文件的副本?如果不是,这是否意味着每次任务从节点1请求文件块时,它必须等待HDFS从其他节点获取数据?
  4. 谢谢!

1 个答案:

答案 0 :(得分:3)

一般来说,Spark对HDFS的访问可能与您认为的那样有效。 Spark使用Hadoop的FileSystem对象来访问HDFS中的数据。

  

每个单独的任务是从HDFS获取自己的块,还是驱动程序在调度之前获取所有任务的数据,然后将数据发送到节点?

每个任务从HDFS中获取自己的块。

  

如果每个任务自己从HDFS中获取自己的块,它是否要求HDFS获取特定块,还是获取整个文件然后处理它自己的块?

它拉出一个特定的块。它不扫描整个文件以进入块。

  

假设HDFS在其中一个节点上没有文本文件的副本,比如节点一。 HDFS是否第一次从节点1请求文件块时,在节点1上复制文件的副本?如果不是,这是否意味着每次任务从节点1请求文件块时,它都必须等待HDFS从其他节点获取数据?

Spark将尝试根据RDD中分区的位置首选项分配任务。对于HadoopRDD(来自sc.textFile),每个分区的位置首选项是具有本地块的数据节点集。如果某个任务无法在数据本地运行,它将在一个单独的节点上运行,并且该块将从具有该块的datanode流式传输到该块上正在执行的任务。