- RDD初认识
RDD程序:
下面的程序中找出日志中包含ERROR行
val file = sc.testFile("hdfs://xxx")
val errors = file.filter(line =>line.contains("ERROR"))
errors.count()
下图的上下部分分别从RDD的角度和存储的角度描述了转化的过程。
RDD相当于是一个元数据,存储着数据实际的分区和计算逻辑。
Block-Manager负责管理RDD的物理分区。
image.png
参考资料:
《Spark大数据处理》第三章
-
RDD是元数据,并不保存实际的数据(RDD没有记忆!)
因此需要重用的场合可以用cache和persist,重用对象并不能缓存数据。
-
缓存和检查点区别
1)Cache 缓存只是将数据保存起来,不切断血缘依赖。Checkpoint 检查点切断血缘依赖。
2)Cache 缓存的数据通常存储在磁盘、内存等地方,可靠性低。Checkpoint 的数据通常存储在 HDFS 等容错、高可用的文件系统,可靠性高。
3)建议对 checkpoint()的 RDD 使用 Cache 缓存,这样 checkpoint 的 job 只需从 Cache 缓存中读取数据即可,否则需要再从头计算一次 RDD。 -
RDD与分布式共享内存的异同
“RDD是一种分布式的内存抽象”,RDD相对于分布式共享内存主要的点在于RDD是有弹性()计算能力(恢复、容错、保持一致性...)。
下图是两者的对比:
1、批量读操作即扫描整个数据集,有count、collect等,细粒度操作也就是哈希范围或者RDD范围内的关键字查找。
2、容错性,RDD记录了数据源和前面的计算链路,因此数据丢失只需重新计算即可恢复,而分布式共享内存可以回滚。
3、落后任务的处理和任务安排是RDD韧性的体现。
-
分区
“分区是个逻辑概念,变换前后的新旧分区在物理上可能是同一块内存存储。这是很重要的优化,以防止函数式数据不变性(immutable)导致的内存需求无限扩张。”
函数式数据不变性指的是像不可变集合每次计算都会变成一个新的集合,这样在内存中占了两份内存,因此只保留计算后的分区是一个很重要的优化。
分区与Block的关系:“RDD的每个分区对应的就是一个Block,Block可以存储在内存,当内存不够时可以存储到磁盘上” -
从HDFS等外部存储作为输入数据源的时候,HDFS的Block和Spark分区的关系?
“如果是从HDFS等外部存储作为输入数据源,数据按照HDFS中的数据分布策略进行数据分区,HDFS中的一个Block对应Spark的一个分区” -
Spark支持重分区,分区有哪些函数?
Hash、Range(根据数据范围)
感觉支持Hash的分区会更加均匀一点,比如一个范围有多个数据,Hash可以将整个范围均匀地分布到多个分区中去
网友评论