强者联盟——Python语言结合Spark框架
引言: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大功能。
- Spark Core: RDD及其算子。
- Spark-SQL: DataFrame与SQL。
- Spark ML(MLlib): 机器学习框架。
- Spark Streaming: 实时计算框架。
- Spark GraphX: 图计算框架。
- 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的处理。核心代码解读例如以下。
- flatMap:对lines数据中的每行先选择map(映射)操作,即以空格切割成一系列单词形成一个列表。
然后运行flat(展开)操作。将多行的列表展开,形成一个大列表。此时的数据结构为:[‘one’,’two’,’three’,…]。
- map:对列表中的每一个元素生成一个key-value对,当中value为1。
此时的数据结构为:[(‘one’, 1), (‘two’,1), (‘three’,1),…],当中的’one’、’two’、’three’这种key,可能会出现反复。
- 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之和,因此返回为一个数值,运行结果例如以下图所看到的。
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框架的更多相关文章
- Linux下Spark框架配置(Python)
简述 Spark是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用并行框架,Spark,拥有Hadoop MapReduce所具有的优点:但不同于MapRedu ...
- Python几种主流框架
从GitHub中整理出的15个最受欢迎的Python开源框架.这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等. Django: Python Web应用开发框架 Djang ...
- python三大web框架Django,Flask,Flask,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架
Python几种主流框架 从GitHub中整理出的15个最受欢迎的Python开源框架.这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等. Django: Python We ...
- Django,Flask,Tornado三大框架对比,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架
Django 与 Tornado 各自的优缺点Django优点: 大和全(重量级框架)自带orm,template,view 需要的功能也可以去找第三方的app注重高效开发全自动化的管理后台(只需要使 ...
- 关于《selenium2自动测试实战--基于Python语言》
关于本书的类型: 首先在我看来技术书分为两类,一类是“思想”,一类是“操作手册”. 对于思想类的书,一般作者有很多年经验积累,这类书需要细读与品位.高手读了会深有体会,豁然开朗.新手读了不止所云,甚至 ...
- 【Python基础学习一】在OSX系统下搭建Python语言集成开发环境 附激活码
Python是一门简单易学,功能强大的编程语言.它具有高效的高级数据结构和简单而有效的面向对象编程方法.Python优雅的语法和动态类型以及其解释性的性质,使它在许多领域和大多数平台成为编写脚本和快速 ...
- 如何系统地自学一门Python 语言(转)
转自:http://www.phpxs.com/post/4521 零基础情况下,学一门语言充实下自己,Python,简洁.优美.容易使用,是一个很好的选择.那么如何系统地自学Python呢? 有的人 ...
- 《Selenium2自动化测试实战--基于Python语言》 --即将面市
发展历程: <selenium_webdriver(python)第一版> 将本博客中的这个系列整理为pdf文档,免费. <selenium_webdriver(python)第 ...
- 利用Scala语言开发Spark应用程序
Spark内核是由Scala语言开发的,因此使用Scala语言开发Spark应用程序是自然而然的事情.如果你对Scala语言还不太熟悉,可 以阅读网络教程A Scala Tutorial for Ja ...
随机推荐
- Java从零开始学六(运算符)
运算符 一.赋值运算符号 No. 赋值运算符号 描述 1 = 赋值 int num=22; System.out.println("num= "+num); num=num-3; ...
- Linux操作系统启动界面(字符or图形界面)的设置及切换方法
安装完Linux操作系统后,默认是从图形界面启动的.那么如何使得系统从字符界面启动呢? 打开一个命令终端: #vim /etc/inittab 修改 id::initdefault: 为 id::in ...
- Performance Testing
To test application performance, add rules using FiddlerScript to the OnBeforeResponse function (exc ...
- MySQL常见架构的应用
MySQL 的架构设计 MySQL 架构一定要结合前台业务来设计.优化,所以不管是哪种架构.根据业务要求组合成符合需求的即是最好的.不能泛泛而谈同时.也必须注意数据的安全(如ipsec,ssh,vpn ...
- vue 项目的开发流程
1.$ node -v (检测node版本,node版本需要在 V4 以上) 2.全局安装vue $ npm install -g vue 3.安装脚手架 $ npm install -g vue-c ...
- How to set up OpenERP for various timezone kindly follow the following steps to select timezone in OpenERP
How to set up OpenERP for different Time Zones Click on the "Edit Preferences" wheel a ...
- UI复习练习_优酷布局
还记得前一周,细致看了一下我自己的代码,特意看了下代码规范,一个好的代码习惯就应该慢慢增加自己寻常练习中. 看看UI吧 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5 ...
- Redis学习(6)-常用命令
List命令 value值为LinkedList类型. 使用环境: 1,做大数据集合的增删. 2,任务队列.用户任务队列 链表查看 lrange key start end:获取链表从start到en ...
- 1038. Recover the Smallest Number (30)
题目链接:http://www.patest.cn/contests/pat-a-practise/1038 题目: 1038. Recover the Smallest Number (30) 时间 ...
- Spring MVC request flow
1. When we enter a URL in the browser, the request comes to the dispatcher servlet.The dispatcher se ...