我很难理解rdd分区和hdfs输入拆分之间的区别。因此,基本上,当您提交spark申请时:
当spark应用程序想要从hdfs读取时,hdfs上的文件将具有输入分割(假设每个输入分割为64mb,并且每个输入分割都存在于不同的数据节点上)。
现在假设spark应用程序希望使用( sc.textFile(PATH_IN_HDFS)
). 文件大约是256MB,有4个输入分割,其中2个分割在数据节点1上,另外2个分割在数据节点2上。
现在,当spark将这个256mb加载到它的rdd抽象中时,它会将每个输入分割(64mb)加载到4个单独的rdd中(在数据节点1中有2个具有64mb数据的rdd,在数据节点2上有另外两个具有64mb数据的rdd)。或者rdd会在hadoop上进一步划分这些输入分割吗?那么这些分区将如何重新分配呢?我不明白rdd分区和hdfs输入拆分之间是否存在关联?
2条答案
按热度按时间vojdkbi01#
我对spark还很陌生,但是split和mapreduce的工作有着严格的联系。spark以分布式方式将数据加载到内存中,哪些机器将加载数据取决于数据所在的位置(read:在某种程度上取决于数据块所在的位置,这与split的想法非常接近)。SparksAPI允许您根据rdd进行思考,而不再分裂。您将在rdd上工作,如何将数据分发到rdd不再是程序员的问题。你的整个数据集,在spark下,叫做rdd。
iecba09b2#
希望下面的答案能对你有所帮助。
当spark从hdfs读取一个文件时,它会为一个输入分割创建一个分区。
如果您在hdfs上存储了30gb的文本文件,那么使用默认的hdfs块大小设置(128mb),它将存储在235个块中,这意味着您从该文件读取的rdd将有235个分区。