Spark全栈:工具集概览

来自CloudWiki
Cloud17讨论 | 贡献2022年7月10日 (日) 10:16的版本
跳转至: 导航搜索

敏捷开发工具栈的要求

对于数据科学技术栈来说,为了实现敏捷性,有那些必需的要求?

一个要求是栈的每一层都要水平可伸缩。往集群中再加一台机器比升级昂贵的专有硬件要好得多。如果要重写预测模型的实现才能重新部署,这就不敏捷了。这就是为什么我们要使用Spark MLlib而不是那些专门为单机设计的工具。

另一个要求是在栈的各层之间上下传递数据必须要能一行代码解决。在今天的配置密集型环境中,这是一个比较高的要求,但是我们可以通过精心挑选工具来满足。

工具集

Python3

由于Spark 2.1.0无法与Python 3.6兼容,所以我们在本书中使用了Python 3.5。本书原版出版后不久Spark 2.1.1就发布了,后续版本已经兼容于Python 3.6。

Anaconda与Miniconda

在本书中,我们使用Anaconda Python 3.5,因为Anaconda已成为数据科学领域领先的Python发行版。Anaconda是Continuum Analytics出品的Python发行版,包含超过400个流行的数据科学库。

尽管我推荐在你们自己的电脑上使用功能齐全的Anaconda,在Vagrant和EC2映像中我使用的是Anaconda的小弟弟Miniconda。这是因为Anaconda太大了,下载会花很长时间(20~30分钟)。而下载Miniconda只要几分钟。Miniconda和Anaconda很像,只是少装了一些包。

Jupyter笔记本

在第7章和第9章中我们会利用IPython/Jupyter笔记本交互式地使用Python,进行数据可视化、训练预测模型并改进。

使用JSON行和Parquet序列化事件

在我们的工具栈中,我们使用的一种序列化系统为JSON行(http://jsonlines.org/) (见图2-10)。你可能听到这种格式被称为换行符分隔的JSON格式,即NDJSON (http://ndjson.org/),不过确切来说JSON行格式不支持空行,而NDJSON支持。JSON使我们可以用一种通用格式通过各种语言和工具访问数据。

Python中的JSON

json模块在Python 2.7和3.x的标准库中(http://bit.ly/1upkGOV)不需要额外安装。要读取和写入JSON行文件,我们只需要短短几行代码。参见ch02/test_json.py

我们后面还会用到这些帮助函数,你可以在utils.py(https://github. com/rjurney/Agile_Data_Code_2/blob/master/lib/util.py)中找到它们以及其他一些全书都会用到的工具函数。就是这样!在Python中使用JSON行几乎不费吹灰之力。

收集数据

除了用于实时作业,Kafka(见图2-11)也成为了进行数据混洗的一种不错的选择。

使用Spark进行数据处理

Spark是领先的分布式通用数据处理平台。Spark把数据处理切分为小任务交给一群廉价的PC,每个任务在单台机器的磁盘和内存上执行。

Spark的任务是协调这些机器为一个整体的计算平台。Spark是一个分布式的平台,这对于支持任意规模的数据至关重要,而且Spark在这一方面做得非常好。它既可以在一台机器上以“本地模式”运行得很好,也可以在数千台机器组成的集群上运行得不错。

Spark也是优秀的黏合剂,它提供了包括Kafka和MongoDB等很多系统的连接器,可以把各种系统整合到一起。

Spark基于HDFS或S3运行,提供了Spark SQL、Spark MLlib和Spark Streaming等组件。

Python2022071001.png

Spark的本地模式可以让我们在开发中在本地的小规模数据集上运行Spark。在整本书中我们都使用Spark本地模式。这样你就可以通过本地开发进行学习,而等数据量变大的时候再迁移到Spark集群上。

在安装好了Spark及其依赖,并配置好环境之后,我们可以简单试用一下Spark。你可以使用pyspark命令在任何位置启动PySpark,不过如果是要运行本书的示例代码,你应该从Agile_Data_Code_2项目根目录启动PySpark。如果你是Spark新手,不妨阅读Spark编程指南(https://spark.apache.org/docs/1.6.1/programming-guide.html),然后跟着做一遍。

在使用PySpark时,你最好在浏览器单独的标签页中开着API文档,以便临时参考。PySpark有两套API:RDD(http://bit.ly/2p5IM9z)和DataFDataFrame。(你可能需要分别在浏览器不同的标签页中查询RDD、DataFrame和MLlib的相关文档。)你可能还需要查询Spark ML文档。

使用MongoDB发布数据

Spark不能直接和网络应用服务器通信。为了把数据提供给网络应用,我们需要把它发布到某个数据库中。有很多不错的选择,我们选择的是MongoDB,因为它简单易用,面向文档,而且和Spark集成得很好(见图2-16)。有了MongoDB和PySpark,我们可以在PySpark中定义任意的结构,然后使用MongoDB把它保存为与结构相对应的关系。在我们创建新的关系时,不用费心管理表结构,因为我们在PySpark中就把数据处理成了用来发布的形式。这就是敏捷!