说我有一个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
答案 0 :(得分:0)
在第一种情况下,Spark通常会在第一个节点上加载一个分区,然后如果找不到空核心,它将在等待spark / locality.wait之后将第二个分区上的第二个分区加载(默认为3秒)。
在第二种情况下,除非两个分区都没有空闲,否则两个分区都将加载到同一节点上。
如果您使用默认配置,许多情况可能会导致这种情况改变。
答案 1 :(得分:0)
您的问题有点假设,因为您不太可能拥有仅具有一个数据节点和2个工作节点的HDFS的Hadoop集群,其中一个既是工作节点又是数据节点。也就是说,带有HDFS的Spark(和MR)的整个想法是将处理带入数据。实际上,工作程序节点是标准Hadoop设置中的数据节点。这是原始意图。
一些变体可以回答您的问题:
假设上述情况,每个工作节点将处理一个分区,并在较新生成的RDD上进行后续转换,直到完成。您当然可以对数据进行重新分区,而发生的情况取决于分区数量和每个工作节点的执行程序数量。
在AWS S3和Mircosoft和gooogle的等效Cloud Storage的情况下,与上述情况一样,它们忽略了数据局部性的原理-即,计算能力与存储分开,并假设网络不是瓶颈-这正是Hadoop处理数据的经典原因,然后它的工作原理与上述类似,即将S3数据传输给Workers。
所有这些都假定已调用操作。
我抛弃了机架感知等原则,因为这变得相当复杂,但是资源管理器理解了这些内容并做出了相应的决定。