Cha*_*les 1 dataframe apache-spark
我有一个执行典型ETL工作的spark 1.3应用程序:它从几个不同的配置单元表中读取数据,对数据帧执行联接和其他操作,最后将输出作为文本文件保存到HDFS位置。
该应用程序运行良好,除了其阶段6经常遇到错误消息,如“未经确认失败”。Spark将重试并最终成功完成所有阶段。
为了加快重试过程,我想缓存第6阶段的父数据帧。我.persist(StorageLevel.MEMORY_AND_DISK_SER)为第6阶段中使用的数据帧添加了代码。但是,当作业运行时,从spark UI中看不到任何内容被缓存/持久化。当第6阶段失败时,将再次重新计算所有需要的数据。
这对于两个集群是相同的,一个独立,一个在Yarn下。我也尝试过.cache(),或其他,.persist(StorageLevel.MEMORY_ONLY)但结果相同。我不确定是什么原因造成的。与可用内存相比,我要缓存的数据并不大(〜50G与〜500G)。唯一值得一提的是,我要缓存的数据从未被使用过一次以上-从理论上讲,如果第6阶段不会常规失败,则根本不需要缓存。
任何人都对为什么持久性/缓存行为如此有更多见解?
小智 5
您可能已经在阶段边界缓存了RDD,以便实际缓存和错误发生在同一阶段。尝试通过在每个RDD上执行操作来强制实现RDD,例如,.count()在缓存它们之后立即执行。
还要注意,当执行者去世时,它缓存的数据也随之消失。如果您的错误属于此类,那么您将拥有更好的运气.checkpoint()而不是缓存。
最后,我建议您花些时间了解导致错误的真正原因(听起来像是超时太低),否则您将继续浪费时间重新计算数据并最终再次进入类似条件。