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. Python语法速查: 3. 字符串格式化

    返回目录 (1)简易字符串格式化 字符串属于不可变序列,只能生成新的,不能改变旧的.“字符串格式化”有点像以前C语言的sprintf,可以将若干变量代入格式化的字符串,生成一个符合要求的新字符串. 转 ...

  2. 不相交集ADT 你是和谁是一类人?

    //不相交集ADT (抽象数据类型) //一般用于集合运算 //用树,这种结构组成,有多个树(=森林) //属于同一颗数的元素,表示处于同一个集合中 //主要支持2个操作. //1. Find操作,找 ...

  3. java8-08-创建stream流

    为什么用stream                             应用函数式编程  配合Lamdba表达式 更快操作集合类 数组      什么是 stream               ...

  4. acwing 50. 序列化二叉树

    地址 https://www.acwing.com/problem/content/46/ 请实现两个函数,分别用来序列化和反序列化二叉树. 您需要确保二叉树可以序列化为字符串,并且可以将此字符串反序 ...

  5. LG1345 「USACO5.4」Telecowmunication 最小割

    问题描述 LG1345 题解 点边转化,最小割,完事. \(\mathrm{Code}\) #include<bits/stdc++.h> using namespace std; tem ...

  6. Zookeeper中Watcher监听实现增删改

    8.1 连接方法 package com.zookeeper.day01; import org.apache.zookeeper.*; import java.io.IOException; pub ...

  7. LeetCode 350: 两个数组的交集 II Intersection of Two Arrays II

    题目: 给定两个数组,编写一个函数来计算它们的交集. Given two arrays, write a function to compute their intersection. 示例 1: 输 ...

  8. Python 如何操作微信

    1.给文件传输助手发一条消息 import itchat itchat.auto_login(enableCmdQR=True) # 这里需要你人工手机扫码登录 itchat.send('Hello, ...

  9. WebSocket数据加密——AES与RSA混合加密

    前言 之前在写“一套简单的web即时通讯”,写到第三版的时候没什么思路,正好微信公众号看到一篇讲API交互加密,于是就自己搞了一套AES与RSA混合加密,无意中产生应用在WebSocket想法,好在思 ...

  10. GO 函数的参数

    一.函数 函数的参数 1.1 参数的使用 形式参数:定义函数时,用于接收外部传入的数据,叫做形式参数,简称形参. 实际参数:调用函数时,传给形参的实际的数据,叫做实际参数,简称实参. 函数调用: ​ ...