Apache Spark是一个分布式计算框架,可以简化和加速数据处理和分析工作流程,适用于处理大型数据集的数据科学家和工程师。它为原型设计提供统一的界面,并构建生产质量应用程序,使其特别适合敏捷方法。我个人认为Spark将不可避免地成为机器学习和数据科学事实上的大数据框架。
尽管对Spark有不同看法,但我们假设数据科学团队希望开始将其作为主要技术。编程语言的选择通常是一个两难选择。我们应该在Python或Scala中构建我们的模型吗?我们应该使用Python笔记本或Scala进行探索性分析吗?
一个共同的理解是Python是科学语言,Scala是一种工程语言,被视为Java的更好替代品。虽然事实确实如此,但并非总是如此。
由于这两种语言的比较已经在其他地方进行了详细的评估,我想将这种比较限制在敏捷工作流中利用Apache Spark构建数据产品的特定用例。
特别是,我可以确定此上下文中的数据科学编程语言应提供的6个重要方面:
生产率
安全重构
Spark整合
开箱即用的机器学习/统计软件包
文档/社区
交互式探索性分析和内置可视化工具
为什么只有Scala和Python?
Apache Spark附带了4个API:Scala,Java,Python和最近的R.我之所以只考虑“PyScala”,是因为它们主要提供与其他2种语言相似的功能(Scala over Java和Python over R),在我看来,整体得分更高。此外,R不是通用语言,其API仍处于试验阶段。
1.生产力
尽管靠近底层的编码总能产生最优化的结果,但已知成熟优化是所有邪恶的根源。特别是在最初的MVP阶段,我们希望用尽可能少的代码行来实现高生产率,并且可能由智能IDE引导。
Python是一种非常易于学习且高效的语言,可以从第1天开始快速完成工作。由于Scala具有高级功能,因此需要更多的思考和抽象,但只要您熟悉它,您的工作效率就会提高将大大提升。代码简洁性非常可比,两者都可以非常简洁,具体取决于您在编码方面的表现。阅读Python更加明确,它逐步向您显示代码执行的内容以及每个变量的状态。另一方面,Scala将更多地关注描述您要实现的目标,最终结果隐藏了大部分实现细节和执行顺序。但要记住,强大的力量会带来很大的责任 虽然模式匹配是提取变量的一种非常酷的方式,
在IDE方面,IntelliJ和PyCharm都是智能且高效的环境。尽管如此,与脚本语言不同,Scala可以利用类型和编译时交叉引用,它们可以更自然地提供一些额外的功能,而且不会产生歧义。仅举几例:在项目中按名称查找类/方法并链接依赖项,查找用法,基于类型兼容性的自动完成,开发时错误或警告。
另一方面,所有这些编译时功能都带来了成本:IntelliJ,sbt和所有相关工具都很慢并且内存/ CPU消耗很大。如果为了在Scala中打开多个并行项目,分配了2GB的RAM,那么您不应该感到惊讶。在这方面,Python更轻量级。
结论:这两个得分都非常好,我的建议是如果你正在开发简单的直观逻辑,那么Python可以大大地完成工作,如果你想做一些比在Scala中学习和编写功能代码更值得投资的事情。
2.安全重构
此要求主要是敏捷方法,我们希望在执行数据探索时安全地更改代码的要求,并在每次迭代时对其进行调整。通常,您首先使用相关测试编写一些代码,并在测试之后立即执行和API。每次我们执行重构时,我们都会面临引入错误并默默打破先前逻辑的风险。
这两种语言都必须要求测试(单元测试,集成测试,基于属性的测试等......)才能安全地重构。Scala作为一种编译语言具有更好的优势,但我不打算论证编译与脚本语言的优缺点。所以,我会跳过这个,但至少对我来说,我可以从键入的代码中看到一些有用的好处。
结论:Scala非常好,Python平均。
3. Spark集成
大部分时间和资源通常用于加载,清理,转换数据以及从中提取最丰富的信息。对于那个任务,什么比将域特定逻辑表达为函数组合更好,而不是懒得执行它?难怪大数据正在变得越来越有用。
你现在希望我说Scala做得更好,因为它具有原生功能。实际上在这种情况下,Spark之间的差异很大,而不是编程语言。尽管Python不是100%全功能(你可以通过外部库来实现),但它包含了确实具有功能性的Spark API。
然后,单个映射或简化函数的实现可以是有效的,但至少主要逻辑表示为对原始数据的转换和操作的管道,并且执行计划由计算框架定义。
您仍然必须巧妙地使用不同的Spark API以使您的代码可扩展和优化,但这两个案例的任务是相同的。如果我们考虑代码执行性能,那么我们都知道JVM编译的代码运行速度比Python代码快,但Spark正在转向与DataFrame类似的语言抽象,这将优化大部分工作,从而产生可比较的性能结果。
因此,解决方案是“使用Spark”。由于这一点(并且独立于功能性质),Scala本身支持它,特别是在执行低级调优,优化和调试时特别方便。如果您使用过Spark框架,那么您很熟悉它的序列化异常。由于Python代码在JVM中被包装和执行,因此您无法控制函数中包含的内容。此外,最新的Spark版本中的一些新功能可能仅在Scala中可用,然后才能在Python中移植。
结论:Scala在工程方面更好,相当于Spark集成和功能。
4.开箱即用的机器学习/统计软件包
当你嫁给一种语言时,你就嫁给了整个家庭。对于实现大多数标准程序和模型的开箱即用软件包而言,Python还有更多的东西可以实现,这些程序和模型通常可以在文献中找到和/或在行业中广泛采用。Scala仍然落伍,但可以从Java库兼容性和社区直接在Spark上开发一些流行的机器学习算法(参见MLlib,H20 Sparkling Water,DeepLearning4j ......)中受益。关于MLlib的一点注意事项,根据我的经验,它的实现有点hacky,并且由于私有字段和类的平庸设计和无意义限制而经常难以修改或扩展。
诚然,关于Java兼容性,我没有看到任何Java框架与其今天提供的Python有着惊人的scikit-learn和相关库。另一方面,许多Python实现仅在本地工作(除非使用一些bootstrapping / bagging +模型集成技术,请参阅 https://cornercases.wordpress.com/2013/10/23/example-python-machine-learning-algorithm -on-spark /)但是他们开箱即用的实现在分布式算法方面缺乏强大的可扩展性。另一方面,Scala只提供了一些实现,但已经可扩展且可以生产。
不过,不要忘记在小数据问题中可以减少许多大数据问题,特别是在精确的特征选择,过滤和聚合之后。在某些情况下,将大型数据集压缩到矢量空间可能是有意义的,该空间可以完美地适应内存并利用Python中提供的丰富性和高级算法。
结论:这实际上取决于数据的大小。每次它都适合内存时首选Python,但请记住项目的要求是什么:它只是一个原型还是你想在生产系统中部署/维护的东西?Python提供了一系列已经实现的软件包,可以满足任何需求。Scala只提供基础知识,但在“生产”的情况下,这是一个更好的工程选择。
5.文件/社区
如果我们在社区大小方面比较两种简单语言(没有它们的外部库),那么Python属于tier1而Scala就在tier2之后,请参阅 http://readwrite.com/2010/12/10/ranking-programming-语言。实际上,这意味着他们在StackOverflow中都有足够的教程和答案,涵盖了大多数用例和操作方法。
如果我们考虑机器学习和统计框架的文档,Python数据科学社区就会更加成熟,事实上你可以找到很多关于如何使用大多数Python库解决很多问题和冷却分析的教程和示例。
不幸的是,我们不能对Scala说同样的话。ML和MLlib库非常差,真正理解它们如何工作的唯一方法是阅读代码。可能与我在GitHub上找到的其他一些开源库有关。
结论:
在软件开发方面,它们都具有良好的可比性社区。当我们考虑数据科学社区和酷数据科学项目时,Python很难被击败。
6.交互式探索性分析和内置可视化工具
iPython是科学界发明的最伟大的工具之一,一年前它对奥斯卡获胜者毫无疑问。今天我们可以找到许多受iPython笔记本启发的笔记本电脑实现,适用于任何语言。iPython进化的Jupyter支持不同的内核,而iScala实际上是基于akka播放的宁静服务重新实现它。如果您只考虑打开基于Web的笔记本并开始编写代码并与其进行交互,我认为它们非常相似。
如果我们考虑使用笔记本与Spark进行交互,那么使用Spark Notebook(在Scala中)可能会更有用,因为它是专门为此目的而设计的,它提供了一些工具来生成自定义火花上下文或停止当前正在进行的作业,无需访问Spark UI或从命令行运行命令。虽然有一个很好的功能,但我认为不会有很大的不同。
当我们接受依赖注入时,痛苦就来了,在这方面Scala是一个真正的噩梦!作为一个已编译的JVM语言,所有依赖项必须在类路径中可用,并且每次jar更改或新路径进入路径时都需要重新启动内核。此外,由于某种原因使用依赖管理工具(如sbt)会产生大量流量,然后将所有依赖项打包到一个大小为数百MB的胖jar中,然后必须由执行后端代码的JVM加载。Python在这里做得更好,因为所有内容都是在运行时指定的,您可以简单地导入代码或库,解释器将自动为您解决它,而无需重新启动内核。这一方面非常重要,尤其是在将IDE中的开发与笔记本中的探索分离时,从源文件夹中调用已实现逻辑的API。我用TypeSafe和SparkNotebook的人提出了这个问题,希望能以更有效的方式以某种方式解决它。
内置可视化:Spark Notebook包含一个非常基本的内置viz库,一个简单但可接受的WISP库,以及很少有关于javascript技术的包装,如D3,Rickshaw。一般来说,它可以渲染和包装任何JavaScript库,但非常友好也不直观。毫无疑问,Python在提供和选择绘制和构建交互式仪表板的酷炫和高级方法方面具有优势。
结论:Python获胜,即使SparkNotebook做得很好,Scala还不够成熟。我们还没有考虑最近的Apache Zeppelin,它提供了一些奇特的可视化功能,并支持语言无关的笔记本概念,其中每个单元可以代表任何类型的代码:Scala,Python,SQL ......并且专门设计用于与Spark集成。
最终判断
我应该使用Scala还是Python?答案是:两者都是的!
尝试两者并尝试测试自己哪种更适合您的特定用例。根据经验:Python更加面向分析,而Scala更加面向工程,但它们都是构建数据科学应用程序的优秀语言。理想的情况是让数据科学团队能够对这两者充满信心并在需要时进行交换。