Spark 学习笔记 (一): 初探Spark 程序设计RDD

Spark 学习笔记 (一): 初探Spark 程序设计RDD

本文主要剖析分布式计算的框架的设计与实现

一、 RDD

RDD是Spark中最核心的概念

1.初识RDD --- Resilient Distributed Datasets 弹性分布式数据集

  • 数据集:RDD是数据集合的抽象,分布在集群中的只读对象的集合
    • 一个RDD由多个Partition构成,也就是一个RDD被分区成Partiton存在不同节点上
    • 一个Partition可以存储在此磁盘或内存中
    • 通过并行transform操作进行一个RDD到另一个RDD的转换
  • 分布式:
    • Partition 是分布式存储的
    • 数据的计算是多个节点协同计算得到的
  • 弹性:RDD 可以在不改变内部存储数据记录的前提下,去调整并行计算计算单元的划分结构,弹性这一特性,也是为并行计算服务的

  • 容错性:分布式的一般问题是需要具有容错性,那么RDD本身是具有容错性的,

RDD 内部的数据集合在逻辑上和物理上被划分成多个小子集合Partition,这样的每一个子集合我们将其称为分区,分区的个数会决定并行计算的粒度,而每一个分区数值的计算都是在一个单独的任务Task中进行,因此并行任务的个数,也是由 RDD分区的个数决定的
Partition -> Task

2. Spark运行模式

Spark

先放个图,看下Spark整体程序是怎么执行的

  • 整个集群分为 Master 节点和 Worker 节点,相当于 Hadoop 的 Master 和 Slave 节点

  • Master 节点上常驻 Master 守护进程,负责管理全部的 Worker 节点

  • Worker 节点上常驻 Worker 守护进程,负责与 Master 节点通信并管理 executors

  • Driver 官方解释是 “The process running the main() function of the application and creating the SparkContext”。 Application 就是用户自己写的 Spark 程序(driver program)

    扫描二维码关注公众号,回复: 4944428 查看本文章
  • 每个 Worker 上存在一个或者多个 ExecutorBackend 进程。每个进程包含一个 Executor 对象,该对象持有一个线程池,每个线程可以执行一个 task。

3.Spark程序设计

  • Scala基础
    • 用函数式编程的方式可以很方便处理集合:
    var list = List(1, 2, 3)
    list.foreach(println)

Spark 的RDD,封装了各种类似于Scala集合的算子map、filter、reduce等,且都是分布式执行的

  • Spark程序设计基本流程
    • 创建SparkContext对象:定义了Spark执行环境和配置参数;注意每个Spark程序有且仅有一个SparkContext

    • 创建RDD:从Scala集合或者在Hadoops数据集上创建
      • (1) 从Scala集合映射成RDD:sc.parallelize()创建,第二个参数是Partition数目
      val slices = 10   //Partition数目,即并行的task数目启动10个map task进行处理
      val n = 100000 * slices 
      val count = sc.parallelize(1 to n, slices).map { i => 
          val x = random * 2 - 1 
          val y = random * 2 - 1 
          (x*x + y*y < 1) 1 else 0
      }.reduce(_ + _)
      • (2) 将本地文件/HDFS文件映射成RDD:
    • 在RDD上进行转换和action
      • Spark提供了很多action
    • 返回结果:保存到HFDS或者Hive

猜你喜欢

转载自www.cnblogs.com/shawshawwan/p/10279673.html
今日推荐