如何选择大数据的编程语言


有一个大数据项目,你知道问题领域 (problem domain),也知道使用什么基础设施,甚至可能已决定使用哪种框架来处理所有这些数据,但是有一个决定迟迟未能做出:我该选择哪种语言?(或者可能更有针对性的问题是,我该迫使我的所有开发人员和数据科学家非要用哪种语言?) 这个问题不会推迟太久,迟早要定夺。
数据分析_大数据_编程语言

当然,没有什么阻止得了你使用其他机制 (比如 XSLT 转换) 来处理大数据工作。但通常来说,如今大数据方面有三种语言可以选择:R、Python 和 Scala,外加一直以来屹立于企业界的 Java。那么,你该选择哪种语言? 为何要选择它,或者说何时选择它?

下面简要介绍了每种语言,帮助你做出合理的决定。

R

R 经常被称为是 “统计人员为统计人员开发的一种语言”。如果你需要深奥的统计模型用于计算,可能会在 CRAN 上找到它――你知道,CRAN 叫综合 R 档案网络(Comprehensive R Archive Network) 并非无缘无故。说到用于分析和标绘,没有什么比得过 ggplot2。而如果你想利用比你机器提供的功能还强大的功能,那可以使用 SparkR 绑定,在 R 上运行 Spark。

然而,如果你不是数据科学家,之前也没有用过 Matlab、SAS 或 OCTAVE,可能需要一番调整,才能使用 R 来高效地处理。虽然 R 很适合分析数据,但是就一般用途而言不太擅长。你可以用 R 构建模型,但是你需要考虑将模型转换成 Scala 或 Python,才能用于生产环境,你不太可能使用这种语言编写一种集群控制系统 (运气好的话,你可以对它进行调试)。

Python

如果你的数据科学家不使用 R,他们可能就会彻底了解 Python。十多年来,Python 在学术界当中一直很流行,尤其是在自然语言处理 (NLP) 等领域。因而,如果你有一个需要 NLP 处理的项目,就会面临数量多得让人眼花缭乱的选择,包括经典的 NTLK、使用 GenSim 的主题建模,或者超快、准确的 spaCy。同样,说到神经网络,Python 同样游刃有余,有 Theano 和 Tensorflow; 随后还有面向机器学习的 scikit-learn,以及面向数据分析的 NumPy 和 Pandas。

还有 Juypter/iPython――这种基于 Web 的笔记本服务器框架让你可以使用一种可共享的日志格式,将代码、图形以及几乎任何对象混合起来。这一直是 Python 的杀手级功能之一,不过这年头,这个概念证明大有用途,以至于出现在了奉行读取 - 读取 - 输出 - 循环 (REPL) 概念的几乎所有语言上,包括 Scala 和 R。

Python 往往在大数据处理框架中得到支持,但与此同时,它往往又不是 “一等公民”。比如说,Spark 中的新功能几乎总是出现在 Scala/Java 绑定的首位,可能需要用 PySpark 编写面向那些更新版的几个次要版本 (对 Spark Streaming/MLLib 方面的开发工具而言尤为如此)。

与 R 相反,Python 是一种传统的面向对象语言,所以大多数开发人员用起来会相当得心应手,而初次接触 R 或 Scala 会让人心生畏惧。一个小问题就是你的代码中需要留出正确的空白处。这将人员分成两大阵营,一派觉得 “这非常有助于确保可读性”,另一派则认为,2016 年,我们应该不需要就因为一行代码有个字符不在适当的位置,就要迫使解释器让程序运行起来。

Scala

现在说说 Scala:在本文介绍的四种语言中,Scala 是最轻松的语言,因为大家都欣赏其类型系统。Scala 在 JVM 上运行,基本上成功地结合了函数范式和面向对象范式,目前它在金融界和需要处理海量数据的公司企业中取得了巨大进展,常常采用一种大规模分布式方式来处理 (比如 Twitter 和 LinkedIn)。它还是驱动 Spark 和 Kafka 的一种语言。

