为啥要用 Spark?
快!基于内存
易用!Scala, Java, Python 都支持,还有交互式的 Python 和 Scala 的 shell,可以快速进行原型开发
通用!批处理、交互查询、流处理、机器学习、图计算,样样精通
兼容!可以使用各种现有的技术作为底层,也可以自己独立运行
Spark 生态系统有哪些组件?
Spark SQL: 类似 Hive,支持在不同 RDD 上进行类似 SQL 的操作
Spark Streaming: 对于流数据进行处理
MLlib: 机器学习库
GraphX: 图并行框架
RDD 是什么?
在 Spark 框架中,最重要的是一类新的数据抽象,叫做 Resilient Distributed Dataset - RDD。RDD 是分布式存储在集群中的内存对象,按照值的范围或者哈希结果进行划分。与此同时 RDD 会记录关于数据进行的各种操作(每次操作都会生成新的 RDD),这样即使节点挂掉,也能够根据之前的操作日志重新得到损失的 RDD
RDD 支持2种操作:
转换(transformation):从现有的数据集创建一个新的数据集
动作(actions):在数据集上运行计算后,返回一个值给驱动程序
2、实战java开发spark程序
https://my.oschina.net/csmw00/blog/672869
3、spark集群环境搭建
http://nekomiao.me/2016/12/05/spark-install-distributed/
通常大家只是说Spark是基于内存计算的,速度比MapReduce要快。或者说内存中迭代计算。其实我们要抓住问题的本质。总结有以下几点:1、Spark vs MapReduce ≠ 内存 vs 磁盘
其实Spark和MapReduce的计算都发生在内存中,区别在于:
MapReduce通常需要将计算的中间结果写入磁盘,然后还要读取磁盘,从而导致了频繁的磁盘IO。
Spark则不需要将计算的中间结果写入磁盘,这得益于Spark的RDD(弹性分布式数据集,很强大)和DAG(有向无环图),其中DAG记录了job的stage以及在job执行过程中父RDD和子RDD之间的依赖关系。中间结果能够以RDD的形式存放在内存中,且能够从DAG中恢复,大大减少了磁盘IO。
2、Spark vs MapReduce Shuffle的不同
Spark和MapReduce在计算过程中通常都不可避免的会进行Shuffle,两者至少有一点不同:
MapReduce在Shuffle时需要花费大量时间进行排序,排序在MapReduce的Shuffle中似乎是不可避免的;
Spark在Shuffle时则只有部分场景才需要排序,支持基于Hash的分布式聚合,更加省时;
MapReduce采用了多进程模型,而Spark采用了多线程模型。多进程模型的好处是便于细粒度控制每个任务占用的资源,但每次任务的启动都会消耗一定的启动时间。就是说MapReduce的Map Task和Reduce Task是进程级别的,而Spark Task则是基于线程模型的,就是说mapreduce 中的 map 和 reduce 都是 jvm 进程,每次启动都需要重新申请资源,消耗了不必要的时间(假设容器启动时间大概1s,如果有1200个block,那么单独启动map进程事件就需要20分钟)
Spark则是通过复用线程池中的线程来减少启动、关闭task所需要的开销。(多线程模型也有缺点,由于同节点上所有任务运行在一个进程中,因此,会出现严重的资源争用,难以细粒度控制每个任务占用资源)
总结:关于Spark为什么比MapReduce快,或者Spark速度快于MapReduce的原因,总结至少有这几点不同之处吧。