累加器

val dataRdd = sc.makeRDD(List(1, 2, 3, 4), 2)
var sum = 0
//累加器可以收集driver和各个excuter中累加的结果
//如果此处删除累加器,用java的算法sum=sum+i那么结果是0,driver端的sum就是0,缺有无法得知各个excuter中加到了几
val accumulator = sc.longAccumulator
dataRdd.foreach({
case i=>{
sum=sum+i
accumulator.add(i)
}
})
println("sum = "+accumulator.value)
//也可以自定义累加器加单词等,不只有long

序列化

//class Params(query:String) extends java.io.Serializable{
class Params(query: String) { //main中用到params对象的此方法会提示需要对象序列化
def isMatch(s: String): Boolean = {
s.contains(query)
} //main中用到params对象的此方法会提示需要对象序列化
def getMatch1(rdd: RDD[String]): RDD[String] = {
rdd.filter(isMatch)
} //main中用到params对象即使没有序列化也ok
def getMatch2(rdd: RDD[String]): RDD[String] = {
val q = query
rdd.filter(x => x.contains(q))
} }

宽窄依赖

窄依赖指的是每一个父RDD的Partition最多被子RDD的一个Partition使用,窄依赖我形象的比喻为独生子女

宽依指的是多个子RDD的Partition会依赖同一个父RDD的 Partition,会引起shuffle.总结:宽依我们形象的比喻为超生

DAG

DAG(Directed Acyclic Graph)叫做有向无环图,原始的RDD通过一系列的转换就就成了DAG,根据RDD之间的依赖关系的不同将DAG划分成不同的 Stage,对于窄依糗partition的转换处理在 Stage中完成算,对于宽依赖,由于有Shuffle的存在,只能在 parentRDD处理完成后,才能开始接下来的计算,因此宽依是划分Stage的依据。

RDD任务划分

RDD任务切分中间分为: Application、job、 Stage和Task

1) Application:初始化一个 Spark Context I即生成一个 Application

2)Job:一个 Action算子就会生成一个Job

3) Stage:根据RDD之间的依赖关系的不同将Job划分成不同的 Stage,通到一个宽依赖则划分一个 Stage,

 

stage=1+发生shuffle的个数

task=每个stage的数据分区数之和= 5+3

RDD缓存

RDD通过 persist方法或 cache方法可以将前面的计算结果缓存,认情况下 persist()会把数据以序列化的形式缓存在jvm的堆究间中。

但是并不是这两个方法被调用时立即缓存,面是触发后面的 action时,该RDD将会被缓存在计算节点的内存中,并供后面重用。并且血统中会指向这个缓存。当缓存丢失时就会重新计算。

RDD数据分区器

Spark目前支持Hash分区和 Range分区,用户也可以自定义分区,Hash分区为当前的默认分区,Spak中分区直接决定了RDD中分区的个数、RDD中每条数据经过 Shuttle过程属于哪个分区和 Reduce 的个数

注意:(1)只有 Key-value类型的RDD才有分区器的,非Key- Value类型的RDD分区的值是Nono

(2)每个RDD的分区ID范国:0- numPartition-1,决定这个值是所于那个分区的。

Hash分区器

Hashpartitioner分的原理:对于给定的key,计算其 hashcode,并除以分区的个数取余,如果余数小于0,则用余数+分区的个数(否则加0),最后返回的值就是这个key所属的分区ID

Range分区器

Hashpartitioner分区弊端:可能导致每个分区中数据量的不匀,校端情况下会导致某些分区拥有RDD的全部数据。

Rangepartitioner作用:将一定范围内的数映射到某一个分区内,尽量保证每个分区中数据量的均匀,而且分区与分区之间是有序的,一个分区中的元素背定都是比另一个分区内的元素小或者大,但是分区内的元素是不能保证顺序的。简单的说就是将一定范国内的数映射到某一个分区内。

foeachPatirtion内

foeachPatirtion内datas.foreach是在excuter中执行,datas已是集合不是rdd,不涉及网路交互

Spark三大数据结构

RDD:分布式数据集

广播变量:分布式只读共享变量,广播变量的作用是将公用只读的集合广播出去,广播到excuter中,每个task读取自己excuter中的副本。注意广播内容的大小和excuter内存

累加器:分布式只写共亨变量,累加器可以将driver和excuter中的数据相加

reduceBykey和 groupByKey的区别

1. reducebykey:按照key进行聚合,在 shuttle之前有 combine(顶聚合)操作,返回结果是 RDD[k,v]

2. geroupbykey:按照key进行分组,直接进行 shuffle

3.开发指导: reducebykey比 groupbykey,建议使用。但是需要注意是否会影响业务逻辑

kafka流数据建议先看看下Streaming的分区运算情况,假如默认2个分区执行,那么根据数据量和资源情况可进行重分区,以便重分利用资源提交处理效率。

