读取HDFS文件时Spark内部如何工作

时间:2019-05-15 10:27:34

标签: apache-spark

说我有一个256 KB的文件存储在一个节点的HDFS文件系统上(作为两个128 KB的块)。该文件内部包含两个块  每个128 KB。假设我只有每个1个核心的两个节点集群。我的理解是,转换过程中的火花将读取完整的文件  在内存中的一个节点上,然后将一个文件块内存数据传输到另一节点,以便两个节点/内核都可以并行执行它?那是正确的吗?

如果两个节点都有两个核心而不是一个核心怎么办?在那种情况下,单个节点上的两个内核可以进行计算?是吗?

         val text = sc.textFile("mytextfile.txt") 
         val counts = text.flatMap(line => line.split(" ")).map(word => (word,1)).reduceByKey(_+_) 
         counts.collect

2 个答案:

答案 0 :(得分:0)

在第一种情况下,Spark通常会在第一个节点上加载一个分区,然后如果找不到空核心,它将在等待spark / locality.wait之后将第二个分区上的第二个分区加载(默认为3秒)。

在第二种情况下,除非两个分区都没有空闲,否则两个分区都将加载到同一节点上。

如果您使用默认配置,许多情况可能会导致这种情况改变。

答案 1 :(得分:0)

您的问题有点假设,因为您不太可能拥有仅具有一个数据节点和2个工作节点的HDFS的Hadoop集群,其中一个既是工作节点又是数据节点。也就是说,带有HDFS的Spark(和MR)的整个想法是将处理带入数据。实际上,工作程序节点是标准Hadoop设置中的数据节点。这是原始意图。

一些变体可以回答您的问题:

  • 假设上述情况,每个工作节点将处理一个分区,并在较新生成的RDD上进行后续转换,直到完成。您当然可以对数据进行重新分区,而发生的情况取决于分区数量和每个工作节点的执行程序数量。

  • 简而言之:如果您最初在具有HDFS的Hadoop群集上分配了N个块/分区,并且分配的N个执行器少于E个,那么您将获得一些块传输(而不是像前面所说的那样进行混洗)其他位置)分配给分配给工作人员的对象,而没有向您的Spark App分配执行器的工作人员,否则显然将块分配给该数据/工作人员节点进行处理。每个块/分区都会以某种方式进行处理,重新组合,然后读取并处理下一组分区或分区,具体取决于转换的处理速度。

  • 在AWS S3和Mircosoft和gooogle的等效Cloud Storage的情况下,与上述情况一样,它们忽略了数据局部性的原理-即,计算能力与存储分开,并假设网络不是瓶颈-这正是Hadoop处理数据的经典原因,然后它的工作原理与上述类似,即将S3数据传输给Workers。

所有这些都假定已调用操作。

我抛弃了机架感知等原则,因为这变得相当复杂,但是资源管理器理解了这些内容并做出了相应的决定。