“Promoting the ability of truth is lit the spark of faith.”
之前
Spark入门实战
一文介绍过Spark集群实时计算框架的基本架构,即基于Hadoop YARN或Mesos等大数据分布式系统,围绕SparkCore向上支持SQL查询、时序流计算、机器学习和图计算等不同类型的大数据分析计算任务。
进一步,我们通过R语言的简单实例展示了Spark编程的基本范式,即首先初始化SparkContext上下文管理器(即Spark计算的环境和接口),然后将数据读入到Spark的弹性分布式内存存储RDD中,之后定义转换操作和执行操作进行有向图的惰性计算,它们可认为是对MapReduce离线批处理操作的进一步抽象(原理请见白话MapReduce)。
Spark计算的核心围绕RDD数据集,但它是在分布式内存环境中完成计算,包括定义在RDD上的两类操作,转换和执行。不同对转换和执行操作组成数据流管道,其底层模式类似于R对dplyr包的计算逻辑。
转换操作类似于MR中的Map操作,用于创建RDD和RDD之间的转换处理,即转换操作的输出还是RDD。常用转换操作例如map、filter等。
执行操作类似于MR中的Reduce操作,用于根据RDD返回最终结果的操作,即执行操作的输出要返回SparkCore。常用的执行操作例如reduce、collect等。
算子函数都是支持并行化加速的,而func参数除内置的常用数学或操作函数外,还可以自定函数,可类比于在Hadoop大数据处理环境中构造合理的Java UDF(User Defined Function)函数。
值得注意的是,RDD是最基本的Spark计算数据单位,类似于编程语言中的列表、字符串等基本数据结构类型。同时,上述基本算子也是Spark Stream,SQL,MLlib, GraphX等高级分析算法库分布式实现的基础。
在具体实践中,特别是有语义抽象的数据表类型,类似于R或Python Pandas的dataframe,Spark也提供了针对DataFrame的转换和执行算子,基于Spark SQL实现底层,效率更优且也可与R或Python协同。
作为类比,R通过magrittr提供的链式操作,同样支持任意函数的”管道流式”计算。于此同时,dplyr包提供了datafrme格式的链式操作,因此,基于R数据流操作可以无缝的迁移至Spark计算环境下。
如果没有背景经验,抛开以上这些技术上的细节外,只记住一句的话,便是Spark算子计算的本质是函数式编程计算,而简单理解函数式编程,可认为是像推数学公式一样的写代码。
进一步严格的说,函数式编程,与过程式编程、面向对象编程类似都属于计算机编程的基本范式。与后两者区别的是,函数式编程将程序实体抽象为“数学意义上的计算函数”。因为数学函数是给定输入得到确定输出的映射,所以直观意义上,函数式编程中的函数是可以嵌套循环调用的,正如上文介绍的各种Spark算子。
除此以外,现代编程语言中的lambda匿名函数以及迭代器/生成器等函数式编程技巧都可以在Spark计算环境中应用。
同时,根据系统复杂性理论,系统中每当加入新的组分,必将引入新的不确定性。如果问题计算场景并非真的是海量数据,没有必要为了大数据的噱头而Spark。
如果想要自己动手实验,常用的Notebook工具有Jupyter、Zeppelin等,在本地也可搭建测试环境,网上有很多教程,这里便不多赘述了。最后,给出通过PySpark实现了一个简单的点击率预估算法,感兴趣的朋友可在公众号中回复“spark”查阅。
领取专属 10元无门槛券
私享最新 技术干货