1 个回答
1、RDD在缓存到存储内存之前,Partition中的数据一般以迭代器(Iterator)的数据结构来访问。通过迭代器可以获取分区中每一条序列化或者非序列化的数据项(Record),这些Record的对象实例在逻辑上占用了JVM堆内内存的other部分的空间,同一Partition的不同Record的空间并不连续。RDD在缓存到存储内存之后,Partition被转换成Block,Record在堆内或堆外存储内存中占用一块连续的空间。将Parititon由不连续的存储空间转换为连续存储空间的过程,Spark称之为展开(Unroll)。
2、Block有序列化和非序列化两种存储格式,具体以哪中方式取决与该RDD的存储级别。每个Executor的Storage模块用一个链式Map结构(LinkedHashMap)来管理堆内和堆外存储内存中的所有Block对象的实例,对于这个LinkedHashMap新增和删除简介记录了内存的申请和释放。因为不能保证存储空间可以一次容纳Iterator中的所有数据,当前的计算任务在Unroll时要向MemeoryManager申请足够的Unroll空间来临时占位,空间不足则Unroll失败,空间足够时可以继续进行。对于序列化的Partition,其所需的Unroll空间可以直接累加计算,一次申请。而非序列化的Partition则要在遍历Record过程中依次申请,即每读取一条Record,采样估算其所需的Unroll空间进行申请,空间不足时可以中断,释放已占用的Unroll空间。如果最终Unroll成功,当前Partition所占用的Unroll空间被转换为正常缓存RDD的存储空间。
2、Block有序列化和非序列化两种存储格式,具体以哪中方式取决与该RDD的存储级别。每个Executor的Storage模块用一个链式Map结构(LinkedHashMap)来管理堆内和堆外存储内存中的所有Block对象的实例,对于这个LinkedHashMap新增和删除简介记录了内存的申请和释放。因为不能保证存储空间可以一次容纳Iterator中的所有数据,当前的计算任务在Unroll时要向MemeoryManager申请足够的Unroll空间来临时占位,空间不足则Unroll失败,空间足够时可以继续进行。对于序列化的Partition,其所需的Unroll空间可以直接累加计算,一次申请。而非序列化的Partition则要在遍历Record过程中依次申请,即每读取一条Record,采样估算其所需的Unroll空间进行申请,空间不足时可以中断,释放已占用的Unroll空间。如果最终Unroll成功,当前Partition所占用的Unroll空间被转换为正常缓存RDD的存储空间。
发布于:3个月前 (01-22) IP属地:四川省
我来回答
您需要 登录 后回答此问题!