由于 Scala 在 JVM 里面运行,它可以立即随意访问 Java 生态系统,不过它也有一系列广泛的 “原生” 库,用于处理大规模数据(尤其是 Twitter 的 Algebird 和 Summingbird)。它还包括一个使用非常方便的 REPL,用于交互式开发和分析,就像使用 Python 和 R 那样。

我个人非常喜欢 Scala,因为它包括许多实用的编程功能,比如模式匹配,而且被认为比标准的 Java 简洁得多。然而,用 Scala 来开发不止一种方法,这种语言将此作为一项特色来宣传。这是好事! 不过考虑到它拥有图灵完备 (Turing-complete) 的类型系统和各种弯弯曲曲的运算符 (“/:” 代表 foldLeft,“:”代表 foldRight),很容易打开 Scala 文件,以为你看到的是某段讨厌的 Perl 代码。这就需要在编写 Scala 时遵循一套好的实践和准则(Databricks 的就很合理)。

另一个缺点是,Scala 编译器运行起来有点慢,以至于让人想起以前 “编译!” 的日子。不过,它有 REPL、支持大数据,还有采用 Jupyter 和 Zeppelin 这一形式的基于 Web 的笔记本框架,所以我觉得它的许多小问题还是情有可原。

Java

最终,总是少不了 Java――这种语言没人爱,被遗弃,归一家只有通过起诉谷歌才有钱可赚时才似乎关心它的公司 (注:Oracle) 所有,完全不时髦。只有企业界的无人机才使用 Java! 不过,Java 可能很适合你的大数据项目。想一想 Hadoop MapReduce,它用 Java 编写。HDFS 呢? 也用 Java 来编写。连 Storm、Kafka 和 Spark 都可以在 JVM 上运行 (使用 Clojure 和 Scala),这意味着 Java 是这些项目中的“一等公民”。另外还有像 Google Cloud Dataflow(现在是 Apache Beam) 这些新技术,直到最近它们还只支持 Java。

Java 也许不是摇滚明星般备受喜爱的首选语言。但是由于研发人员在竭力理清 Node.js 应用程序中的一套回调,使用 Java 让你可以访问一个庞大的生态系统 (包括分析器、调试器、监控工具以及确保企业安全和互操作性的库),以及除此之外的更多内容,大多数内容在过去二十年已久经考验 (很遗憾,Java 今年迎来 21 岁,我们都老矣)。

炮轰 Java 的一个主要理由是,非常繁琐冗长,而且缺少交互式开发所需的 REPL(R、Python 和 Scala 都有)。我见过 10 行基于 Scala 的 Spark 代码迅速变成用 Java 编写的变态的 200 行代码,还有庞大的类型语句,它们占据了屏幕的大部分空间。然而,Java 8 中新的 Lambda 支持功能对于改善这种情况大有帮助。Java 从来不会像 Scala 那么紧凑,但是 Java 8 确确实实使得用 Java 进行开发不那么痛苦。

至于 REPL? 好吧,目前还没有。明年推出的 Java 9 会包括 JShell,有望满足你的所有 REPL 要求。

哪种语言胜出?

你该使用哪种语言用于大数据项目? 恐怕这还得 “视情况而定”。如果你对晦涩的统计运算进行繁重的数据分析工作,那么你不青睐 R 才怪。如果你跨 GPU 进行 NLP 或密集的神经网络处理,那么 Python 是很好的选择。如果想要一种加固的、面向生产环境的数据流解决方案,又拥有所有重要的操作工具,Java 或 Scala 绝对是出色的选择。

当然,不一定非此即彼。比如说,如果使用 Spark,你可以借助静态数据,使用 R 或 Python 来训练模型和机器学习管道 (pipeline),然后对该管道进行序列化处理,倒出到存储系统,那里它可以供你的生产 Scala Spark Streaming 应用程序使用。虽然你不应该过分迷恋某一种语言 (不然你的团队很快会产生语言疲劳),使用一套发挥各自所长的异构语言也许会给大数据项目带来成效。
来源:千锋大数据
45期CPDA课程