3.1 Spark程序模型

下面通过一个经典的示例程序来初步了解Spark的计算模型,过程如下。

1)SparkContext中的textFile函数从HDFS[1]读取日志文件,输出变量file[2]


  1. val file=sc.textFile"hdfs://xxx"

2)RDD中的filter函数过滤带“ERROR”的行,输出errors(errors也是一个RDD)。


  1. val errors=file.filterline=>line.contains"ERROR"

3)RDD的count函数返回“ERROR”的行数:errors.count()。

RDD操作起来与Scala集合类型没有太大差别,这就是Spark追求的目标:像编写单机程序一样编写分布式程序,但它们的数据和运行模型有很大的不同,用户需要具备更强的系统把控能力和分布式系统知识。

从RDD的转换和存储角度看这个过程,如图3-1所示。

3.1 Spark程序模型 - 图1

图3-1 Spark程序模型

在图3-1中,用户程序对RDD通过多个函数进行操作,将RDD进行转换。Block-Manager管理RDD的物理分区,每个Block就是节点上对应的一个数据块,可以存储在内存或者磁盘。而RDD中的partition是一个逻辑数据块,对应相应的物理块Block。本质上一个RDD在代码中相当于是数据的一个元数据结构,存储着数据分区及其逻辑结构映射关系,存储着RDD之前的依赖转换关系。

[1] 也可以是本地文件或者其他的持久化层,如Hive等。

[2] file是一个RDD,数据项是文件中的每行数据。