hadoop和spark的shuffle异同点
- 从high-level角度来看,两者并无太大区别。 都是在map阶段通过partition将数据送到reduce进行计算
- 从low-level角度来看,hadoop是基于sort-based,即在combine/reduce之前会进行 必须进行数据排序操作,这样做的好处是能处理大规模数据,因为输入的数据可以通过外排得到, 而spark则是hash-based,即通过hashmap对 shuffle来的数据进行聚合,而不会主动进行排序,如需排序则需要手动配置参数
- hadoop的数据处理流程是一套固定的模式:map,spill,merge,shuffle,sort,reduce,每个阶段各司其职,而spark则更多的是将比如 spill merger agg 这些操作蕴含在trans 算子里面
spark有几种部署模式,各自有什么特点?
主要分为两大类型: 本地部署 和分布式部署。
- local 模式 等同于单机部署,配置参数:local 启动一个executor,local[*]启动和cpu一样多的executor,local[n] 则启动n个executor
- standalone模式。 spark独立分布式部署,不依赖外部资源, 由spark本身来进行资源管理和监控
- spark on yarn。 使用yarn作为资源管理和监控。支持粗粒度的资源分配方式。
- spark on mesos。支持粗粒度和细粒度的资源分配方式。粗粒度的资源分配方式是 应用程序在启动之前将需要的全部资源准备好,即使不用,也要到任务结束才能回收, 细粒度则是类似于云上的方式,按需分配
spark为什么比mr快
- spark是内存计算,比磁盘交互速度要快
- 基于DAG的高效的调度算法
- 容错机制lineage
spark的工作机制
- 构建application环境,driver创建一个sc(sparkcontext)
- sc向资源管理器申请executor资源, 资源管理器启动standaloneexecutorbacend(executor)
- executor向sc申请task
- sc将应用程序发送给executor
- 综上,sc就创建了DAG。 接下来由DAGSchedule将 DAG解析成stage,每个stage包含多个task,形成taskset 发送到task schedule,由task schedule将task发送给给executor执行
- task在executor上执行完毕,释放资源
spark的调优怎么做
从以下三个方面来进行:
spark调优比较复杂,但是大体可以分为三个方面来进行
- 平台层面的调优:防止不必要的jar包分发,提高数据的本地性,选择高效的存储格式如parquet
- 应用程序层面的调优:过滤操作符的优化降低过多小任务,降低单条记录的资源开销,处理数据倾斜,复用RDD进行缓存,作业并行化执行等等
- JVM层面的调优:设置合适的资源量,设置合理的JVM,启用高效的序列化方法如kyro,增大off head内存等等
|