我正在尝试为Hadoop上的大矩阵计算制作一种迷你框架;我的意思是,smth喜欢~Prod(Sum(x, y), z) // (X + Y) * Z
,其中x,y,z - 矩阵或数字,并计算它,并将一些输出结果写入文件。所以我用的是Scalding
,矩阵和数字实际上是一回事。问题是,我不知道如何处理分解。
让我解释一下我的意思:如果我们谈论的是数字(现在没有hadoop
、scalding
等,只有纯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
上发送它们;所以我看到的唯一方法是处理矩阵的文件名。但至少有四个问题:
- 如何做出正确的分解特征(就像这个
Expr
,在我看来,我们只能处理Strings
- 文件名)? - 如何从任何类内部运行作业,这不是作业? 所以我的意思是一个类,我可以在其中传递矩阵名称,它将发送每个并在Hadoop上计算,然后带回结果? 而且我看到最好只在 Hadoop 上发送输入文件,只发回结果输出。(所以一些操作的链?但是如何制作它们,我看到的方式是发送一个分解并计算一切的作业?但是如何做这个大工作,如果工作取决于
Expression
来评估。另一种变体 - 分别发送每个作业(Sum
、Prod
等)。 - 如何使用输出文件?如果我们有很多操作,我们选择存储中间计算的所有结果,以及如何保留文件名?
- 我的想法是对的吗?
附言谢谢,向我展示一些类似想法(链接)的示例会非常有帮助,以更多地了解 Hadoop,因为我没有找到很多关于它的信息。最成问题的问题是,如何从任何类运行作业。
解决
所以我找到了一种方法,我得到了一份分解工作,这不是太聪明的问题,因为我不明白我想要的过程。
Scalding已经有一个矩阵API(https://github.com/twitter/scalding/wiki/Introduction-to-Matrix-Library)。你可以检查它是如何在那里实现的。
顺便说一句,对于较小的矩阵,我们使用微风:https://github.com/scalanlp/breeze/wiki/UserGuide