引言:Spark由AMPLab实验室开发,其本质是基于内存的高速迭代框架,“迭代”是机器学习最大的特点,因此很适合做机器学习。

得益于在数据科学中强大的表现,Python语言的粉丝遍布天下,现在又遇上强大的分布式内存计算框架Spark,两个领域的强者走到一起,自然能碰出更加强大的火花(Spark能够翻译为火花)。因此本文主要讲述了PySpark。

本文选自《全栈数据之门》。

全栈框架

  Spark由AMPLab实验室开发,其本质是基于内存的高速迭代框架,“迭代”是机器学习最大的特点。因此很适合做机器学习。 

  框架由Scala语言开发。原生提供4种API,Scala、Java、Python以及近期版本号開始支持的R。Python不是Spark的“亲儿子”。在支持上要略差一些,但基本上经常使用的接口都支持。

得益于在数据科学中强大的表现,Python语言的粉丝遍布天下。现在又遇上强大的分布式内存计算框架Spark,两个领域的强者走到一起。自然能碰出更加强大的火花(Spark能够翻译为火花),因此PySpark是本节的主角。 

  在Hadoop发行版中,CDH5和HDP2都已经集成了Spark,仅仅是集成的版本号比官方的版本号要略低一些。

当前最新的HDP2.4已经集成了1.6.1(官方最新为2.0),能够看出。Hortonworks的更新速度很快。紧跟上游的步伐。 

  除Hadoop的Map-Reduce计算框架之外,Spark能异军突起,并且慢慢地建立自己的全栈生态。那还真得了解下Spark究竟提供了哪些全栈的技术。Spark眼下主要提供了下面6大功能。

  1. Spark Core: RDD及其算子。
  2. Spark-SQL: DataFrame与SQL。
  3. Spark ML(MLlib): 机器学习框架。
  4. Spark Streaming: 实时计算框架。

  5. Spark GraphX: 图计算框架。
  6. PySpark(SparkR): Spark之上的Python与R框架。

从RDD的离线计算到Streaming的实时计算。从DataFrame及SQL的支持,到MLlib机器学习框架;从GraphX的图计算到对统计学家最爱的R的支持,能够看出Spark在构建自己的全栈数据生态。从当前学术界与工业界的反馈来看,Spark也已经做到了。

环境搭建

  是骡子是马。拉出来遛一遛就知道了。

要尝试使用Spark是很easy的事情,一台机器就能够做測试和开发了。 

  訪问站点http://spark.apache.org/downloads.html,下载预编译好的版本号,解压即能够使用。

选择最新的稳定版本号。注意选择“Pre-built”开头的版本号。比方当前最新版本号是1.6.1,通常下载spark-1.6.1-bin-hadoop2.6.tgz文件。文件名称中带“-bin-”即是预编译好的版本号,不须要另外安装Scala环境。也不须要编译。直接解压到某个文件夹就可以。

  如果解压到文件夹/opt/spark。那么在$HOME文件夹的.bashrc文件里加入一个PATH:



  记得source一下.bashrc文件,让环境变量生效: 



  接着运行命令pyspark或者spark-shell,假设看到了Spark那帅帅的文本Logo和对应的命令行提示符>>>。则说明成功进入交互式界面,即配置成功。

  pyspark与spark-shell都能支持交互式測试。此时便能够进行測试了。相比于Hadoop来说,基本上是零配置即能够開始測试。 

  spark-shell測试: 



  pyspark測试: 

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYnJvYWR2aWV3MjAwNg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="【图4】" title="" style="border:0px; vertical-align:middle; display:table; margin:auto; max-width:100%">

分布式部署

  上面的环境測试成功,证明Spark的开发与測试环境已经配置好了。可是说好的分布式呢?我把别人的库都拖下来了,就是想尝试Spark的分布式环境,你就给我看这个啊? 

  上面说的是单机的环境部署,可用于开发与測试,仅仅是Spark支持的部署方式的当中一种。这样的是local方式,优点是用一台笔记本电脑就能够执行程序并在上面进行开发。尽管是单机,但有一个很实用的特性。那就是能够实现多进程。比方8核的机器。仅仅须要执行代码的时候指定–master local[],就能够用8个进程的方式执行程序。

代表使用所有CPU核心,也能够使用如local[4],意为仅仅使用4个核心。 

  单机的local模式写的代码,仅仅须要做少量的改动就可以执行在分布式环境中。

