简介
Spark由Berkeley大学研发是apache下的一个大数据处理框架是一个顶级项目。
1. 他号称在内存中比MapReduce快100倍,disk中快10倍
2. 易用性强上手快,支持java,scala,python,R语言
3. 应用广,可包含大数据查询,流式计算,机器学习,图计算
4. 可以在各个平台下运行
spark应用场景
大批量数据实时查询,离线数据批处理,流式计算
官网:http://spark.apache.org/
与hadoop对比
在hadoop中map任务的输出是一个<k,v>键值对,而reduce任务的输入就是读取map任务输出的这个键值对,Hadoop框架会将多个map任务的输出按照不同的分区拷贝到不同的reduce节点上,这个过程叫做shuffle。Spark也存在map和reduce任务和hadoop一样.
Shuffle对比
以下是hadoop中shuffle的过程示意图
1.MAP任务处理完毕之后先将数据存入内存。
2.紧接着对内存中的数据执行分区排序操作并存入磁盘,此时磁盘中就存在很多的小片用于存储。(写1)
3.读取磁盘上小分片中的数据然后merge写入一个大文件,这个大文件中包含很多分区。(读1+写2)
4.此时磁盘上会有很多的大文件,每个文件上的分区数据会输出给不同节点上的reduce任务(读2),这步操作应该还会产生IO消耗。
5.Reduce任务所在节点读取完毕后再对其进行merge操作形成一个大文件写入磁盘(写3)。
6最后reduce任务读取(读3)这个大文件作为自己的入参来进行计算。
以上就是hadoop中shuffle的简单过程,统计一下读写磁盘共有6次。Spark也有shuffle过程但是全部是基于内存的所以比hadoop快。
数据共享对比
Hadoop
1.Hdfs将数据存储在不同的节点上而且每个节点都会备份,一份数据可能会存储在3个不同的节点上这样还涉及到数据同步问题。
2.机器学习中结果也需要写入hdfs上这样也涉及同步问题。
3.在高并发查询时,每查询一次都要去hdfs上读取数据。
Spark
由于spark的数据是基于内存的所以速度快且不涉及数据备份,在高并发查询时只第一次从hdfs中读取后面的则可以从内存中读取。
Hadoop设计上不占用大量内存,spark则需要占用大量内存。
运行模式
Local:本地模式,多用于测试,使用linux和windows平台
Standalone:spark集群模式,使用spark自己的调度模式
Yarn:基于yarn,在yarn上运行
Mesos:类似yarn的资源调度框架,提供了有效的、跨分布式应用或框架的资源隔离和共享,可以运行Hadoop、Spark等框架
Windows下运行
在官网下载安装包,http://spark.apache.org/
在1选择spark版本,在2选择hadoop版本,然后在4下载安装包。我下载的是1.4.1一般往前至少推两个版本
Spark各个版本之间可能不兼容
解压缩安装包后在bin目录下双击spark-shell.cmd文件
1.windows下启动spark需要配置jdk我配置的是1.8,可能需要关闭防火器,360。
2.这个版本的spark自带scala2.10.4
3.spark启动的上下文对象可直接使用
4.可以通过sparkUI访问spark,看到以下界面就算启动成功了。在浏览器中可以查看spark的job,环境等信息
5.最后在启动完毕后的窗口内可以输入运行命令
例:一个简单的单词计数例子
新建两个txt文件,单词用tab键(\t)分割
sc.textFile("F://bigData//spark//word1.txt").flatMap(_.split("\t")).map((_,1)).reduceByKey(_+_).collect
这就是spark版本的单词计数
上面的是一个简写的版本,下面一个还原的版本已经测试通过,*表示全部文件。
sc.textFile("F://bigData//spark//wordcount//*").flatMap((line:String)=>line.split("\t")).map((x:String)=>(x,1)).reduceByKey((x:Int,y:Int)=>(x+y)).collect
sc.textFile("F://bigData//spark//wordcount//*"):*表示wordcount下所有的文件
.flatMap((line:String) => line.split("\t")):表示截取每一行
.map((x:String)=>(x,1)):map的入参是匿名函数,参数为x类型字符串,函数体是(x,1)。X表示通过\t分割的每一个字符串,每个字符串后跟数字1,<a,1>,<a,1>,<b,1>,…….
.reduceByKey((x:Int,y:Int)=>(x+y)):也是匿名函数,两个Int类型参数函数体是(x+y)。如果RDD元素类型为<k,v>键值对,对所有key值相同的元素的value进行处理,我这里定义的是(x+y)
<b,1>,<b,1>,<b,1>,<b,1>:1+1=> 2+1 => 3+1,最终结果是4,b出现4次
同样可以在浏览器中看到刚刚执行任务的信息,任务id,提交时间,花费时间,完成任务数,地址,占用系统内存数等。
Linux下运行
1.还是使用上一步中从官网下载的安装包将其拷贝到linux下然后解压缩
tar -zxvf spark-1.4.1-bin-hadoop2.6.tgz
2.在解压后的文件夹(/usr/local/spark-1.4.1-bin-hadoop2.6/conf)中执行改名命令
[root@shb01 conf]# mv spark-env.sh.template spark-env.sh
本地模式启动不改也行
3.在bin目录下执行spark-shell启动spark
[root@shb01 bin]# ./spark-shell
见到如下界面就算启动成功,此时的spark是本地模式
在启动过程中和windows下一样可以看到上下文信息,也可以和windows一样通过4040端口访问
Spark context available as sc/http://192.168.79.131:4040
此时通过jps可以看到linux下已经有一个spark进程
4.运行单词计数的例子,只需要更改文件的路径为linux下的路径即可,若是hdfs则为hdfs路径
sc.textFile("/usr/local/word").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect
sc.textFile("hdfs://shb01:9000/word").flatMap(_.split("")).map((_,1)).reduceByKey(_+_).collect
注:hdfs这个例子我没有测试
Linux下本地模式分类
Spark的本地启动模式分为5种
1.local:表示使用一个工作线程执行计算任务。
[root@shb01bin]# ./spark-shell
[root@shb01bin]# MASTER=local ./spark-shell
2.local[n]:表示使用指定的线程数执行计算任务
[root@shb01bin]# MASTER=local[2] ./spark-shell
3.local[*]:表示工作线程书会根据本机CPU的核数来确定
[root@shb01bin]# MASTER=local[*] ./spark-shell
4.local[threads,maxFailure]:threads工作线程数,maxFailure:计算任务失败最大的重试次数
[root@shb01bin]# MASTER=local[2,3] ./spark-shell
5.local[numSlave,corePerSlave,memoryPerSlave]:这种是最常用的方式是伪分布模式,三个参数分别是节点数,每个节点的CPU核数,每个节点的内存数(单位是M)。注意内存数最小是512M
[root@shb01bin]# MASTER=local[2,2,512] ./spark-shell
上面指定伪分布模式启动,执行jps可以看到出来sparksubmit之外还起了两个进程
另外从输出的日志可以看到master和两个worker信息通过UI可以看到相关信息
以上5种本地启动模式的信息都可以在4040看到