基于内存计算的大数据并行计算框架,可用于构建大型的,低延迟的数据分析应用
特点:
1,运行速度快
2,容易使用:支持Scala,java,Python和R语言,可以使用spark shell 进行交互式编程
3,通用性:包括迭代计算,sql查询,流失计算,图计算,机器学习
4,运行模式多样:可运行于独立集群模式,也可运行于Mesos,yarn等集群资源管理器上
优点:
1,提供如Filter、FlatMap、ReduceByKey、Join、Sort等操作;
2,基于RDD,将中间结果放入内存中、基于DAG实现更小粒度的任务调度执行机制,对于迭代运算效率更高、执行机制更合理;
3,基于RDD的血缘以及CheckPoint机制,可以减少由于数据集丢失而造成RDD重建所需的计算工作,实现了高容错性
1,复杂的批量数据处理(MapReduce): 通常时间跨度在数十分钟到数小时之间;
2,基于历史数据的交互式查询(Impala): 通常的时间跨度在数十秒到数分钟之间;
3,基于实时数据流的数据处理(Storm): 通常的时间跨度在数百毫秒到数秒之间;
注:Spark所提供的生态系统足以应对上述的三种场景,即同时支持批处理、交互式查询和流数据处理
RDD: 弹性分布式数据集 (Resillient Distributed Dataset),分布式内存的一个抽象概念,提供了一种高度受限的共享内存模型;
DAG: 有向无环图。反映RDD之间的依赖关系;
Executor: 运行在工作节点(Worker)的一进程,负责执行Task;
Application: 用户编写的Spark应用程序,一个Driver + 若干Job;
Job: 一个Job包含多个RDD及作用于相应RDD上的各种操作;
Task: 运行在Executor上的工作单元;
Stage:为Job的基本调度单位,一个Job会分为多组Task,每组Task被称为Stage(亦被称为Task Set),代表一组关联的、相互之间没有Shuffle依赖关系(亦即窄依赖)的任务组成的任务集。
一个Application由一个Driver和若干Job构成
一个Job由多个Stage构成
运行流程:执行Application,Driver向资源管理器申请资源,启动Executor,在Executor上执行Task,将结果返回Driver,或写入HDFS
SparkContext:由Driver创建,包括RDD对象,DAGScheduler解析,TaskScheduler
特点:
1,每个Application都有自己的Executor进程
2,Executor进程以多线程方式运行Task
3,spark运行,与资源管理器无关,只要获得Executor进程保持通信就行
RDD参考
分布式对象集合,一个只读的分区记录集合
高度受限的共享内存模型,RDD是只读的记录分区的集合,不能直接修改
提供了一组丰富的操作API,可分为“行动” (Action) 和“转换”(Transformation) 两种类型,还可以包括创建操作和控制操作
窄依赖:表现为一个或多个父RDD的分区对应于一个子RDD的分区
宽依赖:则表现为存在一个父RDD的一个分区对应一个子RDD的多个分区
1,在DAG中进行反向解析,遇到宽依赖就断开;
2,遇到窄依赖就把当前的RDD加入到Stage中;
3,将窄依赖尽量划分在同一个Stage中,可以实现流水线计算
1,创建RDD
2,SparkContext计算RDD依赖关系,构建DAG
3,DAGScheduler将DAG分解成Stage,每个Task被TaskScheduler分发给各个Worker节点上的Executor去执行
1) Spark的安装与配置(伪分布模式);
Java 8 环境
ssh配置
Hadoop 2.7安装(伪分布式)
查看官方文档
Scala环境:
Spark安装(http://mp:8080):
2) Spark-Shell的使用。尝试在Spark-Shell上以交互式编程的模式完成WordCount(输入可以是本地文件,如“file:///usr/local/spark/README.md”),要求按照字符串出现的次数倒序输出;
本地文件上传hdfs:
map(func):RDD中的每个数据通过函数func,构成一个新的RDD
filter(func): RDD中每个能使函数func返回true值的数据组成新的RDD
flatMap(func):类似于map转换,但func的返回值是一个Seq对象,Seq中的元素个数可以是0或者多个
mapPartitions(func):类似于map转换,但func的输入不是一个数据项,则是一个分区
mapPartitionsWithIndex(func):类似于mapPartitions转换,但func的数据还多了一个分区索引
union(otherDataset):两个RDD求并集
Intersection(otherDataset):两个RDD求交集
distinct([numTasks]):去重
reduceByKey(func, [numTasks]):让原RDD相同K的所有V依次经过函数func,得到的最终值作为K的V
sortByKey([ascending], [numTasks]):新RDD的数据根据ascending的指定顺序或者逆序排序
join(otherDataset, [numTasks]):原RDD数据的类型为(K, V),其他数据的类型为(K, W),对于相同的K,返回所有的(K, (V, W))
catesian(otherDataset):笛卡尔积
Action
reduce(func):令原RDD中的每个值依次经过函数func,func的类型为(T, T) => T,返回并行整合结果
collect():将原RDD中的数据打包成数组并返回
count():返回原RDD中数据的个数
first():返回原RDD中的第一个数据项
take(n):返回原RDD中前n个数据项,返回结果为数组
takeSample(withReplacement, num, [seed]):对原RDD中的数据进行采样,返回num个数据项
saveAsTextFile(path):将原RDD中的数据写入到文本文件当中
saveAsSequenceFile(path)(Java and Scala):将原RDD中的数据写入到序列文件当中
savaAsObjectFile(path)(Java and Scala):将原RDD中的数据序列化并写入到文件当中
countByKey():原RDD数据的类型为(K, V),返回hashMap(K, Int),用于统计K出现的次数