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 基础的更多相关文章

  1. 【原创 Hadoop&Spark 动手实践 5】Spark 基础入门,集群搭建以及Spark Shell

    Spark 基础入门,集群搭建以及Spark Shell 主要借助Spark基础的PPT,再加上实际的动手操作来加强概念的理解和实践. Spark 安装部署 理论已经了解的差不多了,接下来是实际动手实 ...

  2. 最全的spark基础知识解答

    原文:http://www.36dsj.com/archives/61155 一. Spark基础知识 1.Spark是什么? UCBerkeley AMPlab所开源的类HadoopMapReduc ...

  3. Hadoop Spark 基础教程

    0x01  Hadoop 慕课网 https://www.imooc.com/learn/391 Hadoop基础 慕课网 https://www.imooc.com/learn/890 Hadoop ...

  4. 【一】Spark基础

    Spark基础 什么是spark 也是一个分布式的并行计算框架 spark是下一代的map-reduce,扩展了mr的数据处理流程. Spark架构原理图解 RDD[Resilient Distrib ...

  5. Spark 基础操作

    1. Spark 基础 2. Spark Core 3. Spark SQL 4. Spark Streaming 5. Spark 内核机制 6. Spark 性能调优 1. Spark 基础 1. ...

  6. Spark基础学习精髓——第一篇

    Spark基础学习精髓 1 Spark与大数据 1.1 大数据基础 1.1.1 大数据特点 存储空间大 数据量大 计算量大 1.1.2 大数据开发通用步骤及其对应的技术 大数据采集->大数据预处 ...

  7. Spark基础排序+二次排序(java+scala)

    1.基础排序算法 sc.textFile()).reduceByKey(_+_,).map(pair=>(pair._2,pair._1)).sortByKey(false).map(pair= ...

  8. spark基础知识(1)

    一.大数据架构 并发计算: 并行计算: 很少会说并发计算,一般都是说并行计算,但是并行计算用的是并发技术.并发更偏向于底层.并发通常指的是单机上的并发运行,通过多线程来实现.而并行计算的范围更广,他是 ...

  9. Spark基础-scala学习(三、Trait)

    面向对象编程之Trait trait基础知识 将trait作为接口使用 在trait中定义具体方法 在trait中定义具体字段 在trait中定义抽象字段 trait高级知识 为实例对象混入trait ...

  10. spark基础知识

    1.Spark是什么? UCBerkeley AMPlab所开源的类HadoopMapReduce的通用的并行计算框架. dfsSpark基于mapreduce算法实现的分布式计算,拥有HadoopM ...

随机推荐

  1. webpack打包 The 'mode' option has not been set, webpack will fallback to

    webpack 打包报错 The 'mode' option has not been set, webpack will fallback to 'production' for,Module no ...

  2. May 19th, 2019. Week 21st, Sunday

    Fight for what matters to you. 为自己珍视的东西奋斗吧! We all want to make our life goals true, and we all expe ...

  3. TensorFlow从1到2(十一)变分自动编码器和图片自动生成

    基本概念 "变分自动编码器"(Variational Autoencoders,缩写:VAE)的概念来自Diederik P Kingma和Max Welling的论文<Au ...

  4. java8-02-再探Lambda表达式

    Lambda表达式   主要作用替代匿名内部类   达到简化代码的操作                                  Lambda表达式 在对象中的使用   Employee类

  5. Redux API

    Redux API ​ Redux的API非常少.Redux定义了一系列的约定(contract),同时提供少量辅助函数来把这些约定整合到一起. ​ Redux只关心如何管理state.在实际的项目中 ...

  6. 调用百度语音AI实现语音的识别和合成

    #coding:utf-8 ## 先去ffmpeg官网下载(https://ffmpeg.zeranoe.com/builds/),好了之后解压缩,配一下环境变量 ## 打开cmd,运行命令,安装如下 ...

  7. 算法问题实战策略 BOARDCOVER

    地址 https://algospot.com/judge/problem/read/BOARDCOVER 解法 DFS 最近似乎在简单DFS上花费太多时间了 首先扫描地图 统计可覆盖的元素个数 如果 ...

  8. .NET Core 序列化对象输出字节数大小比较

    写代码验证了一下 .NET Core 中序列化对象输出字节数大小,.NET Core 版本是 3.0.100-preview8-013656 ,对象属性使用了 Guid 与 DateTime 类型,胜 ...

  9. Ansible 日常使用技巧 - 运维总结

    Ansible默认只会创建5个进程并发执行任务,所以一次任务只能同时控制5台机器执行.如果有大量的机器需要控制,例如20台,Ansible执行一个任务时会先在其中5台上执行,执行成功后再执行下一批5台 ...

  10. 洛谷 P4999(数位DP)

    ###洛谷 P4999 题目链接 ### 题目大意:给你一个区间,求这段区间中所有数的,数位上的,数字之和. 分析: 这题与 洛谷 P2602 相似,稍微改一下就可以了. 求出 0 ~ 9 的个数,然 ...