spark 大杂烩的更多相关文章

  1. XMPP大杂烩

    XMPP大杂烩 对XMPP的理解 XMPP是基于XML的即时通讯协议.对即时通讯场景进行了高度抽象,比如用订阅对方的上下线状态表示好友.提供了文本通讯.用户上下线通知.联系人管理.群组聊天等功能,还可 ...

  2. Spark踩坑记——Spark Streaming+Kafka

    [TOC] 前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark strea ...

  3. Spark RDD 核心总结

    摘要: 1.RDD的五大属性 1.1 partitions(分区) 1.2 partitioner(分区方法) 1.3 dependencies(依赖关系) 1.4 compute(获取分区迭代列表) ...

  4. spark处理大规模语料库统计词汇

    最近迷上了spark,写一个专门处理语料库生成词库的项目拿来练练手, github地址:https://github.com/LiuRoy/spark_splitter.代码实现参考wordmaker ...

  5. Hive on Spark安装配置详解(都是坑啊)

    个人主页:http://www.linbingdong.com 简书地址:http://www.jianshu.com/p/a7f75b868568 简介 本文主要记录如何安装配置Hive on Sp ...

  6. Spark踩坑记——数据库(Hbase+Mysql)

    [TOC] 前言 在使用Spark Streaming的过程中对于计算产生结果的进行持久化时,我们往往需要操作数据库,去统计或者改变一些值.最近一个实时消费者处理任务,在使用spark streami ...

  7. Spark踩坑记——初试

    [TOC] Spark简介 整体认识 Apache Spark是一个围绕速度.易用性和复杂分析构建的大数据处理框架.最初在2009年由加州大学伯克利分校的AMPLab开发,并于2010年成为Apach ...

  8. Spark读写Hbase的二种方式对比

    作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 一.传统方式 这种方式就是常用的TableInputFormat和TableOutputForm ...

  9. (资源整理)带你入门Spark

    一.Spark简介: 以下是百度百科对Spark的介绍: Spark 是一种与 Hadoop 相似的开源集群计算环境,但是两者之间还存在一些不同之处,这些有用的不同之处使 Spark 在某些工作负载方 ...

随机推荐

  1. 蓝桥杯vip题阶乘计算

    蓝桥杯vip题阶乘计算 详细题目 输入一个正整数n,输出n!的值. 其中n!=123*-*n. 算法描述 n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法.使用一个数组A来表示一个 ...

  2. 洛古 P1312 Mayan游戏(dfs+剪枝)

    题目链接 这道题和俄罗斯方块很像 很明显,我们可以看出这是一个dfs,但是,我们需要几条剪枝: 1.如果只剩下1个或2个同样颜色的方块,那么直接退出 2.相同的块不用交换 3.注意优先性,优先左边换右 ...

  3. 「newbee-mall新蜂商城开源啦」GitHub 上最热门的 Spring Boot 项目,我也要做一次靓仔!

    没有一个冬天不可逾越,也没有一个春天不会到来. 介绍一下新蜂商城的近况,同时,新蜂商城 Vue 版本目前也在开发中,在这篇文章里我也向大家公布一下新蜂商城 Vue 版本的开发进度,和大家同步一下,在不 ...

  4. SpringMVC框架——集成RESTful架构

    REST:Representational State Transfer 资源表现层状态转换 Resources 资源 Representation 资源表现层 State Transfer 状态转换 ...

  5. Shell 截取字符串方法

    原文链接 方法1 "${varible##*string}" 从左向右截取最后一个string后的字符串 e.g. exampleString="abc//888//ab ...

  6. 用Python编写水仙花数

    #找出水仙花数 def sxh(start, end): if end >= start and start >=100 and end<= 999: num=start #将num ...

  7. 2020kali浏览器汉化等配置

    0.修改搜索引擎 1. 2. 3.点击左侧搜索,输入language因为我已经修改为中文所以没有查询到结果 4点击搜索更多语言(未汉化未英文)找到chinese后添加 5.要将chinese上移到第一 ...

  8. Angularjs优点

    数据双向绑定,前后台的更改都可以随时生效, 提供mvc开发模式模式,剥离前端各部分代码,使代码便于维护管理. 简化了你写DOM操作

  9. 李宏毅老师机器学习课程笔记_ML Lecture 3-1: Gradient Descent

    引言: 这个系列的笔记是台大李宏毅老师机器学习的课程笔记 视频链接(bilibili):李宏毅机器学习(2017) 另外已经有有心的同学做了速记并更新在github上:李宏毅机器学习笔记(LeeML- ...

  10. Python学习笔记:函数和变量详解

    一.面向对象:将客观世界的事物抽象成计算机中的数据结构 类:用class定义,这是当前编程的重点范式,以后会单独介绍. 二.函数编程:逻辑结构化和过程化的一种编程方法 1.函数-->用def定义 ...