在集群上分发Haskell

18

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

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

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

由于我必须使用作业调度系统,所以不可能使用cloudHaskell来分发闭包。相反,程序会编写一个包含所需计算的新Main.hs文件,将它与所有主要依赖模块一起复制到集群节点上,然后通过"runhaskell Main.hs [opts]"在远程执行。然后,异步进程应该定期向作业调度系统(使用threadDelay)询问作业是否完成。

有没有办法避免创建新的Main?我能否序列化IO操作并以某种方式在节点上执行它?


1
Andrew Cowie和Ozgun Ataman建议我编译程序并将其发送到节点,因为编译后的二进制文件是自包含且易于rsync的。 Ozgun Ataman开发了基于hadron[1]的Hadoop MapReduce程序,用于在工作中对集群节点进行分组的一个例子。 [1] https://github.com/soostone/hadron - felipez
1个回答

1

是的。有一个神奇的库叫做packman。它允许你把任何Haskell东西转换成数据(只要它们没有IORef或相关的东西)。以下是你需要的内容:

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

是的,那些就是确切的类型。您可以使用trySerialize打包IO操作,使用Binary将其传输到任何地方,然后使用deserialize将其解包以获取可供使用的IO操作。

packman的注意事项是:

  • 它将事物存储为thunks。这可能是您想要的,以便节点可以进行评估。
    • 话虽如此,如果您的thunk非常庞大,则Binary可能会非常庞大。评估thunk可以解决此问题。
    • 正如我所说,可变引用是不行的。需要注意的一件事是它们在您不知道的情况下位于thunks中。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接