Spark是一个计算框架,而Hadoop中包含计算框架MR和分布式文件存储系统HDFS以及资源调度系统YARN。Hadoop还包括在其生态系统上的其他系统,如HBase、Hive等。
1、spark与Hadoop的联系
1)spark继承Hadoop
Spark 紧密集成 Hadoop 生态系统里的许多工具。它能读写 MapReduce 支持的所有数据格式,可以与 Hadoop 上的常用数据格式,如 Avro 和 Parquet(当然也包括古老的 CSV),进行交互。它能读写 NoSQL 数据库,比如HBase和Cassandra。它的流式处理组件 Spark Streaming 能连续从 Flume 和 Kafka 之类的系统读取数据。它的 SQL 库 SparkSQL 能和Hive Metastore 交互,而且 Spark 还能替代 MapReduce 作为 Hive 的底层执行引擎。它可以运行在 Hadoop 集群调度和资源管理器 YARN 之上,这样 Spark 可以和 MapReduce 以及Impala 等其他处理引擎动态共享集群资源和管理策略。
Hadoop的计算框架MapReduce革新了海量数据计算的方式,为运行在成百上千台节点上的并行程序提供了简单的编程模型。MapReduce引擎几乎可以做到线性扩展:随着数据量的增加,可以通过增加更多的节点来保持作业时间不变。另外MapReduce是健壮的。故障虽然在单台机器上很少出现,但在数千个节点的集群上却总是出现。不过MapReduce也能妥善处理。它将工作拆分成多个小的任务,能优雅地处理任务失败,并且不影响任务所属作业的正确执行。Spark 继承了 MapReduce 的线性扩展性和容错性,同时对它做了一些重量级扩展。
2、spark与Hadoop的区别
1)Spark相比Hadoop在处理模型上的优势
首先,Spark 摒弃了MapReduce 先 map 再 reduce这样的严格方式,Spark引擎执行更通用的有向无环图(DAG)算子。
另外,基于MR的计算引擎在shuffle过程中会将中间结果输出到磁盘上,进行存储和容错,而且HDFS的可靠机制是将文件存为3份。Spark是将执行模型抽象为通用的有向无环图执行计划(DAG),当到最后一步时才会进行计算,这样可以将多stage的任务串联或者并行执行,而无须将stage中间结果输出到HDFS。磁盘IO的性能明显低于内存,所以Hadoop的运行效率低于spark。
2)数据格式和内存布局
MR在读的模型处理方式上会引起较大的处理开销,spark抽象出弹性分布式数据集RDD,进行数据的存储。RDD能支持粗粒度写操作,但对于读取操作,RDD可以精确到每条记录,这使得RDD可以用来作为分布式索引。Spark的这些特性使得开发人员能够控制数据在不同节点上的不同分区,用户可以自定义分区策略,如hash分区等。
3)执行策略
MR在数据shuffle之前花费了大量的时间来排序,spark可减轻这个开销。因为spark任务在shuffle中不是所有的场合都需要排序,所以支持基于hash的分布式聚合,调度中采用更为通用的任务执行计划图(DAG),每一轮次的输出结果都在内存中缓存。
4)任务调度的开销
传统的MR系统,是为了运行长达数小时的批量作业而设计的,在某些极端情况下,提交一个任务的延迟非常高。Spark采用了时间驱动的类库AKKA来启动任务,通过线程池复用线程来避免进程或线程启动和切换开销。
5)内存计算能力的扩展
spark的弹性分布式数据集(RDD)抽象使开发人员可以将处理流水线上的任何点持久化存储在跨越集群节点的内存中,来保证后续步骤需要相同数据集时就不必重新计算或从磁盘加载,大大提高了性能。这个特性使Spark 非常适合涉及大量迭代的算法,这些算法需要多次遍历相同数据集, 也适用于反应式(reactive)应用,这些应用需要扫描大量内存数据并快速响应用户的查询。
6)开发速度的提升
构建数据应用的最大瓶颈不是 CPU、磁盘或者网络,而是分析人员的生产率。所以spark通过将预处理到模型评价的整个流水线整合在一个编程环境中, 大大加速了开发过程。Spark 编程模型富有表达力,在 REPL 下包装了一组分析库,省去了多次往返 IDE 的开销。而这些开销对诸如 MapReduce 等框架来说是无法避免的。Spark 还避免了采样和从HDFS 来回倒腾数据所带来的问题,这些问题是 R 之类的框架经常遇到的。分析人员在数据上做实验的速度越快,他们能从数据中挖掘出价值的可能性就越大。
7)功能强大
作为一个通用的计算引擎,spark的核心 API 为数据转换提供了强大的基础,它独立于统计学、机器学习或矩阵代数的任何功能。而且它的 Scala 和 Python API 让我们可以用表达力极强的通用编程语言编写程序,还可以访问已有的库。
Spark 的内存缓存使它适应于微观和宏观两个层面的迭代计算。机器学习算法需要多次遍历训练集,可以将训练集缓存在内存里。在对数据集进行探索和初步了解时,数据科学家可以在运行查询的时候将数据集放在内存,也很容易将转换后的版本缓存起来,这样可以节省访问磁盘的开销。
---------------------
作者:dsl200970
来源:CSDN
原文:https://blog.csdn.net/dsl200970/article/details/70052496?utm_source=copy
版权声明:本文为博主原创文章,转载请附上博文链接!