Spark 和MapReduce 的差别
MapReduce
- 每一个MR 程序就是一个job, 一个job 包含1个或多个task, 每个task 都是一个进程
- task 运行时开启进程, task 执行完成后回收进程, 开销较大
- shuffle 的结果要落到HDFS中
- 如果出现问题, 回溯问题的时候需要到源头
- Map, Reduce 的程序写起来比较复杂
- 不支持流式处理
Spark
- spark 的底层是RDD, RDD 之间有依赖, 可以逐层回溯,出现问题后,效
率提升
- 一个application (driver)
- 0 到多个job
- 1个job 有1到N 个stage
- 1个stage 有多个task
- 1个task 是一个线程
- 多个task 可以并行的方式运行在一个Executor 进程中
- 每个job的中间结果都保存在内存中, 读写效率高
- 支持流式处理
Spark 的缺点
- 还是继承了hadoop 的遗留问题, 数据倾斜,导致热点问题
怎样避免Spark 的数据倾斜呢
- Kafka + Spark
- 同一个topic 中的各个partition 大小基本一致
- HDFS 文件+ spark
- 每个文件大小基本一致
什么是数据倾斜
并行处理的数据集中, 一部分处理的数据明显多余其他部分, 多的这部分数据的处理速度慢成为水桶的短板,形成数据倾斜。