【问题标题】:Distributing Haskell on a cluster在集群上分发 Haskell
【发布时间】:2015-05-16 09:11:04
【问题描述】:

我有一段处理文件的代码,

processFiles ::  [FilePath] -> (FilePath -> IO ()) -> IO ()

此函数生成一个执行 IO 操作的异步进程。此 IO 操作必须通过作业调度系统(例如 Slurm)提交到集群。

因为我必须使用作业调度系统,所以无法使用 cloudHaskell 来分发闭包。相反,程序会编写一个包含所需计算的新 Main.hs,即复制到集群节点以及 main 依赖的所有模块,然后使用“runhaskell Main.hs [选择]”。然后异步进程应该定期询问作业调度系统(使用 threadDelay)如果作业完成。

有没有办法避免创建新的 Main?我可以序列化 IO 动作并在节点中以某种方式执行吗?

【问题讨论】:

  • Andrew Cowie 和 Ozgun Ataman 建议我编译程序并将其发送到节点,因为编译后的二进制文件是独立的并且易于 rsync。这方面的一个例子是由 Ozgun Ataman 开发的基于强子 [1] 的 Hadoop MapReduce 程序来集群工作中的节点。 [1]github.com/soostone/hadron

标签: haskell closures distributed


【解决方案1】:

是的。有一个神奇的图书馆叫packman。它允许您将任何 haskell 事物转换为数据(只要其中没有 IORefs 或相关事物。)这里是您需要的东西:

trySerialize :: a -> IO (Serialized a)
deserialize :: Serialized a -> IO a
instance Typeable a => Binary (Serialized a)

是的,这些是确切的类型。您可以使用trySerialize 打包您的IO 操作,使用Binary 将其传输到任何位置,然后使用deserialize 将IO 操作取出,准备使用。

packman 的注意事项是:

  • 它将事物存储为 thunk。这可能是您想要的,以便节点可以进行评估。
    • 也就是说,如果您的 thunk 很大,Binary 可能会很大。评估 thunk 可以解决此问题。
    • 就像我说的,可变引用是禁忌。需要注意的一件事是它们在您不知情的情况下在 thunk 中

除此之外,这似乎是你想要的!

【讨论】:

    猜你喜欢
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    相关资源
    最近更新 更多