Apache spark spark数据帧缓存/持久化未按预期工作

Apache spark spark数据帧缓存/持久化未按预期工作,apache-spark,dataframe,Apache Spark,Dataframe,我有一个spark 1.3应用程序,它执行典型的ETL工作:它读取几个不同的配置单元表,对数据帧执行连接和其他操作,最后将输出作为文本文件保存到HDFS位置 此应用程序工作正常,但其第6阶段经常遇到错误消息,如未确认而失败。Spark将重试并最终成功完成所有阶段 为了加快重试过程,我想缓存阶段6的父数据帧。我为阶段6中使用的数据帧添加了.persistStorageLevel.MEMORY_和DISK_SER。但是,当作业运行时,从spark UI中,我看不到任何缓存/持久化的内容。当第6阶段失

我有一个spark 1.3应用程序,它执行典型的ETL工作:它读取几个不同的配置单元表,对数据帧执行连接和其他操作,最后将输出作为文本文件保存到HDFS位置

此应用程序工作正常,但其第6阶段经常遇到错误消息,如未确认而失败。Spark将重试并最终成功完成所有阶段

为了加快重试过程,我想缓存阶段6的父数据帧。我为阶段6中使用的数据帧添加了.persistStorageLevel.MEMORY_和DISK_SER。但是,当作业运行时,从spark UI中,我看不到任何缓存/持久化的内容。当第6阶段失败时,所有需要的数据都被重新计算

这对于两个簇是相同的,一个独立,一个在纱线下。我还尝试了.cache或.persistStorageLevel.MEMORY_ONLY等,但结果相同。我不确定这是什么原因。与可用内存~50G和~500G相比,我想要缓存的数据并不大。唯一值得一提的是,我想缓存的数据在以后从未使用过一次以上——理论上,如果第6阶段没有常规失败,我根本不需要缓存


有人对persist/cache的行为有更多的了解吗?

您可能在阶段边界处缓存了RDD,因此实际的缓存和错误发生在同一阶段。尝试通过在每个RDD上运行操作来强制实现RDD,例如,在缓存RDD之后立即进行计数

还要注意的是,当执行器死亡时,它缓存的数据也随之而去。如果您的错误属于这一类,您将更幸运地使用.checkpoint而不是缓存


最后,我建议您花点时间来了解导致您看到的错误的实际原因听起来超时太低,否则您将继续浪费时间重新计算数据,并最终再次运行到类似的条件下。

您可能在阶段边界处缓存了RDD,因此,实际缓存和错误发生在同一阶段。尝试通过在每个RDD上运行操作来强制实现RDD,例如,在缓存RDD之后立即进行计数

还要注意的是,当执行器死亡时,它缓存的数据也随之而去。如果您的错误属于这一类,您将更幸运地使用.checkpoint而不是缓存


最后,我建议您花点时间来了解您看到的错误的实际原因听起来超时太低,否则您将继续浪费时间重新计算数据,最终再次遇到类似的情况。

谢谢您的回答,我一定会尝试。checkpint。对于错误本身,我花了相当长的时间在这方面,没有任何运气。这似乎是spark使用netty而不是nio时修复的错误。但由于另一个问题,我一直使用nio:当在纱线下运行时,一些spark任务会挂起而没有错误消息,使用nio可以避免这个问题。如果您对这个问题有任何见解,我将非常感谢。我也在使用纱线,目前使用Spark 1.3.1时,还没有出现任何此类问题。如果您还没有这样做,请仔细查看executor日志,检查纱线配置,确保它们不会在您有机会查看之前被删除。另外,请查看一些netty特定的配置参数,看看是否有任何问题与您的问题有关。谢谢。我已经翻遍了日志,但在使用netty时找不到任何关于挂起问题的信息——根本没有错误消息。我看到其他人报告了同样的问题,并改为nio修复了这一部分。顺便说一句,我正在使用MAPR,也许这会有所不同。尝试了1.2.1和1.3.1,结果相同。感谢您的回答,我一定会尝试。请检查品脱。对于错误本身,我花了相当长的时间在这方面,没有任何运气。这似乎是spark使用netty而不是nio时修复的错误。但由于另一个问题,我一直使用nio:当在纱线下运行时,一些spark任务会挂起而没有错误消息,使用nio可以避免这个问题。如果您对这个问题有任何见解,我将非常感谢。我也在使用纱线,目前使用Spark 1.3.1时,还没有出现任何此类问题。如果您还没有这样做,请仔细查看executor日志,检查纱线配置,确保它们不会在您有机会查看之前被删除。另外,请查看一些netty特定的配置参数,看看是否有任何问题与您的问题有关。谢谢。我已经翻遍了日志,但在使用netty时找不到任何关于挂起问题的信息——根本没有错误消息。我看到其他人报告了同样的问题,并改为nio修复了这一部分。顺便说一句,我正在使用MAPR,也许这会有所不同。尝试1.2.1和1.3.1,结果相同。