累加器

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. 关于LaTex的安装

    第一次写博客,有点生疏,但是想把具体安装的流程自我的汇总一下,毕竟我总是忘记,万一下一次要用的时候又要弄很久,就当经验吧. 其实是因为这个新型冠状病毒不能出门,也没开学,想找点事情做一做 这个博客不知 ...

  2. Java多线程并发04——合理使用线程池

    在此之前,我们已经了解了关于线程的基本知识,今天将为各位带来,线程池这一技术.关注我的公众号「Java面典」了解更多 Java 相关知识点. 为什么使用线程池?线程池做的工作主要是控制运行的线程的数量 ...

  3. Python科学计算库SymPy初探

    SymPy基础应用 .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { bord ...

  4. Python-操作XML文件

    一.python对XML文件的操作 目录 1.xml 创建 2.xml 数据查询 3.xml 数据修改 4.xml 数据删除 二. 1.xml 创建 import xml.etree.ElementT ...

  5. Jmeter之JSON提取器应用

    在接口测试中有一个这样的场景:登录之后,需要进行昵称修改,怎么实现? 首先我们分别看下登录.昵称修改的接口说明: 以上业务中补充一点,昵称修改,还需要添加请求头Authorization传登录获取的t ...

  6. hdu3695 AC自动机优化

    题目链接:http://icpc.njust.edu.cn/Problem/Hdu/3695/ 不加last指针的AC自动机会T,原因是他费了很多功夫在跳转上,而last指针是直接直到跳转的终止位置, ...

  7. java-TreeMap

    2019-12-17 10:34:55 //返回小于key的第一个键: K lowerKey(K key); //返回大于key的第一个键: K higherKey(K key); //返回小于等于k ...

  8. Contest 141

    2019-06-16 14:35:52 1089. Duplicate Zeros - Easy 问题描述: 问题求解: 很显然的可以使用O(n), O(n)的解法.主要问题在于如何在O(1)空间复杂 ...

  9. 微服务实战——高可用的SpringCloudConfig

    管理微服务配置 对于单体应用架构来说,会使用配置文件管理我们的配置,这就是之前项目中的application.properties或application.yml.如果需要在多环境下使用,传统的做法是 ...

  10. Linux命令ip addr详解

    熟悉Linux操作系统的同学对于ip addr命令应该不陌生,知道它是用来查看本地IP地址的,除了IP地址,其它额外的信息有必要了解一下. root@test:~# ip addr1: lo: < ...