我很难理解RDD分区和HDFS输入分裂之间的区别。所以基本上当你提交Spark应用程序时:
当Spark应用程序想要从HDFS读取时,HDFS上的该文件将具有输入分割(假设每个64mb,并且这些输入分裂中的每一个都存在于不同的数据节点上)。
现在假设Spark应用程序想要使用(sc.textFile(PATH_IN_HDFS)
)从HDFS加载该文件。该文件大约256 MB,有4个输入拆分,其中2个拆分在数据节点1上,另外2个拆分在数据节点2上。
现在当Spark将这个256 mb加载到它的RDD抽象中时,它会将每个输入分割(64mb)加载到4个单独的RDD中(在数据节点1中你将有2个RDD和64mb数据,而另外两个RDD是数据节点2)上的64mb数据。或者RDD会在Hadoop上进一步划分那些输入分裂吗?那么这些分区又将如何重新分配呢? 我不明白RDD分区和HDFS输入分割之间是否存在相关性?
答案 0 :(得分:2)
我对Spark很新,但分裂与MapReduce作业严格相关。 Spark以分布式方式加载内存中的数据,哪些机器将加载数据取决于数据的位置(读取:在某种程度上取决于数据块的位置,这非常接近分裂的想法)。 Sparks API允许您根据RDD进行思考,不再进行拆分。 您将研究RDD,如何将数据分发到RDD不再是程序员问题。 您在spark下的整个数据集称为RDD。
答案 1 :(得分:0)
希望以下答案对您有所帮助。
Spark从HDFS读取文件时,它将为单个输入拆分创建一个分区。
如果您在HDFS上存储了30GB的文本文件,则使用默认的HDFS块大小设置(128MB),它将存储在235个块中,这意味着您从该文件读取的RDD将具有235个分区。