当火花通过驱动程序提取数据时,我试图用简单的术语,然后当火花不需要通过驱动程序提取数据时。
我有3个问题 -
sc.textfile(path)
或sc.textfile(path).toDF
等)。如果驱动程序只运行32 GB内存,它会导致驱动程序有OOM吗?或者至少对司机吉姆进行掉期交易?或者spark和hadoop是否足够聪明,可以将数据从HDFS分发到一个火花执行器,以便在不通过驱动程序的情况下制作数据帧/ RDD?答案 0 :(得分:4)
Spark使用分布式数据结构运行,如RDD和Dataset(以及2.0之前的Dataframe)。以下是您应该了解的有关此数据结构的事实,以获得您的问题的答案:
所以基本上当你调用sc.textFile
时,不会发生实际的阅读。所有提到的事实都解释了为什么在处理20 Tb数据时不会发生OOM。
有一些特殊情况,例如join
操作。但即使在这种情况下,所有执行程序都会将其中间结果刷新到本地磁盘以进行进一步处理。
如果是JDBC,您可以决定表的分区数。并在表中选择适当的分区键,将数据正确地分割为分区。由您决定将多少数据同时加载到内存中。
本地文件的块大小由fs.local.block.size
属性控制(我猜默认为32Mb)。因此它基本上与1(HDFS文件)相同,除了您将从一台机器和一个物理磁盘驱动器读取所有数据(在20TB文件的情况下效率极低)。