Spark的分布式部署支持好几种方式,例如以下所看到的。

  Standalone:本身自带的集群(方便測试和Spark本身框架的推广)。 

  Mesos:一个新的资源管理框架。 

  YARN:Hadoop上新生的资源与计算管理框架,能够理解为Hadoop的操作系统, 

  能够支持各种不同的计算框架。

  EC2:亚马逊的机器环境的部署。

  从难易程度上来说。Standalone分布式最简单。直接把解压好的包拷贝到各台机器上去,配置好master文件和slave文件,指示哪台机器做master。哪些机器做salve。然后在master机器上。通过自带的脚本启动集群就可以。 

  从使用率上来说。应该是YARN被使用得最多,由于一般是直接使用发行版本号中的Spark集成套件。CDH和HDP中都已经把Spark和YARN集成了,不用特别关注。

  分布式的优势在于多CPU与更大的内存,从CPU的角度再来看Spark的三种方式。

  • 本机单CPU:“local”。数据文件在本机。
  • 本机多CPU:“local[4]”,数据文件在本机。
  • Standalone集群多CPU:“spark://master-ip:7077”,须要每台机器都能訪问数据文件。 

       

      YARN集群多CPU:使用“yarn-client”提交。须要每台机器都能訪问到数据文件。 

      交互式环境的部署也与上面的部署有关系,直接使用spark-shell或者pyspark是local的方式启动,假设须要启动单机多核或者集群模式,须要指定–master參数。例如以下所看到的。



  假设使用pyspark,而且习惯了IPython的交互式风格,还能够加上环境变量来启动IPython的交互式,或者使用IPython提供的Notebook:



  IPython风格例如以下所看到的:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYnJvYWR2aWV3MjAwNg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="【图7】" title="" style="border:0px; vertical-align:middle; display:table; margin:auto; max-width:100%">

演示样例分析

  环境部署是新手最头痛的问题,前面环境已经部署好了,接下来才是正题。由于Scala较Python复杂得多,因此先学习使用PySpark来敲代码。 

  Spark有两个最基础的概念,sc与RDD。

sc是SparkContext的缩写,顾名思义,就是Spark上下文语境,sc连接到集群并做对应的參数配置。后面全部的操作都在这个上下文语境中进行,是一切Spark的基础。在启动交互式界面的时候,注意有一句提示:

SparkContext available as sc, HiveContext available as sqlContext.

   

  意思是。sc这个变量代表了SparkContext上下文,能够直接使用,在启动交互式的时候,已经初始化好了。 

假设是非交互式环境。须要在自己的代码中进行初始化:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYnJvYWR2aWV3MjAwNg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="【图8】" title="" style="border:0px; vertical-align:middle; display:table; margin:auto; max-width:100%">

  RDD是Resilient Distributed Datasets(弹性分布式数据集)的缩写,是Spark中最基本的数据处理对象。生成RDD的方式有非常多种,当中最基本的一种是通过读取文件来生成:



  读取joy.txt文件后,就是一个RDD,此时的RDD的内容就是一个字符串。包括了文件的所有内容。 

  还记得前面使用Python来编写的WordCount代码吗?通过Hadoop的Streaming接口提到Map-Reduce计算框架上运行。那段代码可不太好理解,如今简单的版本号来了。 

  WordCount样例的代码例如以下所看到的: 

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYnJvYWR2aWV3MjAwNg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="【图10】" title="" style="border:0px; vertical-align:middle; display:table; margin:auto; max-width:100%">

  在上面的代码中,我个人喜欢用括号的闭合来进行分行,而不是在行尾加上续行符。 

  PySpark中大量使用了匿名函数lambda。由于通常都是很easy的处理。核心代码解读例如以下。

  1. flatMap:对lines数据中的每行先选择map(映射)操作,即以空格切割成一系列单词形成一个列表。

    然后运行flat(展开)操作。将多行的列表展开,形成一个大列表。此时的数据结构为:[‘one’,’two’,’three’,…]。

  2. map:对列表中的每一个元素生成一个key-value对,当中value为1。

    此时的数据结构为:[(‘one’, 1), (‘two’,1), (‘three’,1),…],当中的’one’、’two’、’three’这种key,可能会出现反复。

  3. reduceByKey:将上面列表中的元素按key同样的值进行累加,其数据结构为:[(‘one’, 3), (‘two’, 8), 

    (‘three’, 1), …],当中’one’, ‘two’,’three’这种key不会出现反复。

