表达式的分解(矩阵上的操作),hadoop



我正在尝试为Hadoop上的大矩阵计算制作一种迷你框架;我的意思是,smth喜欢~Prod(Sum(x, y), z) // (X + Y) * Z,其中x,y,z - 矩阵或数字,并计算它,并将一些输出结果写入文件。所以我用的是Scalding,矩阵和数字实际上是一回事。问题是,我不知道如何处理分解。

让我解释一下我的意思:如果我们谈论的是数字(现在没有hadoopscalding等,只有纯Scala),我们可以这样做:

trait Expr {
    def eval: Int = this match {
    case Number(n) => n
    case Sum(e1, e2) => e1.eval + e2.eval
    case Diff(e1, e2) => e1.eval - e2.eval
    case Prod(e1, e2) => e1.eval * e2.eval
}

所以你明白我的想法。但是对于 hadoop,正如我所认识到的那样,我们应该制作Jobs并在 hadoop 上发送它们;所以我看到的唯一方法是处理矩阵的文件名。但至少有四个问题:

  1. 如何做出正确的分解特征(就像这个Expr,在我看来,我们只能处理Strings - 文件名)?
  2. 如何从任何类内部运行作业,这不是作业? 所以我的意思是一个类,我可以在其中传递矩阵名称,它将发送每个并在Hadoop上计算,然后带回结果? 而且我看到最好只在 Hadoop 上发送输入文件,只发回结果输出。(所以一些操作的链?但是如何制作它们,我看到的方式是发送一个分解并计算一切的作业?但是如何做这个大工作,如果工作取决于Expression来评估。另一种变体 - 分别发送每个作业(SumProd等)。
  3. 如何使用输出文件?如果我们有很多操作,我们选择存储中间计算的所有结果,以及如何保留文件名?
  4. 我的想法是对的吗?

附言谢谢,向我展示一些类似想法(链接)的示例会非常有帮助,以更多地了解 Hadoop,因为我没有找到很多关于它的信息。最成问题的问题是,如何从任何类运行作业。


解决

所以我找到了一种方法,我得到了一份分解工作,这不是太聪明的问题,因为我不明白我想要的过程。

Scalding已经有一个矩阵API(https://github.com/twitter/scalding/wiki/Introduction-to-Matrix-Library)。你可以检查它是如何在那里实现的。

顺便说一句,对于较小的矩阵,我们使用微风:https://github.com/scalanlp/breeze/wiki/UserGuide

最新更新