- 数据倾斜
- Spark运行架构
- 什么是数据倾斜
在并行处理的大数据系统中,某个部分(Partition)的数据量严重大于其他部分,导致该部分的数据处理速度成为数据集处理的瓶颈。 - 为什么会数据倾斜
同一Stage中不同task处理的数据量存在显著差异,某个task处理的数据量严重大于其他task。 - 怎样解决数据倾斜的问题
① 提高shuffle操作的并行度
为了避免task较少导致多个key分配到同一task且分配不均的问题,可以适当提高task的数量(但是并不能解决某一个key数据量严重大于其他key的情况的问题)
② 两阶段聚合(为key增加随机前缀/后缀)
如果某个key的数据量过大,比如key为‘hello’的数据有很多,可以为其加上前缀,变为:0_hello,1_hello,2_hello…
然后分别分配到不同task上,进行局部聚合,最终再进行全局聚合,彻底解决key的数据量不均衡的问题。
③ 将reduce join转为map join
- Spark的组成部件包括:driver和executor (都是进程),负责资源的使用。
驱动器节点(driver):
执行main()方法的进程,构建sparkContext对象,负责把用户程序分为多个stage(串行),并把每个stage分解为多个任务task(并行),为各执行器分配任务和调度任务执行;
驱动器一旦终止,Spark应用结束。
执行器节点(executor):
负责运行任务,将rdd缓存在执行器进程内,并把结果返回给驱动器进程
执行器彼此相互独立,如果一个执行器节点崩溃,Spark应用可以继续执行。 - 主节点(master)和工作节点(worker)(是物理节点),负责资源的管理和分配。
一台机器可以同时作为master和worker节点。
主节点(master):
负责管理worker节点,executor向master请求资源。
工作节点(worker):
负责管理executor进程。一个Worker默认情况下分配一个Executor,配置时根据需要也可以配置多个Executor。
未完待续



