RDD:弹性分布式数据集(Resilient Distributed Dataset)
RDD 支持两种操作:转化操作和行动操作
转化操作(transformation):由一个 RDD 生成一个新的 RDD ,比如 map() 和 filter()
pythonLines = lines.filter(line => line.contains("Python"))
和行动操作(action):向驱动器程序返回结果或把结果写入外部系统的操作,会触发实际的计算
,比如 count() 和 first()。
惰性计算RDD:第一次在一个行动操作中用到 时,才会真正计算
调用 sc.textFile() 时,数据并没有读取进来,而是在必要时才会读取。和转化操作一样的是, 读取数据的操作也有可能会多次执行。
如果 Spark 在 lines = sc.textFile(...) 就把文件中 所有的行读取并存储,就会消耗很多存储空间。
相反, 一旦 Spark 了解了完整的转化操作链之后,它就可以只计算求结果时真正需 要的数据。事实上,在行动操作 first() 中,Spark 只需要扫描文件直到找到第一个匹配 的行为止,而不需要读取整个文件。
缓存数据:如果想 在多个行动操作中重用同一个 RDD,可以使用 RDD.persist() 让 Spark 把这个 RDD缓存下来,默认情况下 persist() 会把数据以序列化的形式缓存在 JVM 的堆空 间中
创建 RDD :已有的集合传给 SparkContext 的 parallelize() 方法
val lines = sc.parallelize(List("pandas", "i like pandas"))(不常用)
常用的是从外部存储读取数据
collect() :来获取整 个 RDD 中的数据在本地处理 ,不能用在大规模数据集上
take() :获取RDD 中的少量元素
rdd.reduceByKey(func) 与 rdd.groupByKey().mapValues(value => value.reduce(func)) 等价,但是前 者更为高效
驱动器(Driver)节点:中央协调节点,调度各个分布式工作节点
执行器(executor)节点:与之对应的工作节点
Spark 应用(application):驱动器节点和所有的执行器节点
集群管理器(Cluster Manager):外部服务,使Spark 应用在集群中的机器上启动
两大开源集群管理器:Hadoop YARN 和 Apache Mesos
Spark 驱动器:执行程序中的 main() 方法的进程(Spark shell 总是会预先加载一个叫作 sc 的 SparkContext 对象)
Spark 应用中两个职责:
1、把用户程序转为任务
任务 (task):Spark 驱动器程序把用户程序转换后的多个物理执行单元, Spark 中最小的工作单 元,用户程序通常要启动成百上千的独立任务
有向无环图 (Directed Acyclic Graph,简称 DAG):Spark 程序其实是隐式地创建出了一个由操作组成的逻辑上的有向无环图
Spark 程序都遵循同样的结构:程序从输入数据创建一系 列 RDD,再使用转化操作派生出新的 RDD,最后使用行动操作收集或存储结果 RDD 中的数据。
当驱动器程序运行时,它会把这个逻辑图转为物理执行计划。
步骤(stage):由多个任务组成,这些任务会被打包并送到集群中
优化逻辑执行计划:,比如将连续的映射转为流水线化执行,将多个操作合并到一个步骤
2、为执行器节点调度任务
。执行 器进程启动后,会向驱动器进程注册自己