中间缓存变量机制

1

public   class   Test {   
    public   static   void   main(String[]   args)   {   
      int   j   =   0;   
      for   (int   i   =   0;   i   <   100;   i++)   {   
        j   =   j++;   // temp=j;j=j+1;j=temp;  
      }   
      System.out.println(j);   //j=0
    }   
  }   

2

int i=0;
i=i++ + ++i;//i=2;

3

int j=0;
j=++j + j++ + j++ + j++;//j=7

“中间缓存变量的机制”是对单个表达式计算来说,

在Spark中,**缓存(Caching)**和**广播变量(Broadcast Variables)**是两种重要的优化机制,用于提升作业性能,但它们的用途和实现方式有显著区别: --- ### **1. 缓存(Caching/Persistence)** **用途**: 将RDD或DataFrame的数据持久化到内存或磁盘,避免重复计算(如多次调用`action`操作时)。 **特点**: - **存储级别**:通过`persist()`或`cache()`指定(`cache()`默认是`MEMORY_ONLY`)。 - 常见级别:`MEMORY_ONLY`、`MEMORY_AND_DISK`、`DISK_ONLY`等。 - **作用范围**:仅在当前作业的Executor中有效,不同作业间不共享。 - **适用场景**: - 需要多次访问的中间结果(如迭代算法、多阶段任务)。 - 数据量适中,能放入内存或磁盘。 **示例**: ```python rdd = sc.parallelize([1, 2, 3]) rdd.persist(StorageLevel.MEMORY_ONLY) # 缓存到内存 rdd.count() # 触发缓存 ``` --- ### **2. 广播变量(Broadcast Variables)** **用途**: 高效分发只读变量到所有Executor,避免任务每次执行时重复传输大变量。 **特点**: - **只读性**:广播后变量不可修改,确保一致性。 - **传输优化**:变量仅发送一次到每个节点,而非每个任务。 - **适用场景**: - 需要共享大字典、配置表等(如Join时的维表)。 - 变量大小远小于任务数据量(通常建议<100MB)。 **示例**: ```python broadcast_var = sc.broadcast({"key": "value"}) # 广播字典 rdd.map(lambda x: broadcast_var.value["key"]).collect() # 使用广播变量 ``` --- ### **核心区别** | **特性** | **缓存(Caching)** | **广播变量(Broadcast)** | |-------------------|----------------------------------|----------------------------------| | **目的** | 避免重复计算RDD/DataFrame | 高效分发只读变量到所有任务 | | **数据范围** | 单个作业内有效 | 跨作业共享(同SparkContext) | | **存储位置** | Executor内存/磁盘 | Driver分发到Executor内存 | | **适用对象** | 中间计算结果 | 静态只读数据(如字典、配置) | --- ### **注意事项** - **缓存管理**:及时用`unpersist()`释放内存,避免资源浪费。 - **广播限制**:过大的广播变量会拖累性能(需权衡网络开销)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值