zoukankan      html  css  js  c++  java
  • 知乎上看到的关于RDD的比较好的解释

    首先来思考一个问题:Spark的计算模型是如何做到并行的呢?
    如果你有一箱苹果,让三个人拿回家吃完(只能举这种神经兮兮的例子了),如果不拆箱子就会很麻烦对吧~一个箱子嘛,当然只有一个人才能抱走了。这时候智商正常的人都知道不如把箱子打开,苹果倒出来,分别拿三个小箱子重新装起来,喏,各自抱回家去啃吧。

    Spark和很多其他分布式计算系统都借用了这种思想来实现并行:把一个超大的数据集,切切切分成N个小堆,找M个执行器(M < N),各自拿一块或多块数据慢慢玩,玩出结果了再收集在一起,这就算执行完啦。那么Spark做了一项工作就是:凡是能够被我算的,都是要符合我的要求的,所以spark无论处理什么数据先整成一个拥有多个分块的数据集再说,这个数据集就叫RDD。

    然而由于一些资料大肆宣传所谓的内存计算,所以很多人认为RDD和分布式内存容器(如memcache)这些类似,这显然是不对的。首先,当你自己写一个spark应用时,在代码上拥有了一个RDD,这个RDD是不包含任何待处理数据的(详情可以参考spark数据用户空间和集群空间的概念),真正的数据在执行时才会加载,加载时要么来自spark外,例如hdfs这样,要么来自spark内,前提是你已经对它做了cache。

    Spark的计算执行可以认为是一个这样的过程:从一个RDD读取数据,做处理,然后依照action的不同把结果发回用户空间。这个过程中可能会有很多中间临时的RDD,假如你对这些RDD设置了cache,那么在它所在的计算环节结束后的中间结果就会被缓存起来,缓存有个缓存管理器,spark里被称作blockmanager。注意哦,这里还有一个误区是,很多初学的同学认为调用了cache或者persist的那一刻就是在缓存了,这是完全不对的,真正的缓存执行指挥在action被触发,job被提交开始计算,在计算的中间过程中才会执行。

    那么回过头来看,RDD由多个partition组成,那就是被切成小块的数据啦,然后每个partition才能对应一个任务,才能并行。而partition的数据,刚刚有说可以来自spark内或者spark外,而即使来自spark内,也可能来自硬盘或来自内存,这是由缓存级别来决定的。

    -----------------------------------------------网友的原答案END----------------------------------------
  • 相关阅读:
    Spring配置数据源和注解开发
    spring 的配置介绍
    spring
    maven
    mybatis初始
    idea中配置xml不自动提示解决方案(eclipse配置XmlCatalog)
    JSON、AJAX
    ThreadLocal的使用
    Filter过滤器
    谷歌 kaptcha 图片验证码的使用
  • 原文地址:https://www.cnblogs.com/daysn/p/11361930.html
Copyright © 2011-2022 走看看