最后使用了wc.collect()函数,它告诉Spark须要取出全部wc中的数据,将取出的结果当成一个包括元组的列表来解析。 

相比于用Python手动实现的版本号,Spark实现的方式不仅简单,并且非常优雅。

两类算子

  Spark的基础上下文语境为sc,基础的数据集为RDD,剩下的就是对RDD所做的操作了。 

  对RDD所做的操作有transform与action。也称为RDD的两个基本算子。

  transform是转换、变形的意思。即将RDD通过某种形式进行转换,得到另外一个RDD,比方对列表中的数据使用map转换。变成另外一个列表。 

  当然,Spark能在Hadoop的Map-Reduce模型中脱颖而出的一个重要因素就是其强大的算子。

Spark并没有强制将其限定为Map和Reduce模型。而是提供了更加强大的变换能力,使得其代码简洁而优雅。 

  以下列出了一些经常使用的transform。

  • map(): 映射,类似于Python的map函数。

  • filter(): 过滤,类似于Python的filter函数。
  • reduceByKey(): 按key进行合并。
  • groupByKey(): 按key进行聚合。

RDD一个很重要的特性是惰性(Lazy)原则。

在一个RDD上执行一个transform后。并不马上执行,而是遇到action的时候,才去一层层构建执行的DAG图。DAG图也是Spark之所以快的原因。

  • first(): 返回RDD里面的第一个值。

  • take(n): 从RDD里面取出前n个值。

  • collect(): 返回所有的RDD元素。

  • sum(): 求和。
  • count(): 求个数。

回到前面的WordCount样例,程序仅仅有在遇到wc.collect()这个须要取所有数据的action时才运行前面RDD的各种transform,通过构建运行依赖的DAG图,也保证了运行效率。

map与reduce

  初始的数据为一个列表。列表里面的每个元素为一个元组,元组包括三个元素。分别代表id、name、age字段。

RDD正是对这种基础且又复杂的数据结构进行处理。因此能够使用pprint来打印结果,方便更好地理解数据结构。其代码例如以下:



  parallelize这个算子将一个Python的数据结构序列化成一个RDD,其接受一个列表參数,还支持在序列化的时候将数据分成几个分区(partition)。分区是Spark执行时的最小粒度结构,多个分区会在集群中进行分布式并行计算。

  使用Python的type方法打印数据类型,可知base为一个RDD。在此RDD之上,使用了一个map算子,将age添加3岁,其它值保持不变。

map是一个高阶函数。其接受一个函数作为參数。将函数应用于每个元素之上,返回应用函数用后的新元素。此处使用了匿名函数lambda,其本身接受一个參数v。将age字段v[2]添加3。其它字段原样返回。从结果来看。返回一个PipelineRDD,其继承自RDD,能够简单理解成是一个新的RDD结构。 

  要打印RDD的结构,必须用一个action算子来触发一个作业。此处使用了collect来获取其所有的数据。

  接下来的操作,先使用map取出数据中的age字段v[2],接着使用一个reduce算子来计算全部的年龄之和。

reduce的參数依旧为一个函数,此函数必须接受两个參数,分别去迭代RDD中的元素,从而聚合出结果。效果与Python中的reduce同样,最后仅仅返回一个元素。此处使用x+y计算其age之和,因此返回为一个数值,运行结果例如以下图所看到的。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYnJvYWR2aWV3MjAwNg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" target="_blank" style="color:rgb(0,101,126); outline:0px; background:0px 0px">

AMPLab的野心

  AMPLab除了最著名的Spark外,他们还希望基于内存构建一套完整的数据分析生态系统,能够參考https://amplab.cs.berkeley.edu/software/上的介绍。

  他们的目的就是BDAS(Berkeley Data Analytics Stack),基于内存的全栈大数据分析。前面介绍过的Mesos是集群资源管理器。还有Tachyon,是基于内存的分布式文件系统,类似于Hadoop的HDFS文件系统,而Spark Streaming则类似于Storm实时计算。 

  强大的全栈式Spark。撑起了大数据的半壁江山。

  本文选自《全栈数据之门》,点此链接可在博文视点官网查看此书。 

                    

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYnJvYWR2aWV3MjAwNg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="图片描写叙述" title="" style="border:0px; vertical-align:middle; display:table; margin:auto; max-width:100%">

  想及时获得很多其它精彩文章,可在微信中搜索“博文视点”或者扫描下方二维码并关注。

                         

