spark 基础
scala版 ,基本名词概念及 rdd的基本创建及使用
var conf = new SparkConf()
var sc: SparkContext = new SparkContext(conf)
val rawRDDA = sc.parallelize(List("!! bb ## cc","%% cc bb %%","cc && ++ aa"),3)
# sc.parallelize(,3) 将数据并行加载到三台机器上
var tmpRDDA1 = rawRDDA.flatMap(line=>line.split(" "))
var tmpRDDA2 = tmpRDDA1.filter(allWord=>{allWord.contains("aa") || allWord.contains("bb")})
var tmpRDDA3 = tmpRDDA2.map(word=>(word,1))
import org.apache.spark.HashPartitioner
var tmpRDDA4 = tmpRDDA.partitionBy(new HashPartitioner(2)).groupByKey()
#partitionBy(new HashPartitioner(2)).groupByKey 将之前的3台机器Shuffle成两台机器
var tmpResultRDDA = tmpRDDA4.map((P:(String,Iterable[Int]))=>(P._1,P._2.sum))
#对相同的key的value进行求和
Partition :某机上一个固定数据块 , 一系列相关Partition组合为一个RDD 。
如tmpRDDA2拥有3个Partition ,而 tmpResultRDDA拥有两个Partition
RDD :数据统一操作所在地, 代码中任意一个操作(如faltMap,filter,map), RDD内的所有Partition都会执行
如在rawRDDA->tmpRDDA1时 ,执行flatMap(line=>line.split(" ")),则rawRDD 的三个Partition (分别为 cslave0上的“!! bb ## cc”,
cslave1上的“-- cc bb $$”和cslave2上的“cc ^^ ++ aa”都要执行flatMap操作)
RDD 是数据并行化所在地 ,隶属于某RDD的所有Partition都要执行相同操作,当这些Partition存在于不同机器,就会由不同机器同时执
行,也就是并行执行
RDD并行化范式主要有Map和Shuffle
Map 范式 :只对本Partition上的数据进行操作, 操作的数据对象不跨越多个Partition,即不跨越网络 。
Shuffle范式 : 对不同Partition上的数据进行重组,其操作的数据对象跨越多个甚至是所有Partition ,即跨越网络
场景 :多输入源
两个原始文件rawFile1 和 rawFile2,要求将rawFile1的内容均匀加载到cslave3,cslave4上,接着对rawFile1进行数据去重,
要求将rawFile2加载到cslave5,然后将rawFile1的处理结果中 去掉rawFile2中所含的条目
var conf = new SparkConf()
var sc: SparkContext = new SparkContext(conf)
var rawRDDB = sc.parallelize(List(("xx",99),("yy",88),("xx",99),("zz",99)),2)
var rawRDDC = sc.parallelize(List(("yy",88)),1)
var tmpResultRDDBC = rawRDDB.distinct.subtract(rawRDDC)
subtract()就是两个RDD相减,而这两个RDD来自不同的输入文件
场景:复杂情况
初始化多个rdd,相互取并集或差集
多输入源,去重,装换,再合并
var conf = new SparkConf()
var sc:SparkContext = new SparkContext(conf)
var rawRDDA = sc.parallelize(List("!! bb ## cc","%% cc bb %%","cc && ++ aa"),3)
var rawRDDB = sc.paralleliz(List(("xx,99),("yy",88),("xx",99),("zz",99)),2)
var rawRDDC = sc.parallelize(List(("yy",88)),1)
import org.apache.spark.HashPartitioner
var tmpResultRDDA = rawRDDA.flatMap(line=>line.split(" ")).filter(allWord=>{allWord.contains("aa")||allWord.contains("bb")}).map(word=>(word,1)).partitionBy(new HashPartitioner(2)).groupByKey().map((P:String,Iterable[Int]))=>(P._1,P._2.sum))
var tmpResultRDDBC = rawRDDB.distinct.subtract(rawRDDC)
var resultRDDABC = tmpResultRDDA.union(tmpResultRDDBC)
resultRDDABC.saveAsTextFile("HDFS路径")
map范式作用于RDD时,不会改变前后两个RDD内Partition数量, 当partitionBy,union作用于RDD时,会改变前后两个RDD内Partition数量
RDD持久化到HDFS时,RDD对应一个文件夹,属于该RDD的每个Partition对应一个独立文件
RDD之间的中间数据不存入本地磁盘或HDFS
RDD的多个操作可以用点‘.’连接,如 RDD1.map().filter().groupBy()
RDD可以对指定的某个Partition进行操作,而不更改其他Partition
Spark-app执行流程:
1.用户调用RDD API接口,编写rdd转换应用代码
2.使用spark提交job到Master
3.Master收到job,通知各个Worker启动Executor
4.各个Executor向Driver注册 (用户编写的代码和提交任务的客户端统一称Driver)
5.RDD Graph将用户的RDD串组织成DAG-RDD
6.DAGSchedule 以Shuffle为原则(即遇Shuffle就拆分)将DAG-RDD拆分成一系列StageDAG-RDD(StageDAG-RDD0->StageDAG-RDD1->StageDAG-rdd2->...)
7.RDD通过访问NameNode,将DataNode上的数据块装入RDD的Partition
8.TaskSchedule将StageDAG-RDD0发往隶属于本RDD的所有Partition执行,在Partition执行过程中,Partition上的Executor优先执行本Partition.
9.TaskSchedule将StageDAG-RDD1发往隶属于本RDD(已改变)的所有Partition执行
10.重复上面8,9步的步骤,直至执行完所有Stage-DAG-RDD
资源隔离性
每个执行的Spark-APP都有自己一系列的Executor进程(分布在不同的机器上或内核上),这些Executor会协作完成该任务。
单个Executor会以多线程复用方式运行该Spark-APP分配来的所有Task .
一个Executor只属于一个Spark-APP,一个Spark-APP可以有多个Executor
这与MapReduce不同。 比如某个由Map->Reduce1->Reduce2构成的ML-App,有十个Slave同时执行该任务,从某一个slave机器上来看,
MapReduce框架执行时会启动Map进程,Reduce1进程,Reduce2进程,三个进程顺序执行该任务
而Spark则使用一个Executor进程完成这四个操作。
spark-APP本身感知不到集群的存在
spark 基础的更多相关文章
- 【原创 Hadoop&Spark 动手实践 5】Spark 基础入门,集群搭建以及Spark Shell
Spark 基础入门,集群搭建以及Spark Shell 主要借助Spark基础的PPT,再加上实际的动手操作来加强概念的理解和实践. Spark 安装部署 理论已经了解的差不多了,接下来是实际动手实 ...
- 最全的spark基础知识解答
原文:http://www.36dsj.com/archives/61155 一. Spark基础知识 1.Spark是什么? UCBerkeley AMPlab所开源的类HadoopMapReduc ...
- Hadoop Spark 基础教程
0x01 Hadoop 慕课网 https://www.imooc.com/learn/391 Hadoop基础 慕课网 https://www.imooc.com/learn/890 Hadoop ...
- 【一】Spark基础
Spark基础 什么是spark 也是一个分布式的并行计算框架 spark是下一代的map-reduce,扩展了mr的数据处理流程. Spark架构原理图解 RDD[Resilient Distrib ...
- Spark 基础操作
1. Spark 基础 2. Spark Core 3. Spark SQL 4. Spark Streaming 5. Spark 内核机制 6. Spark 性能调优 1. Spark 基础 1. ...
- Spark基础学习精髓——第一篇
Spark基础学习精髓 1 Spark与大数据 1.1 大数据基础 1.1.1 大数据特点 存储空间大 数据量大 计算量大 1.1.2 大数据开发通用步骤及其对应的技术 大数据采集->大数据预处 ...
- Spark基础排序+二次排序(java+scala)
1.基础排序算法 sc.textFile()).reduceByKey(_+_,).map(pair=>(pair._2,pair._1)).sortByKey(false).map(pair= ...
- spark基础知识(1)
一.大数据架构 并发计算: 并行计算: 很少会说并发计算,一般都是说并行计算,但是并行计算用的是并发技术.并发更偏向于底层.并发通常指的是单机上的并发运行,通过多线程来实现.而并行计算的范围更广,他是 ...
- Spark基础-scala学习(三、Trait)
面向对象编程之Trait trait基础知识 将trait作为接口使用 在trait中定义具体方法 在trait中定义具体字段 在trait中定义抽象字段 trait高级知识 为实例对象混入trait ...
- spark基础知识
1.Spark是什么? UCBerkeley AMPlab所开源的类HadoopMapReduce的通用的并行计算框架. dfsSpark基于mapreduce算法实现的分布式计算,拥有HadoopM ...
随机推荐
- [转载] Java 遍历 Map 的 5 种方式
目录 1 通过 keySet() 或 values() 方法遍历 2 通过 keySet 的 get(key) 获取值 3 通过 entrySet 遍历 4 通过迭代器 Iterator 遍历 5 通 ...
- 由导入paramkio包失败,而pip list又能查到此包,而引出的:离线安装python第三方库的实用方法:解决公司内网,服务器/电脑不能上网却需要安装python三方库问题(下:Linux环境中)
问题描述: 公司的Linux服务器是内网,今天要实现某个功能,会用到python控制ssh,需要安装一个Paramkio库,和上一篇一样,仅仅依靠Pypi上下载下来的离线.whl安装包是不行的,lin ...
- jstree级联禁用后代节点的选择框
用jstree+jquery,做的树形展示. 这个话题,在Stack Overflow上有问答,要获取要禁用的节点,然后用获取子节点方法遍历后代节点,设置禁用选择框. 之后发现,jstree的获取子节 ...
- 控制label标签的宽度,不让它换行 label标签左对齐
1==>控制label标签的宽度.解决字段名太长时,不会换行显示 label-width="100px" label标签的宽度是100px; style="widt ...
- 阿里云服务器 ECS Jenkins 安装教程
参考:https://blog.csdn.net/liqing0013/article/details/83930419
- CF414D Mashmokh and Water Tanks
CF414D Mashmokh and Water Tanks 洛谷评测传送门 题目描述 Mashmokh is playing a new game. In the beginning he has ...
- 【微信小程序】mpvue中页面之间传值(全网唯一真正可行的方法,中指推了一下隐形眼镜)
摘要: mpvue中页面之间传值(注意:是页面之间,不是组件之间) 场景:A页面跳转B页面,在B页面选择商品,将商品名带回A页面并显示 使用api: getCurrentPages step1: A页 ...
- php array()和[]
比较数组 array() 和 [] 执行结果:(其中之一) array() : 执行时间在0.015-0.55之间 [] : 执行时间在0.015-0.35之间 结论: []执行时间更少更稳定
- 《细说PHP》第四版 样章 第23章 自定义PHP接口规范 7
23.5 创建RESTful规范 WebAPI框架 虽然我们现在可以自己实现API了,也了解了RESTful API的设计原则,但让自己实现的API符合RESTful API规范,对很多刚接触API ...
- Python的定时器与线程池
定时器执行循环任务: 知识储备 Timer(interval, function, args=None, kwargs=None) interval ===> 时间间隔 单位为s functio ...