在我的spark应用程序中,我正在阅读spark rdd中的几个hive表,然后在这些rdds上执行一些转换。为避免重新计算,我使用rdd.cache()
或rdd.persist()
和rdd.checkpoint()
方法缓存了这些rdds。
根据spark文档和在线参考资料,我认为检查点操作比缓存更昂贵。虽然缓存保持rdd血统和检查点打破它,但检查点从HDFS写入和读取。
我在我的案例中观察到的奇怪的事情是,我看到检查点阶段比缓存/持久(仅仅内存)更快(接近2倍)。我跑了好几次,结果仍然相似。
我无法理解为什么会这样。任何帮助都会有所帮助。
答案 0 :(得分:0)
我最近运行了类似的基准测试,但我遇到了相同的问题:尽管有更多的I / O,checkpoint()
还是更快。我的解释是,保留整个血统是一项昂贵的操作。
我在1,10,100,1000,10000,100000,1000000,2000000,10m上运行基准测试,并且更多的记录和检查点总是更快。沿袭非常简单(先进行记录过滤,然后进行两次汇总)。存储在NVMe驱动器上是本地的(不通过网络阻止)。我想这真的取决于很多标准。