Spark/RDD

每一个Spark应用(Job),都是由一个驱动程序(Driver)构成,它运行用户的main函数。


RDD,是一个元素集合,划分到集群的各个节点上,可以被并行操作。RDD是不可变更的。

两种类型的RDD,并行集合(Scala集合)和hadoop数据集。这两种类型的RDD都可以通过相同的方式进行操作。


驱动程序

运行在Spark集群当中的每个驱动程序以各自独立的方式负责资源分配与任务调度工作。由于驱动程序充当着调度任务的执行者, 它需要最大程度与这些工作节点保持紧密 距离,从而避免网络延迟对执行效果造成的负面影响。

如果驱动程序停止工作,任务也将立即终止。如果集群管理器出现故障,新的任务则无法被提交,但是现有任务仍将继续保持执行。


并行集合

并行集合是通过调用SparkContext的parallelize方法,在一个已经存在的Scala集合上创建的。集合的对象将会被拷贝,创建出一个可以被并行操作的分布式数据集。

一旦分布式数据集被创建好,它们将可以被并行操作。

并行集合的一个重要参数是slices,表示数据集切分的份数。一般情况下,Spark会尝试根据集群的状况,来自动设定slices的数目,也可以在创建RDD时指定,sc.parallelize(data,slices)。

Spark将会在集群上为每一份数据建立一个任务。

Hadoop数据集

Spark可以从存储在HDFS,或者Hadoop支持的其他文件系统(包括本地文件、HBase等)上的文件创建分布式数据集。Spark支持TextFile、SequenceFiles等。

对于TextFile ,sc.textFile(filepath)。

对于SequenceFiles, sc.sequenceFile[K,V]。其中K,V是文件中的key和values的类型,必须是Hadoop的Writable interface的子类。对于通用的Writable类型,Spark允许指定原生类型来代替,比如sequenceFile[Int ,String]将会自动读取IntWritable和Texts。

对于其他类型的Hadoop输入格式,可以使用SparkContext.hadoopRDD方法,可以接收任意类型的JobConf和输入格式类、键类型和值类型。


RDD操作

action在数据集上运行计算后,返回一个值给驱动程序Driver。

Spark上的所有transformation都是惰性的,它们并不会直接计算结果,只是记住应用到RDD上的这些转换动作。当发生一个要求返回结果(action)给Driver的动作时,这些转换才开始执行。

默认情况下,每一个转换过的RDD都会在它被执行一个动作时被重新计算。可以使用persist或者cache方法,持久化一个RDD在内存中。Spark也支持在磁盘上持久化数据集,或者在集群间复制数据集。


RDD持久化

当持久化一个RDD,每一个结点都将把它的计算分块结果保存在内存中。缓存是Spark构建迭代算法的关键。

Cache有容错机制,如果RDD的任一分区丢失了,通过使用原先创建它的转换操作,它将会被自动重算(不需要全部重算,只计算丢失的部分)。


每一个RDD都可以使用不同的保存级别进行保存,可以保存在硬盘、内存等。这些等级选择,通过将一个org.apache.spark.storage.StorageLevel对象传递给persist()方法进行确定。cache()使用默认的存储级别,StorageLevel.MEMORY_ONLY。


存储级别

MEMORY_ONLY                   存储在JVM中。

MEMORY_AND_DISK 




Spark 中遇到 `AttributeError: 'RDD' object has no attribute 'saveAsTextfile'` 错误的原因通常是由于拼写错误或者导入模块不正确引起的。以下是解决问题的方法: ### 问题分析 在 PySparkRDD API 中,确实存在一个名为 `saveAsTextFile` 的方法(注意大小写)。如果代码中使用的是 `saveAsTextfile` 或其他变体,则会引发上述错误,因为 Python 是区分大小写的。 此外,还需要确认是否正确初始化了 SparkContext 和相关依赖项。如果没有正确配置环境,也可能导致此类问题。 --- ### 解决方案 #### 方法一:修正方法名的大小写 确保在调用保存文件的操作时,使用正确的名称 `saveAsTextFile` 而不是 `saveAsTextfile`。例如: ```python rdd.saveAsTextFile("output_path") # 正确的方式 ``` 此操作将 RDD 数据保存到指定路径下的文本文件中[^1]。 #### 方法二:验证 Spark 环境设置 如果仍然存在问题,请检查以下几点: 1. **确认 SparkContext 已正确定义并启动** 需要先创建 SparkContext 实例才能执行后续操作。可以按照以下方式定义上下文: ```python from pyspark import SparkConf, SparkContext conf = SparkConf().setAppName("ExampleApp").setMaster("local[*]") sc = SparkContext(conf=conf) ``` 2. **停止重复的 SparkContext 实例** 如果在同一进程中多次运行 Spark 应用程序,可能会触发冲突。可以通过显式关闭现有实例来避免该问题: ```python try: sc.stop() except Exception as e: pass finally: sc = SparkContext(conf=conf) ``` 3. **升级或降级 Spark 版本** 不同版本之间可能存在兼容性差异。建议查阅官方文档以匹配当前使用的库版本与功能支持情况[^3]。 --- ### 完整示例代码 下面提供了一个完整的例子展示如何加载数据集并通过 RDD 接口将其导出为外部存储格式: ```python from pyspark import SparkConf, SparkContext # 初始化 Spark Context conf = SparkConf().setAppName("SaveAsTextFileDemo").setMaster("local") sc = SparkContext(conf=conf) try: # 创建简单的 RDD 并应用转换逻辑 data = ["line one", "line two", "line three"] rdd = sc.parallelize(data) # 将结果写出至 HDFS/S3/本地磁盘等位置 output_dir = "./example_output" rdd.saveAsTextFile(output_dir) # 使用 saveAsTextFile 方法 finally: # 清理资源 sc.stop() ``` 以上脚本会在工作目录下生成名为 `example_output` 文件夹及其子文件作为最终产物[^1]。 --- ### 注意事项 - 当前实现仅适用于纯字符串类型的简单场景;对于复杂结构化对象则需额外序列化处理后再存入目标介质。 - 若涉及大数据量传输过程可能耗费较长时间甚至失败,因此实际部署阶段应考虑分区优化策略以及压缩算法的应用。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值