clojure和scala_Clojure和Rails-FlightCaster背后的秘密调味料

clojure和scala

ClojureRich Hickey创建的JVM的LISP 。 在过去的一年中,它获得了很多关注,主要是由于其并发功能,例如对软件事务存储 (STM)和其他强大数据结构的支持。 最近对功能语言的兴趣增长也没有受到伤害。 Clojure 1.0发布几个月后,现在出现了用Clojure实现的现实世界项目。

FlightCaster是一个新的航班延误预测站点。 它的Web前端是使用部署在Heroku上的Rails构建的。 使用ClojureHadoopCascadingCloudera等工具编写用于处理数据的后端。

我们与该项目的布拉德福德·克罗斯Bradford Cross)讨论了为FlightCaster提供支持的体系结构,如何使用Clojure来实现它,以及与来自OOP语言的新兴Clojure和Lisp程序员的技巧。

InfoQ :您能解释一下FlightCaster的功能吗。 分析部分?

Flightcaster实时预测航班延误。 分析工作涉及应用统计推断和机器学习技术。 有关航班延误预测问题的精确技术并不存在,即使它们确实存在,我当然也不会对上述问题有所了解。 :-)

InfoQ :您的架构是什么? 在Clojure组的文章中 ,您提到Cloudera是Hadoop之上的一层吗? 所有这些如何融合在一起?

Cloudera是为使用Hadoop进行大规模分布式处理的人们提供出色的服务,Hadoop分发,部署脚本和AMI(Amazon机器实例)的出色提供商。 我们使用Cloudera在10至100个节点的EC2上部署Hadoop集群,以进行数据处理和分析工作。 我们发现使用Cloudera发行版来减轻在EC2上部署Hadoop的某些复杂性具有巨大的价值。 我们当中只有两个人在从事研究方面的工作,因此依靠Cloudera可以提供很大的帮助。

InfoQ :哪些部分实际上是用Clojure编写的?

另一个关键的基础架构是层叠。 Hadoop之上的出色层,它增加了其他抽象和功能。 我们绝对向所有使用Hadoop进行认真的数据处理和挖掘的人推荐Cascading。

我们所有的Clojure都在生产中级联的基础上运行。
系统的两个主要部分用Clojure编写。
一种是将所有数据预处理和转换为适当的视图以进行分析。 这涉及过滤以及多阶段分布式联接等。 正确了解来自异构源的非结构化数据可能非常棘手。 例如,由于许多分析都考虑了时间因素,因此我们必须在数据中构建时间序列视图。 真正构建了这类系统的人都知道数据处理可以完成多少工作-Clojure + Cascading对此提供了巨大帮助。
Clojure内置的另一部分是所有统计推断和机器学习代码。 如果将存在系统的这一部分,我们将更详细地解释系统的这一部分。 假设系统的这一部分已经存在,显然似乎可以从Clojures的可爱功能抽象,宏系统,丰富的不可变数据结构和序列处理库,解构以及用于组成复杂多阶段的monadic抽象中受益匪浅可能存在中间故障的计算。

InfoQ :您是否利用Clojure的并发性和STM功能?

尽管它们很酷,但我们不使用内置于并发功能的Clojures。 相反,我们利用Clojures的另一个属性,即在JVM上构建它的务实选择。 我们只是将并行性和分布式计算委托给Cascading + Hadoop,在此之上,我们构建了一个非常令人愉悦的小层,如果有时间的话,我们可能会将其开源。

InfoQ :能否简要介绍一下Clojure代码的结构? 例如。 您如何使用名称空间,多方法,宏等

拥有函数式编程的先前经验(毫不奇怪)使我们以非常实用的样式来构造代码。 我们使用名称空间,就像使用其他任何语言一样。 我们倾向于使用很少的宏和多方法,尽管在使用它们的地方它们只是工作的正确抽象。 人们给人的印象是Lisp与大量宏和meta-sauce有关。 尽管在某些方面是正确的,但您可以并且应该在FP的基本构建模块上走得更远。 lambda,HOF,curring,部分应用程序等。

无论如何,我都不是monad的高手,但是我对mondad的感觉与对多方法和宏的感觉类似。 这些抽象很棒,很强大,很酷,并且引起了很多关注。 当它们看起来像是自然抽象时,我尝试使用这些工具使事情变得更容易,但是在很多时候,您所需要的只是您思维中的一点点严谨,您可以使用简单的老式函数式编程和数据结构来做得很好。

关于Clojure中的monad的最后一句话。 有些人似乎对monad是用于状态的印象,而Clojure已经有了许多处理状态的有效方法,所以为什么要使用monad。 我们还没有使用状态单子,但是还有许多其他有用的单子。 我喜欢Brian Beckman描述单子的方式; 它们只是伪装的功能组成。 最大的成功来自于可能使用概念进行安全组合的多阶段计算,这些计算可能会失败或失败。

