2017-06-04 63 views
1

Spark在RDD中创建逻辑分区。我有两个问题: -同一节点上的分区处理?

1)Google上的每一处都有人说,分区有助于并行处理,其中每个分区可以在单独的节点上处理。我的问题是如果我有多核心 机器,我不能在同一节点处理分区?

2)说我从文件系统读取文件,并创建一个具有四个分区的RDD。现在每个分区可以进一步分为RDD吗?例如: -

firstRDD=sc.textFile("hdfs://...") 
//firstRDD contains four partition which are processed on four diff nodes 
secondRDD=firstRDD.filter(someFunction); 
// Now will each node create separate secondRDD which will have further paritions ? 

回答

1

一种输入文本文件分割成4个分区,其可以是单个节点内或至多4个节点将被分成多个分区,并且将因此由相同的执行器被评价为最初阅读它们。 但是,你可能会用repartition RDD /数据框来增加并行性(比如你的64个执行者有64个分区)。这将迫使一个洗牌,这可能是昂贵的,但值得特别是在计算昂贵的工作。这是一个问题的常见情况是读取像GZIP文件这样的不可分割的文件。无论大小如何,单个执行者都必须读取文件(并进行处理!!)。因此,重新分区对于许多GZIP工作负载非常有利,因为它有利于并行计算。

+0

你说'..将由最初读取它们的相同执行程序评估'如果在4个节点上处理4个部分,那么将有4个执行程序不是1对吗?另外,当你'但是,你可能会重新分区......'你的意思是一旦在RDD中创建了一个分区,它将不会被默认地进一步分区,直到我们明确地做到这一点为止? –

+0

是,如果在1个分区中读取4个节点,每个分区包含4个执行程序。根据转换(即聚合),一个分区中的数据可以分成更多分区。例如,阅读一个大的gzip文件,添加几列并在没有聚合的情况下对数据进行清理,然后将其写出来会给单个执行者带来整个工作负载,除非您明确告诉它重新分区。 – Garren

+0

https://jaceklaskowski.gitbooks.io/mastering-apache-spark/content/spark-rdd-partitions.html –