1. RDD基本原理
弹性式分布数据集RDD是Apache Spark的核心,它是一组不可变的JVM(java virtual machine)对象的分布集,可以执行高速运算。该数据集是分布式的,基于某种关键字该数据集被划分成若干块,并且分发到执行器节点,这样使得数据集能够高速执行运算。并且RDD对于每个块所做的所有转换都跟踪记录到日志中,在发生错误或者部分数据丢失时可以回退并重新进行计算,所以RDD也可以防止数据丢失。
2. 创建RDD
在pyspark中有两种方法创建RDD
(1). 可以使用.parallelize(…)集合,元素可以是list, array
data = sc.parallelize([('Amber', 22), ('Alfred', 23), ('Skye', 4), ('Albert', 12), ('Amber', 9)])
(2). 可以引用本地或外部的文件
data_from_file = sc.textFile('/Users/huoshirui/Desktop/VS14MORT.txt.gz', 4)
其中sc.textFile()方法中最后一个参数代表该数据集被划分的分区个数,经验法则是把每一个集群中的数据集划分为2到4个分区。
从文件中读取的数据表示为MapPartitionsRDD,而不使用.paralellize(…)方法对一个集合进行操作的ParallelCollectionRDD.
RDD是无schema的数据结构,我们可以混合使用任何类型的数据结构:tuple, dict, list和Spark都能支持。
data_heterogenous = sc.parallelize([
('Ferrari', 'fast'),
{'Porsche': 100000},
['S', 'R', 4054]
]).collect()
如果对数据集使用.collect()方法, 可以访问对象中的数据
data_heterogenous[1]['Porsche']
执行结果是100000
.collect()方法把RDD的所有元素返回给驱动程序,驱动程序将其序列转换为一个列表。
从文本文件读取数据中,文件中的每一行形成了RDD的一个元素。
3. 全局作用域和局部作用域
Spark可以在两种模式下运行:本地和集群。在本地运行Spark代码时与之前使用Python没有什么区别,只是加上了一个交织的部分,数据和代码在不同的工作者进程直接的复制。
在集群上运行时,当我们提交任务时,任务会发送给驱动程序节点,驱动程序节点会为任务创建DAG,并且决定哪一个执行者节点将运行特定的任务。然后该驱动程序指示执行者执行他们的任务,并且在结束时将结果返回给驱动程序。在执行之前,驱动程序为每一个任务的终止做准备:驱动程序有一组变量和方法,以便工作者在RDD上执行任务。这组变量和方法在执行者上下文本质中是静态的,即每个执行器从驱动程序中获得一份变量和方法副本,运行任务时,如果执行者改变这些变量或者覆盖这些方法,它不影响任何其他执行者的副本或者驱动程序的变量和方法。这可能会导致一些错误。