一直以来都没搞懂spark读hdfs文件到底是怎么确定分区数的,分区数如果超过了spark的并行度怎么办。最近又在写spark任务,顺便看一下这个逻辑。
(1)spark读hdfs文件的分区数由hdfs文件占用的文件块数决定。
我们知道,hdfs文件存储的时候是分文件块的,就想操作系统存储文件一样。操作系统的一块一般是1024kB,hdfs文件一般存储大文件,一块一般设置为128MB。
例如:如果读取的一个hdfs文件大小为1280MB,可能是存储为10块,那么spark读取这个文件的分区数就是10。
(2)spark运行程序都会设置一个并行度,如果分区数超过了这个并行度怎么办?
spark的并行度是同一时刻进行任务计算的task的最大数量。如果分区数超过了并行度,那么就会排队计算。
比如读取的文件分区数是10,spark任务的并行度是5,同一时刻只会计算5个分区的内容,当某个分区计算完成空出资源之后才会计算其他分区。
参考文章: