spark作为大数据组件中不可或缺的一大部分 是我们学习和了解大数据的过程中必须要经历和学习的部分 本人将自己当初学习大数据的一点点心得和体会作为笔记 希望可以给同样在学习大数据同学提供一点点的帮助 同时也希望可以得到大家的指正
spark的特点
-- 基于内存 -- 集群 --快:与 Hadoop 的 MapReduce 相比,Spark 基于内存的运算要快 100 倍以上,基于硬盘的运算也要快 10 倍以上。Spark 实现了高效的 DAG 执行引擎,可以通过基于内存来高效处理数据流。 --易用:Spark 支持 Java、Python、R 和 Scala 的 API,还支持超过 80 种高级算法,使用户可以快速构建不同的应用。而且 Spark 支持交互式的 Python 和 Scala 的 shell,可以非常方便地在这些 shell 中使用 Spark 集群来验证解决问题的方法。 --通用:Spark 提供了统一的解决方案。Spark 可以用于批处理、交互式查询(Spark SQL)、实时流处理(Spark Streaming)、机器学习(Spark MLlib)和图计算(GraphX),这些不同类型的处理都可以在同一个应用中无缝使用。 --兼容性:Spark 可以非常方便地与其他的开源产品进行融合。比如,Spark 可以使用 Hadoop 的 YARN 和 Apache Mesos 作为它的资源管理和调度器,并且可以处理所有 Hadoop 支持的数据,包括 HDFS、HBase 和 Cassandra 等。这对于已经部署 Hadoop 集群的用户特别重要,因为不需要做任何数据迁移就可以使用 Spark 的强大处理能力。
spark和mr的比较
1.MR为什么这么慢? --额外的复制 --序列化 -- 需要将数据转换成 0 1 0 1 1 1 --磁盘IO开销 --细粒度资源调度: 任务执行之前,不会申请所有的资源,task执行时,自己申请资源,自己释放资源,任务执行就慢了,但是集群资源可以充分利用 shuffle过程会产生网络IO -- 网络IO相对于磁盘IO对于时间消耗大 2.Spark为什么比MR快? --基于内存 --DAG有向无环图 --粗粒度资源调度 任务执行之前,先将所有的资源申请到,task执行的时候不需要自己申请资源,加快了执行速度。如果多数task执行完成,只有一个task没有执行完,那么这批申请到的资源不会被释放,只有所有的task执行完成之后才会释放所有资源。会有集群资源不能充分利用的情况。 什么是进程? -- 是一个具有一定独立功能的程序在一个数据集合上依次动态执行的过程,可以表示为一个正在执行的程序实例 同一个进程下面的的所有线程可以共享一个内存空间
spark的组件
1.Spark Core 核心底层部分 -- 基于RDD (数据类型,数据结构) -- 支持多种语言(r,sql,python) 2.Spark SQL -- 基于DataFrame -- 结构化数据查询 3.Spark Streming 流处理 -- Spark 提供的对实时数据进行流式计算的组件。提供了用来操作数据流的 API。 4.Spark MLLib 机器学习 5.Spark GraphX 图计算
Spark VS Hadoop
尽管 Spark 相对于 Hadoop 而言具有较大优势,但 Spark 并不能完全替代 Hadoop,Spark 主要用于替代Hadoop中的 MapReduce 计算模型。存储依然可以使用 HDFS,但是中间结果可以存放在内存中;调度可以使用 Spark 内置的,也可以使用更成熟的调度系统 YARN 等。 Hadoop Spark 类型 分布式基础平台, 包含计算, 存储, 调度 分布式计算工具 场景 大规模数据集上的批处理 迭代计算, 交互式计算, 流计算 价格 对机器要求低, 便宜 对内存有要求, 相对较贵 编程范式 Map+Reduce, API 较为底层, 算法适应性差 RDD 组成 DAG 有向无环图, API 较为顶层, 方便使用 数据存储结构 MapReduce 中间计算结果存在 HDFS 磁盘上, 延迟大 RDD 中间运算结果存在内存中 , 延迟小 运行方式 Task 以进程方式维护, 任务启动慢 Task 以线程方式维护, 任务启动快
端口号:
Spark查看当前Spark-shell运行任务情况端口号:4040(计算) Spark Master内部通信服务端口号:7077 Standalone模式下,Spark Master Web端口号:8080(资源) Spark历史服务器端口号:18080 Hadoop YARN任务运行情况查看端口号:8088
spark运行架构
1.Driver -- 是一个 JVM 进程, 负责执行 Spark 任务的 main 方法 执行用户提交的代码,创建 SparkContext 或者 SparkSession 将用户代码转化为 Spark 任务(Jobs)创建血缘(Lineage),逻辑计划(Logical Plan)和物理计划(Physical Plan) 在 Cluster Manager 的辅助下,把 task 任务分发调度出去 跟踪任务的执行情况,收集日志 2.Spark Context/Session 它是由 Spark driver 创建,每个 Spark 应用对应一个 程序和集群交互的入口 可以连接到 Cluster Manager 3.Cluster Manager 负责部署整个 Spark 集群 包括上面提到的 driver 和 executors 具有以下几种常见的部署模式: Standalone YARN Mesos Kubernetes 4.Executor 一个创建在 worker 节点的进程 一个 Executor 有多个 slots(线程) 一个 slot 就是一个线程,对应了一个 task 可以并发执行多个 tasks 负责执行 Spark 任务,把结果返回给 Driver 可以将数据缓存到 worker 节点的内存
spark运行模式
1. Standalone模式
还是要将应用提交到对应的集群中去执行,这里来看看只使用Spark自身节点运行的集群模式,也就是我们所谓的独立部署(Standalone)模式。Spark的Standalone模式体现了经典的master-slave模式。 独立运行模式 自带完整的资源管理服务 可单独部署到一个集群中 无需依赖任何其他资源管理系统 主从架构:Master/Worker 支持两种任务提交方式 Cluster:适用于生产环境 Client:适用于交互、调试 集群规划: hadoop101 hadoop102 hadoop103 Spark Worker Master Worker Worker ================hadoop101================ 3330 Jps 3238 Worker 3163 Master ================hadoop102================ 2966 Jps 2908 Worker ================hadoop103================ 2978 Worker 3036 Jps
RDD
RDD(Resilient Distributed Dataset)叫做分布式数据集,是Spark 中最基本的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合。在Spark 中,对数据的所有操作不外乎创建RDD、转化已有RDD 以及调用RDD 操作进行求值。每个RDD 都被分为多个分区,这些分区运行在集群中的不同节点上。RDD 可以包含Python、Java、Scala 中任意类型的对象, 甚至可以包含用户自定义的对象。RDD 具有数据流模型的特点:自动容错、位置感知性调度和可伸缩性。RDD 允许用户在执行多个查询时显式地将工作集缓存在内存中,后续的查询能够重用工作集,这极大地提升了查询速度。RDD 支持两种操作:transformation操作和action操作。RDD 的转化操作是返回一个新的RDD 的操作,比如map()和filter(),而action操作则是向驱动器程序返回结果或把结果写入外部系统的操作。比如count() 和first()。 Spark 采用惰性计算模式,RDD 只有第一次在一个行动操作中用到时,才会真正计算。Spark 可以优化整个计算过程。默认情况下,Spark 的RDD 会在你每次对它们进行行动操作时重新计算。如果想在多个行动操作中重用同一个RDD , 可以使用RDD.persist() 让Spark 把这个RDD 缓存下来。
RDD的描述 * ① 通过读取文件可以返回一个 RDD 该RDD是一个抽象类 * ② RDD中的泛型对应是该RDD中操作数据的数据类型 * ③ RDD中并不存储具体的数据,存储是数据处理的逻辑 (DAG有向无环图) * ④ RDD中封装的处理逻辑不可变,如果需要变更,那么需要产生新的RDD RDD=> RDD又称为弹性分布式数据集 * 弹性: * 1.可以存储数据到内存,也可以存储到磁盘 * 2.具有一定的容错性,数据发生错误,会自动重试 * 3.数据可以按需求进行做分片(Split) * 分布式: 数据存储在不同节点上,计算也可以在不同节点上
RDD的五大特性:(面试)
RDD的五大特性: 1. A list of partitions 由一系列分区组成 分区就是一个并发 分区数或并发数,其默认值受哪些因素影响 1.修改读取文件的数量 可以修改分区数(并发数量) -- 对应mr中的切片 FileInputFormat => 可以获取数据的切片 => 1个切片对应一个分区 => 切片数是由文件数和文件大小决定的 2.设定最小分区数 (当前任务运行时最小的分区数) 3.在Spark提交时设置executor的数量 2. A function for computing each split 函数是作用在每一个分区上的 当数据被切分成多个切片时,每个切片默认对应一个分区,每个分区中的数据都会执行当前stage中的每一个函数 3. A list of dependencies on other RDDs RDD之间是有一系列的依赖关系 3.1一系列的依赖关系,形成了数据的处理逻辑(DAG有向无环图) 3.2 并不是所有的算子都会返回一个RDD 能返回RDD的算子 称为 转换算子 返回值为RDD 不能返回RDD的称为行动算子 行动算子的源码中对当前的Job进行了提交,所以可以形成一个Job -- 一个行动算子形成一个job 4. Optionally, a Partitioner for key-value RDDs 可选项,分区器是作用在KV形式的RDD上 KV形式RDD表示为RDD中存储数据的类型为 tuple2(key,value) 5.Optionally, a list of preferred locations to compute each split on Spark会给每个执行任务提供最佳的计算位置 移动计算不移动数据 如果当前数据存储在HDFS中的node1节点,那么Spark在计算时,会将executor