前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spark笔记7-RDD持久化和分区

Spark笔记7-RDD持久化和分区

作者头像
皮大大
发布2021-03-02 15:29:37
7040
发布2021-03-02 15:29:37
举报
文章被收录于专栏:机器学习/数据可视化

持久化

有时候需要访问同一组值,不做持久化,会重复生成,计算机代价和开销很大。持久化作用:

  • 通过缓存机制避免重复计算的开销
  • 通过使用persist()方法对一个RDD标记为持久化,仅仅是标记
  • 只有等到第一个行动操作才会发生真生的持久化操作,触发真正的计算操作,才会把计算结果进行持久化
  • 持久化后的RDD将会被保留在计算机节点的内存中,被后面的行动操作重复使用。

persist()方法

该方法的作用是将一个RDD标记为持久化,并不是真正的持久化操作,行动操作才是真正的持久化,主要的参数是:

  • memory_only 将反序列化的对象存在JVM中,如果内存不足将会按照先进先出的原则,替换内容。只存入内存中。
  • RDD.cache() 等价于RDD.persist(memory_only),表示缓存在内存中
  • Memory_and_disk 先将结果存入内存中,如果内存不够,再存入磁盘中
unpersist()

手动将持久化的RDD对象从缓存中进行清除。

demo
代码语言:javascript
复制
list = ["hadoop", "spark", "hive"]
rdd = sc.parallelize(list)   # 生成RDD
rdd.cache()   # 标记为持久化
print(rdd.count())   # 第一个行动化操作。触发从头到尾的计算,将结果存入缓存中
print(','.join(rdd.collect()))  # 使用上面缓存的结果,不必再次从头到尾的进行计算,使用缓存的RDD

分区

优点
  1. 增加并行度:RDD分区被保存在不同的节点上,在多个节点上同时进行计算
  1. 减小通信开销。分区前后对比
    • 不进行分区userDataevents两个表中的所有数据,都要对中间表joined表进行操作。
    • 分区之后,只需要将events中的所有数据和userData中的部分数据进行操作
分区原则

原则是尽量使得:分区个数 = 集群中CPU核心数目spark的部署模式

  • local模式(本地模式):默认为本地机器的CPU数目
  • Standalone 模式:集群中所有的CPU数目和2之间比较取较大值
  • yarn模式:集群中所有的CPU数目和2之间比较取较大值
  • mesos模式:Apache,默认是8
分区个数

创建RDD时候指定分区个数

代码语言:javascript
复制
list = [1,2,3,4]
rdd = sc.parallelize(list,4)  # 设置4个分区

修改分区数目用repartition方法

代码语言:javascript
复制
data = sc.parallelize([1,2,3,4], 4) # 指定4个分区
len(data.glom().collect())  # 显示分区数目
rdd = data.repartition(2)  # 	重新设置分区数目为2

自定义分区

spark自带的分区方式

  • 哈希分区 hash partitioner
  • 区域分区 range partitioner
  • 自定义分区
代码语言:javascript
复制
# demo.py

from pyspark import SparkConf, SparkContext

def myPartitioner(key):
  print("mypartitioner is running")
  print("the key is %d" %key)
  return key%10.

def main():
  conf = SparkConf().setMaster("local").setAppName("myapp")
  sc = SparkContext(conf=conf)  # 生成对象,就是指挥官
  data = sc.parallelize(range(10), 5)  # 分成5个分区
  data.map(lambda x: (x,1)) \ # 生成键值对,下图1
  .partitionBy(10, myPartitioner)  \ # 函数只接受键值对作为参数,将上面的data变成键值对形式传进来
  .map(lambda x:x[0])  \ # 	取出键值对的第一个元素,下图2
  .saveAsTextFile("file:///usr/local/spark/mycode/rdd/partitioner")  \ # 写入目录地址,生成10个文件


if __name__ == "__main__":
  main()

首先进入文件所在的目录,运行方式有两种:

  • python3 demo.py
  • /usr/local/spark/bin/spark-submit demo.py
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-10-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 持久化
  • persist()方法
    • unpersist()
      • demo
      • 分区
        • 优点
          • 分区原则
            • 分区个数
            • 自定义分区
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档