Spark RDD专题.md

背景

RDD是Spark中被广泛使用的概念,是Spark的基础。
RDD概念来源于2012伯克利最佳论文,啥都不说了,直接读论文原文:(说句题外的,总结了2019年学习后,我就觉得首要是加强一手学习,比如对原始论文的学习,反正我英文还不错;减少二手学习,比如对良莠不齐的中文博客)

https://amplab.cs.berkeley.edu/publication/resilient-distributed-datasets-a-fault-tolerant-abstraction-for-in-memory-cluster-computing/
“集群,内存,容错”; 为什么而来?iterative algorithms and interactive data mining tools 原来这两者处理无效率的,希望用spark来使其有效率

  • 只读
  • 支持断点重做
  • 分布式(上层只是抽象,底层可以是本机或者hdfs)
  • 为内存计算而优化

https://amplab.cs.berkeley.edu/wp-content/uploads/2012/01/nsdi_spark.pdf
原始paper如上:
MR是开天辟地,但是spark要做的是,复用计算过程中的中间结果

Data reuse is common in many iterative machine learning and graph algorithms, including PageRank, K-means clustering, and logistic regression

设计RDD的主要挑战是,定义一系列的api(考验规范能力),而且要很有效率地支持容错,原来很多类似的规范( distributed shared memory [24], keyvalue stores [25], databases),定义的是mutable的数据集合,带来问题,所以这里定义的就是immutable的
为什么 distributed shared memory [24], keyvalue stores [25], databases不行?
因为原来要容错,只能像mysql那样将所有变动都记录下来,比如binlog,总之对变动的集合进行复制是麻烦的

  1. 像scala的val模式,任何一个集合都和原来集合,在对象上是不相等的,革命性进步是两个集合有lineage关系,集合保存体积不是X2, 只保存变化那部分,相当于把binlog内置化了,自动化了,物理实现上采用了树类的算法
  2. If a partition of an RDD is lost, the RDD has enough information about how it was derived from other RDDs to recompute 1Checkpointing the data in some RDDs may be useful when a lineage chain grows large
    文章中提到RDD有广泛的适应性,而且他们在一个叫spark的系统中实现了Spark can be used interactively to query big datasets from the Scala interpreter
    文章中提到的性能测试:Spark is up to 20× faster than Hadoop for iterative applications, speeds up a real-world data analytics report by 40×, and can be used interactively to scan a 1 TB dataset with 5–7s latency

Formally, an RDD is a read-only, partitioned collection of records

树莓派的问题,是否可以将日志导入es,并进行搜索分析(paper中的例子是在数以TB记的日志中找到关键的错误)
因为map,filter,join可以形成RDD,所以数以TB记的日志中filter ERROR并导入内存就可以了

  • 如果计算到99%,这个RDD的最后一个partition计算失败了,只要取line的对应的部分重新计算就行,减少IO 99%
  • 一个1万台机器的集群中,有的node是有这个filter后的结果RDD,如果要进一步的做map或者collect动作,则manager会将task直接发到这些node,就可以复用了

RDD类似HDD的批量读写,因为内存和硬盘的速度差距; 而且DSM如果有重复的任务,会造成并发冲突;只读的RDD没有这个问题

RDD最适合批处理系统,也就是批量系统(工行晚间批量可以改造);传统的在线交易还是用数据库好
线性回归算法和梯度下降.md
梯度下降复用已有的RDD,如果数据都在内存,显然加速计算
Spark Workshop课后作业一.md
这里有val textRDD = SparkContext.textFile(path, partitionNum)
生成出来就一个RDD[String],这是一个scala定义的类

abstract class RDD[T: ClassTag](
    @transient private var _sc: SparkContext,
    @transient private var deps: Seq[Dependency[_]]
  ) extends Serializable with Logging {

里面有这次我用到的函数count
  /**
   * Return the number of elements in the RDD.
   */
  def count(): Long = sc.runJob(this, Utils.getIteratorSize _).sum

Martin说的用RDD写,其实也就是类似DataFrame的API概念,实际上paper后面还有深邃的思想
初始版本的spark,用scala 14000行就写出来了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值