【笔记】大数据技术之Spark概要(九)

Spark

概念

  • Scala为可扩展性语言
  • Spark支持Java/python等,scala

Spark 对比 Hadoop

  • Hadoop
    • 表达能力有限
    • 延迟
    • 磁盘开销
    • 任务之间衔接
    • 单线
  • Spark
    在这里插入图片描述
    相比于 Hadoop MapReduce:
  1. Spark的计算模式属于MapReduce,并且不局限于Map和Reduce操作,提供了多种数据集操作类型,编程模型更加灵活。操作类型有很多种,大致分为转换操作和动作操作
    • Action:collet,reduce,lookUp,save,…
    • Transform:map,filter,flatmap,sample,groupByKey,reduceByKey,union,join,cogroup,mapvalues,sort,partionby,…
  2. 提供了内存计算并且可以将内存结果放在内存,对于迭代运算效率更高
  3. Spark基于DAG任务调度执行机制,优于Hadoop MapReduce迭代执行机制
  4. Spark容错性高,引进了RDD,数据集部分丢失可以重建,并且在RDD计算可以通过checkpoint实现容错
  5. Spark的各个物理节点之间的通信模型不再像Hadoop只有shuffle一种模式,用户可以命名,物化,控制中间结果存储,分区等。

生态系统

  • 复杂的批量数据处理
  • 基于历史数据的交互式查询
  • 基于实时数据流的数据处理
  • 三种场景,三种软件
    • 复杂批量数据处理
      • MR – hadoop
    • 历史数据交互式查询
      • Cloudera Impala
    • 实时数据流的数据处理
      • Apache storm
  • 生态系统
    • Spark Stream 流计算
    • Spark SQL 提供交互式查询分析
    • Spark Core 提供内存计算
    • GraphX 图计算
      在这里插入图片描述

运行架构

  • RDD分布式内存,高度受限的共享内存模型
  • DAG依赖关系
  • Exeutor运行在工作节点的一个进程,负责Task
  • Application用户编写的Spark应用程序
  • Task运行在Executor上的工作单元
  • Job包含多个RDD以及作用于相应的RDD的各种操作
  • Stage是Job的基本调度单位,Job分为多组Task,每组Task成为Task或者TaskSet

运行流程

  • 运行架构特点
    • Application都有专属Executor进程,并且进程在Application运行期间一直驻留,Executor进程以多线程的方式运行Task
    • 运行过程与资源管理器无关,只要能够获取Executor进程并保持通信即可
    • Task采用了数据本地性和推测执行等优化机制

RDD

概念

  • 为了满足这种需求出现的,提供了抽象的数据结构
  • 不必担心底层数据的分布式特性,只需要将具体的应用逻辑表达为一系列的转换过程
  • 不同RDD之间的转换操作形成了依赖关系,可以实现管道化,避免中间数据存储

依赖

  • 窄依赖与宽依赖
    • 窄依赖
      • 父RDD的分区对应于一个子RDD的分区
      • 多个父RDD的分区对应于一个子RDD分区
    • 宽依赖
      • 存在一个父RDD的一个分区对应于一个子RDD多个分区
  • 图示
    在这里插入图片描述

RDD特性

  • 高效的容错性
  • 具有天生的容错性
  • 执行过程
    1. 创建RDD
    2. 生成DAG图
    3. 分解Stage,包含多个Task或被分配

Spark SQL

  • shark
    • hive on spark
  • Schema RDD 允许封装多种数据源

Spark 部署方式

  • Standalone
  • Spark on Mesos

Spark RDD基本操作

  • textFile.count()统计文本文件的函数
  • 只包含某词语的行
scala> val linesWithSpark = textFile.filter(line=>line.contains("Spark"))
scala> linesWithSpark.count()
  • 使用多个API连续进行运算
scala> val linesWithSpark
= textFile.filter(line => line.contains("spark")).count()
  • 实例
    • 输出单词统计结果
scala> val wordCounts = textFile.flatMap(line => line.split("")).map(word => (word, 1)).reduceByKey((a,b) => a+b)
scala> wordCounts.collect() # 单词统计结果

实际操作

实验室传送门

©️2020 CSDN 皮肤主题: 我行我“速” 设计师:Amelia_0503 返回首页