强者联盟——Python语言结合Spark框架的更多相关文章

  1. Linux下Spark框架配置(Python)

    简述  Spark是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用并行框架,Spark,拥有Hadoop MapReduce所具有的优点:但不同于MapRedu ...

  2. Python几种主流框架

    从GitHub中整理出的15个最受欢迎的Python开源框架.这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等. Django: Python Web应用开发框架 Djang ...

  3. python三大web框架Django,Flask,Flask,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架

    Python几种主流框架 从GitHub中整理出的15个最受欢迎的Python开源框架.这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等. Django: Python We ...

  4. Django,Flask,Tornado三大框架对比,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架

    Django 与 Tornado 各自的优缺点Django优点: 大和全(重量级框架)自带orm,template,view 需要的功能也可以去找第三方的app注重高效开发全自动化的管理后台(只需要使 ...

  5. 关于《selenium2自动测试实战--基于Python语言》

    关于本书的类型: 首先在我看来技术书分为两类,一类是“思想”,一类是“操作手册”. 对于思想类的书,一般作者有很多年经验积累,这类书需要细读与品位.高手读了会深有体会,豁然开朗.新手读了不止所云,甚至 ...

  6. 【Python基础学习一】在OSX系统下搭建Python语言集成开发环境 附激活码

    Python是一门简单易学,功能强大的编程语言.它具有高效的高级数据结构和简单而有效的面向对象编程方法.Python优雅的语法和动态类型以及其解释性的性质,使它在许多领域和大多数平台成为编写脚本和快速 ...

  7. 如何系统地自学一门Python 语言(转)

    转自:http://www.phpxs.com/post/4521 零基础情况下,学一门语言充实下自己,Python,简洁.优美.容易使用,是一个很好的选择.那么如何系统地自学Python呢? 有的人 ...

  8. 《Selenium2自动化测试实战--基于Python语言》 --即将面市

    发展历程: <selenium_webdriver(python)第一版>   将本博客中的这个系列整理为pdf文档,免费. <selenium_webdriver(python)第 ...

  9. 利用Scala语言开发Spark应用程序

    Spark内核是由Scala语言开发的,因此使用Scala语言开发Spark应用程序是自然而然的事情.如果你对Scala语言还不太熟悉,可 以阅读网络教程A Scala Tutorial for Ja ...

随机推荐

  1. JDBC四(web基础学习笔记十)

    一.增加 .修改.删除.查询 将功能整合在一个类中 package pb.base; import java.sql.Connection; import java.sql.DriverManager ...

  2. Java从零开始学四(数据类型)

    一.Java数据类型划分 二.基本数据类型 No. 数据类型 大小/位 可表示的数据范围 1 long(长整数) 64 -9223372036854775808 ~ 92233720368547758 ...

  3. java面试第六天

    集合:保存多个其他对象的对象,不能保存简单类型 List:有序(存放元素的顺序),可重复的集合 ArrayList:实质就是一个会自动增长的数组 查询效率比较高,增删的效率比较低,适用于查询比较频繁, ...

  4. H5中JavaScript常用代码片段

    /** * 批量替换方法,批量过滤特殊字符,通常用在通过后的各种编辑器添加的内容在App上编辑上使用 * james.wang 2016-11-11 * 使用方法:ReCont(Content,[&q ...

  5. spring mvc对异步请求的处理

    在spring mvc3.2及以上版本增加了对请求的异步处理,是在servlet3的基础上进行封装的. 1.修改web.xml <?xml version="1.0" enc ...

  6. JS模拟list

    /* * List 大小可变数组 */ function List() { this.list = new Array(); }; /** * 将指定的元素添加到此列表的尾部. * @param ob ...

  7. 通俗的理解HTTPS以及SSL中的证书验证

    一.HTTPS的安全性体现在哪 HTTP(超文本传输协议,Hyper Text Transfer Protocol)是我们浏览网站信息传输最广泛的一种协议.HTTPS(Hyper Text Trans ...

  8. fdisk -l解析

    fdisk -l显示信息详解 [root@www.linuxidc.com ~]# fdisk -l Disk /dev/sda: 10.7 GB, 10737418240 bytes 255 hea ...

  9. 很幽默的讲解六种Socket IO模型

    很幽默的讲解六种Socket IO模型 本文简单介绍了当前Windows支持的各种Socket I/O模型,如果你发现其中存在什么错误请务必赐教. 一:select模型二:WSAAsyncSelect ...

  10. jquery 事件小事例

    用户名变灰 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> & ...