spark是 什么?
spark是一个快速且通用的集群计算平台
spark特点:
spark是快速的
spark扩充了MapReduce计算模型
spark是基于内存计算的
当我们处理大批量的数据的时候,难免会产生中间数据结果,
我们往哪里放?
第一种方法:放在硬盘中,很显然会带来写入写出的消耗。
第二种方法:放在内存中,spark是采用json方法
spark是通用的:
比如我有一个瑞士刀 里面带有很多小刀
spark的设计容纳了其他分布式系统拥有的功能
批处理、迭代式计算、交互式查询和流处理等
批处理:hadoop
迭代计算:机器学习
交互查询:hive
流处理框架:storm
优点:降低了维护成本
spark是高度开发的:
spark提供了python java scala SQL的API和丰富的内置库。
saprk和其他的大数据工具整合的很好,包括hadoop,kafka等。
spark生态
-----------------------------
诞生于2009年,加州大学伯克利分校RAD实验室的一个研究项目
最初是基于hadoop MapReduce的,
发现MapReduce在迭代式计算和交互式上低效,引入了内存存储
2010年3月份spark开源
2011年AMP实验室在spark上开发高级组件,像spark Streaming
2013年转移到Apache下,不就便成为顶级项目了
spark组件
---------------------------
sparkCore:包含spark基本功能,包含任务调度,内存管理,容错机制
内部定义了RDDs(弹性分布式数据集)
提供了很多APIs来创建和操作这些RDDs
应用场景,为其他组件提供底层的服务
saprkSQL:是spark处理结构化数据的库,就像Hivesql,mysql一样,
应用场景,企业中用来做报表统计
sparkstreaming:是实时数据流处理组件,类似storm
sparkstreaming提供API来操作实时流数据
应用场景,企业中用来从kafka接受数据做实时统计
Mlib:一个包含通用机器学习功能的包 ,Machine learning lib。
包含分类,聚集,回归等,还包括模型评估,和数据导入
MLlib提供的上面的方法,都支持集群上的横向扩展。
应用场景:机器学习
Graphx:是处理图的库(例如,社交网络图),并进行图的并行计算
像saprkstreaming,saprkSQL一样,他继承了RDD API
它提供了各种图的操作,和常用的图算法,比如:PangeRank算法
应用场景:图计算
Cluster Managers:就是集群管理,saprk自带一个集群管理就是单独调度器
常见的集群管理包括Hdoop YARN Apache Mesos
精密集成的优点:
spark底层优化了,基于saprk底层的组件,也得到了相应的优化
紧密集成,节省了各个组件组合使用时的部署,测试等时间
向spark增加新的组件时,其它组件,可立即想用新组件的功能
spark和hadoop比较
---------------------------------
hadoop应用场景
离线处理
对时效性要求不高
我们知道hadoop在处理数据的时候它的中间数据落到硬盘上,
这样就导致hadoop在处理大量数据的时候他的时效性不是很高。
hadoop执行时间是几分钟到几小时
spark应用场景
时效性要求高的场景
因为spark是基于内存的,他的中间数据尽量不落在硬盘上,
尽量的存储在内存中,这样就大大加快spark计算任务
spark执行时间是几秒钟到几分钟
还有一个领域机器学习
比较:
DougCutting的观点
这是生态系统,每个组件都有其作用,各善其职就可以了
spark不具有HDFS的存储能力,要借助HDFS持久化数据
saprk运行环境
-----------------------
spark是Scala写的,运行在JVM上,所以运行环境java+
如果你用pythonAPI写的话,需要安装python2.6+或者3.4上
scala和spark版本对应关系
spark1.6.2 - Scala2.10 Spark2.0.0 - Scala2.11
saprk下载
---------------------
下载地址:http://spark.apache.org/downloads.html
搭spark不需要hadoop,如果有hadoop集群,可下在相应版本
解压
spark目录:
bin包含用来saprk交互的可执行文件,如saprkshell
core,streaming,python...包含主要组件的源代码
examples包含一些单机sparkjob,你可以研究和运行这些例子
spark的shell:
spark的shell使你能够处理分布在集群的数据。
spark把数据加载到节点的内存中,因此分布式处理可在秒级完成
快速使迭代式计算,实时查询、分析一般能够在shell完成
saprk提供了python shells和scala shells
scala shell:
bin/spark-shell
Scala安装
--------------------------
下载地址:https://www.scala-lang.org/download/2.10.5.html
默认安装选项会自动配置环境变量
scala和spark版本对应关系
spark1.6.2 - Scala2.10 Spark2.0.0 - Scala2.11
Intellij IDEA的下载 ,安装:
-------------------------------
下载地址http://www.jetbrains.com/idea/
scala插件安装
----------------------------
plugins 搜索scala直接安装,插件中有scala和sbt
搭建开发环境常遇到的问题:
网络问题
版本匹配问题Scala2.10.5,jdk18,spark162。Sbt.013.8
IntelliJ IDEA常用的设置
主题和颜色 appearance
字体 Editor Colors & Fonts Fonts
RDD
-------------------
Driver program:
包含程序的main()方法,RDDs的定义个操作
它管理很多节点,我们称作executors
sparkContext: 通过sparkcontext对象访问spark
sparkContext对象代表和一个集群的连接
在shell中spark自动创建好了,就是sc
RDDs:(弹性分布式数据集,简写RDDs)
这些RDDs,并行的分布在整个集群中 Lines就是数据集
RDDs是spark分发数据和计算的基础抽象类
一个RDD是一个不可改变的分布式集合对象
saprk中,所有的计算都是通过RDDs的创建,转换操作完成的。
一个RDD内部由许多partitions(分片)组成的
分片:
每个分片包括一部分数据,partitions可在集群不同节点上计算
分片是spark并行处理的单元,spark顺序的,并行的处理分片
RDDS创建方法:
把一个存在的集合传个sparkContext的parallelize()方法,测试用val arr = sc.parallelize(Array(1,2,2,4),4) rdd.foreach(print)遍历每一个变量打印出来
第一个参数:待并行化处理的集合,第二个参数:分区个数
RDDS创建方法:
加载外部数据集
val rddText = sc.texFile("helloSparka.text")
Transformations
-------------------------
Transformations (转换)
从之前的RDD构建一个新的RDD,像map()和filter()
逐元素Transformations
map()
map()接受函数,把函数应用到RDD的每一个元素,返回新的RDD
filter()
filter()接收函数,返回只包含满足filter()函数的元素的新RDD
flatMap()
对每个输入元素,输出多个输出元素
翻译就是压扁的意思,将RDD中元素压扁返回一个新的RDD
集合运算
----------------------
RDDs支持数学集合的计算,例如并集、交集
RDD基本操作Actio
---------------------------------
在RDD上计算出来一个结果
把结果返回给driver program或保存在文件系统,count(),save
常用的:
reduce()
接收一个函数是,作用在RDD两个类型相同的元素上,返回新元素
可以实现,RDD中元素的累加,计数,和其他类型的聚集操作
Collect():
遍历整个RDD,向driver program返回RDD的内容
需要单机内存能够容纳下(因为数据要拷贝给driver,测试使用)
大数据的时候,使用saveAsTextFile()action等
take(n):
返回RDD的n个元素(同时尝试访问最少的partitions)
返回结果是无序的,测试使用
top():
排序(更加RDD中数据的比较器)
foreach():
计算RDD中的每个元素,但不返回到本地
可以配合println()友好输出打印出数据
RDDs的特性:
-------------------
RDDS的血统关系图:
Spark维护着RDDs之间的依赖关系和创建关系,叫做血统关系图
spark使用血统关系图来计算每个RDD的需求和恢复丢失的数据
延迟计算:
spark对RDDs的计算是,他们第一次使用action操作的时候
这种方式在处理大数据的时候特别有用,可以减少数据的传输
spark内部记录metadata表名transformations操作已经被响应了
加载数据也是延迟计算,数据只有在必要的时候,才会被加载进去
RDD.persist():持久化
默认每次在RDDs上面进行action操作时,saprk都重新计算RDDs
如果想重复利用一个RDD,可以使用RDD.persist()
unpersist()方法从缓存中移除
KeyVlaue对RDDs
-------------------
创建KeyVlaue对RDDs:
使用map函数,返回key/value对
例如:包含数行数据的RDD,把每行数据的第一个单词作为keys
combineByKey():
最常用的基于key的聚合函数,返回的类型可以输入类型不一样
许多基于key的聚合函数都用到了它,像groupBykey()
主要是遍历partition中的元素,元素的key,要么之前见过的,要么不是。
如果是新元素,使用我们提供的createCombiner()函数
如果是这个partition中已经存在的key,就会使用mergeValue()函数
合计每个partition的结果的时候,使用mergeCombiners()函数
Scala基础知识
-------------------------------
scala变量声明:
在scala中创建变量的时候,必须使用val中var
val,变量值不可修改,一旦分配不能重新指向别的值
var,分配后,可以指向类型相同的值
scala的匿名函数和类推断:
lines.filteer(line=>line.contains("world"))
定义一个匿名函数,接受一个参数line
使用line这个Stirng类型变量上的contains方法,并且返回结果
line的类型不需指定,能够推断出来