火花的持久化和共享变量

  

1。持久化算子缓存

  

   介绍:正常情况下,一个抽样是不包含真实数据的,只包含描述这个抽样元数据信息,如果对这个抽样调用缓存方法,那么这个抽样的数据,依然没有真实数据,直到第一次调用一个行动的算子触发了这个抽样的数据生成,那么缓存操作就会把数据存储在内存中,所以第二次重复利用这个抽样的时候,计算速度将会快很多。
引发的持久化和共享变量”> <br/>其中最主要的储存级别为:</p>
  <pre> <代码>//不存储在内存也不在磁盘
  val没有=new StorageLevel(假的,假的,假的,假的)//存储在磁盘
  val DISK_ONLY=new StorageLevel(真的,假的,假的,假的)//存储在磁盘,保存2份
  val DISK_ONLY_2=new StorageLevel(真的,假的,假的,假的,2)//存储在内存
  val MEMORY_ONLY=new StorageLevel(假的,真的,假的,真的)//存储在内存保存2份
  val MEMORY_ONLY_2=new StorageLevel(假的,真的,假的,真的,2)//存储在内存并序列化
  val MEMORY_ONLY_SER=new StorageLevel(假的,真的,假的,假)
  val MEMORY_ONLY_SER_2=new StorageLevel(假的,真的,假的,假的,2)//内存磁盘结合使用
  val MEMORY_AND_DISK=new StorageLevel(真的,真的,假的,真的)
  val MEMORY_AND_DISK_2=new StorageLevel(真的,真的,假的,真的,2)
  val MEMORY_AND_DISK_SER=new StorageLevel(真的,真的,假的,假)
  val MEMORY_AND_DISK_SER_2=new StorageLevel(真的,真的,假的,假的,2)//存储在堆外内存
  val OFF_HEAP=new StorageLevel(真的,真的,真的,假的,1)</代码> </pre>
  <p>相应的操作:</p>
  <pre> <代码>//设置持久化
  listRDD.cache ()//移除持久化
  listRDD.unpersist() </代码> </pre>
  </p> <p>  
  <h3> 2。共享变量</h3>
  <p>    介绍:在火花程序中,当一个传递给火花操作(例如map和reduce)的函数在远程节点上面运行时,火花操作实际上操作的是这个函数所用变量的一个独立副本。这些变量会被复制到每台机器上,并且这些变量在远程机器上的所有更新都不会传递回驱动程序。通常跨任务的读写变量是低效的,但是,火花还是为两种常见的使用模式提供了两种有限的共享变量:<强>广播变量</强>(广播变量)和<强>累加器</强>(蓄电池)。</p>
  <h4>  (1)广播变量</h4>
  <p>在不使用广播变量的时候:</p>
  <pre> <代码>对象SparktTest {
  def主要(args:数组[String]):单位={
  配置:val SparkConf=new SparkConf ()
  conf.setAppName (“SparktTest”)
  conf.setMaster(“地方[2]”)
  val sc: SparkContext=new SparkContext(配置)
  val列表=((“数学”,18),(“hbase”, 18),(“蜂巢”,22),(“蜂巢”,18))
  val listRDD:抽样(String、Int)]=sc.parallelize(列表)//这一句代码是在驱动程序中执行的,相当于这个变量是在司机进程中的。
  val=3/* *
  * kv._2 +这句代码是在执行程序中执行的,
  *其中这一个变量会在和f序列化的过程中,会携带过去。
  *并且每一个任务都会复制一份,可想而知如果这个一个变量是一个大对象,那就是一个灾难
  */listRDD.map (kv=祝辞(kv._1 kv._2 +))
  }
  }</代码> </pre>
  <p> <img src=火花的持久化和共享变量