我是数据工程新手,所以这可能是一个基本问题。但我还没能澄清
--上下文--
我有一个由 Azure 数据工厂管道每 10 分钟执行一次的 Spark 作业。
每次执行时,spark 作业都会连接到数据库 (Azure SQL Server) 并加载 3 个表。这三个都是小表(1.9M、72K、72K)。但有时无法连接数据库,从而导致整个管道失败。
我想做的事:
我想缓存 3 个表(如果可能的话,每天一次),这样 Spark 就不必在每次执行时都连接到数据库。
起初我认为 df.persist(StorageLevel.DISK_ONLY) 即使在 Spark 会话终止后也可以保留数据帧,但无法确认。 我想到的另一个选择是将表保存在 Hive 中,但 Hive 通常用于大数据,所以我不确定在这种情况下使用它是否是正确的选择。
欢迎任何建议。
当您
df.persist(StorageLevel.DISK_ONLY)
时,Spark 会将数据缓存在由spark.local.dir
属性定义的位置。缓存对于迭代作业很有用,Spark 可以避免每次调用 count() 等操作时重新计算整个 DAG。相反,它从缓存数据的点开始(请参阅Spark 研究论文 中的图 1 了解更多说明)。但是,一旦应用程序通过 spark.stop()
停止,缓存的数据就会丢失,并且无法被新应用程序访问。
您面临的问题是与数据库的不可靠连接,而不是缓存。我建议添加几次重试,以防连接失败。另外,考虑将数据写入外部存储(例如 HDFS、本地文件系统),以便在与数据库的连接断开时可以读取数据。