Spark与MapReduce的区别

  • MapReduce的缺陷
  • 操作复杂
  • 计算效率低
  • 不适合迭代处理
  • 不适合实时流式处理,只能离线处理
  • 很多框架都各自为战,浪费了很多资源,开发也慢,运维也不方便
  • Spark的特点
  • 计算速度快
  • 易于使用
  • 通用性
  • Runs Everywhere


MapReduce的缺陷

操作复杂

开发起来:因为MapReduce只有map、reduce两种算子。
1. low-level 低级别的。
2. constrained 有很多限制 (虽然可以使用一些类似Hive之类的框架来弥补)
并且单元测试也很麻烦

计算效率低

  1. MapReduce是属于进程级别:MapTask ReduceTask
    虽然有JVM复用,但还是效率不高
  2. 频繁的IO: 因为MapReduce的作业一般都是串起来的作业,chain,一个作业的输出作为下一个作业的输入…并且作业的数据一般都会存储在HDFS上,这样会有频繁的磁盘和网络的IO。数据落地的话,是需要三个副本的。
  3. MapReduce的所有任务都需要序列化
    排序:MapReduce每个场景都需要排序的,但是很多时候都是没有必要的
    面试题:key类型是实现什么接口?
    writable 要执行序列化的 read方法和wirte方法
    writablecomparable 排序比较的
  4. Memory:MapReduce基于内存做处理,但是是有限的

所以说MapReduce性能是很低的,迭代次数比较多的话,性能会不好

不适合迭代处理

数据挖掘,机器学习,图计算之类的,都需要很多迭代操作,所以不适合用 MapReduce 去做

不适合实时流式处理,只能离线处理

很多框架都各自为战,浪费了很多资源,开发也慢,运维也不方便

Spark的特点

综述:Spark is a fast and general engine for large-scale data processing(数据处理)
fast + general engine
fast体现在:
write code fast :Java/Scala/Python/R并支持interactive shell;
run fast : memory / DAG / Thread Model /sort可以设置成无。

计算速度快

  1. memory RDD cash
  2. thread 基于线程
  3. sort 可以设置的
  4. pipeline(流水线) rdd.map.fliter…collect
    如果是MapReduce,maptask reducetask 遇到就执行,是立刻执行的
    而 spark 是将很多操作串起来,就是一张DAG图(有向无环图)
    rdd.map.fliter…这些操作再多是不会执行的,需要触发action操作才可以来执行。
    例如:rdd.map.fliter…collect
    遇见就执行,先执行map,读取写入操作完了,执行fliter,读取写入…
    而对于Spark来说,是基于rdd来计算的
    rdd里有分区,每一个操作都是载依赖,有action了,直接在这个分区(partition)中kaka就执行,就减少很多中间数据落地的操作(写入读取)

易于使用

使用Java,Scala,Python,R开发代码块+测试块

80+ high-level operator:80多种高级别的算子

nteractively 交互式命令行(测试快)

通用性

一站式处理(但是也不是万能的,只能解决一定场景的)
Combine SQL,streaming,and complex analytics
spark powers a stack of libraries including SQL and DataFrams,MLlib for machine learning,GraphX,and Spark Streaming.

Runs Everywhere

on Hadoop(Yarn),Mesos,standalone,or in the cloud
can access diverse data sources(访问各种数据源)
including HDFS,Cassdandra,HBase,S3(Amazon)
这些都是外部数据源,如果只是跑一个SQL在Spark之上,就太low了,主要就是外部数据源