在 Spark 中,以下代码
rdd = sc.textfile("file path")
rdd1 = rdd.filter(filter1).maptopair();
rdd2 = rdd.filter(filter2).maptopair();
rdd3 = rdd1.join(rdd2);
rdd3.saveastextfile();
将生成3个阶段。从 Spark Web UI 中,我看到阶段 1 和阶段 2 并行运行,并且在前两个阶段完成后将触发连接阶段(阶段 3)。 我的问题是阶段 1 和阶段 2 同时读取同一个文件? 这意味着 Spark 读取同一个文件两次?
最佳答案
TL;博士;是的,它会读两次。
更长的答案是,如果初始读取已经在内存(缓存/操作系统缓存)中,那么它将使用它而不是直接读取。如果不深入研究实现,您的特定场景很可能会导致同时读取。也就是说,原因正是创建 DataFrame 的原因。代码是一个黑匣子,因此除了部分共享的沿袭之外,就调度程序而言,整个阶段(读取和映射*)是不同的。而且,正如已经提到的,它会在可能的情况下重用任何已缓存的谱系。
如果您想要更多共享的内容,请使用 DataFrames,它对完整的谱系以及它可以从合并操作中受益的地方有深入的了解。例如,如果您获取代码并通过 SQL 推送它,那么您就会看到您正在寻找的合并。
*我假设您的意思是 map
而不是 filter
,因为否则 join
将无法工作。
关于apache-spark - 如果两个阶段使用相同的 RDD,spark 是否会读取同一个文件两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37894099/