在实际中,似乎比宏和monad等抽象引起更少关注的销毁绑定实际上是一种功能强大的抽象。 Rich选择从模式匹配中解构解构绑定的方式非常出色。 我相信不久以后我们会在Clojure中提供ML样式模式匹配,人们已经在研究实现。

InfoQ :您提到了Clojure读取器,用于将数据格式导入到Clojure数据结构中。 您使用阅读器宏吗?

Clojure没有读取器宏,到目前为止,我们对它们的迫切需求尚未迫切。 为了读写Clojure数据结构,我们只使用惯用的print-dup,它允许您定义多种方法来分发打印机。 仅当您需要读写没有内置文字表示形式的类型时,才真正需要打印机实现。 例如,我们有一个特殊的打印机来保存约旦时间,我们还以特殊的方式将它们读回。

InfoQ :您提到写出Clojure数据结构-您是否使用它来序列化数据以进行传输,存储或其他用途?

我们将Clojure数据结构文字用作通信和存储的中间表示。 例如,我们所有数据转换作业的输出都是Clojure数据结构文字,并且我们所有Hadoop作业中的中间表示也是如此。 这是我们在Cascading和Haooop之上的基础知识层中的关键部分,它使我们可以避免处理Hadoop输入格式。


InfoQ :您想添加到Clojure或Clojure生态系统中的某些东西(库,工具等)吗?

有人会提供高质量的解构模式匹配工具,这将非常有用。 我非常喜欢在小规模编程中使用的“后卫,后卫,基本情况”组合风格。 我们仍然不用模式匹配就可以做到这一点,Clojure拥有很多不错的小抽象,因此您不会错过太多模式匹配,但是在我看来,它仍然会在很多地方使代码更简洁。

我想,如果Rich打开阅读器会很酷,它可能有助于为模式匹配和monad实现之类的东西创建漂亮的语法。 再说一次,Clojure是我第一次在Lisp上工作,所以我没有阅读器宏的经验-所以我只是在猜测,我真的不知道我在谈论这个话题。

如果Rich不为任何东西保留垂直条,这也很好,因此我们可以将其保留为核心DSL的一部分,以用于条件概率表示法。 :-)

InfoQ :您对使用的Clojure库有任何提示或建议吗?

使用Clojure库的第一个提示是Clojure-core和Clojure-contrib很小,因此请阅读所有代码。 您会在那找到很棒的东西。 请密切注意所有令人惊奇的数据结构和数据结构处理功能。 例如,Clojure对集合和集合上的运算具有令人愉悦的实现,并且很好地引入了一些准关系代数。

一个分开的想法是,我已经将Clojure看作是一种面向数据结构的功能编程。

Clojure具有一组惊人的数据结构核心。 此外,所有这些数据结构都具有文字表示形式,因此它们可以自然地与阅读器配合使用并进行分解。 所有这些的结合是令人愉快的。

在ML降序的功能语言中,功能具有类型签名。 在Clojure中,函数具有数据结构拓扑签名。

InfoQ :FlightCaster的Web前端是使用Rails编写的,并部署在Heroku上。 选择Rails和Heroku的原因是什么?

当我开始构建智能时,Heroku和Rails已经成为生产的方向。 这是一个有意义的方向。 Ruby和Rails生态系统是构建Web应用程序的高效且广为人知的途径。 Heroku和Rails是团队的自然选择,因为其他两位创始人都有Rails经验,而Herkou的一位创始人与我们的首席执行官是密友。 :-) Flightcaster与Heroku共享办公空间,他们很棒! 内部连接肯定不会造成伤害。


InfoQ :您如何将Web UI与Clojure后端集成?

Rails不仅是Web前端,而且还是Web服务器。 我们将Clojure用于数据处理和机器学习研究。 我们使用非常简单的策略进行集成:我们有一些Clojure代码生成了我们的预测模型的json中间表示,然后将其推向世界的Ruby一侧并读入json。


第一本有关Clojure的书的作者Stuart Halloway最近发表了一篇文章,展示了使用Clojure的不同技术 。 本文提供了Clojure中的封装,多态等示例-对于来自OOP背景的开发人员来说应该是很有趣的(事实证明,在类和继承之外还有很多工作)。

有关Clojure的更多常规信息,请参阅InfoQ对Rich Hickey采访,其中涉及诸如STM,并发以及多种方法之类的话题。 Rich关于Clojure的演讲中的一个演讲提供了关于Clojure功能及其设计原理的更详细的介绍。

翻译自: https://www.infoq.com/articles/flightcaster-clojure-rails/?topicPageSponsorship=c1246725-b0a7-43a6-9ef9-68102c8d48e1

clojure和scala

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值