spark基础知识请参考spark官网:http://spark.apache.org/docs/1.2.1/quick-start.html

无论是mapreduce还是spark ,分布式框架的性能优化方向大致分为:负载均衡、网络传输和磁盘I/O 这三块。而spark是基于内存的计算框架,因此在编写应用时需要充分利用其内存计算特征。本篇主要针对

spark应用中的join问题进行讨论,关于集群参数的优化会在另一篇文章中提及。

在传统的数据库平台和分布式计算平台,join的性能消耗都是很可观的,对spark来说如果join的表比较大,那么在shuffle时网络及磁盘压力会明显提升,严重时可能会造成excutor失败导致任务无法进行下去,

对这种join的优化方法主要是采用map和filter来改变join的实现方式,减少shuffle阶段的网络和磁盘I/O。下面以表的数据量大小分两部分来讨论。

大表:数据量较大的表

小表:数据量较小的表

一、大表与小表之间的join

这种join是大部分业务场景的主要join方式,将小表以broadcast的形式分发到每个executor后对大表进行filter操作,以下对每种join进行示例说明(兼容表中ID不唯一的情况)。

1、leftOuterJoin

>>>d1=sc.parallelize([(1,2),(2,3),(2,4),(3,4)])

>>>d2=sc.parallelize([(1,'a'),(2,'b'),(1,'d'),(5,'2')])

原生实现方式:

>>>d1.leftOuterJoin(d2).collect()

>>>[(1, (2, 'a')), (1, (2, 'd')), (2, (4, 'b')), (2, (3, 'b')), (3, (4, None))]

map实现方式(小表在右的实现方式,小表在左的情况会稍微复杂些,需要多一些操作操作,实际场景中不多见):

def  doJoin(row):
result=[]
if row[1][1] is not None:
for i in row[1][1]:
result+=[(row[0],(row[1][0],i))]
  else:
result+=[row]
  return result d2_map={}
for i in d2.groupByKey().collect():
d2_map[i[0]]=i[1]
d2_broadcast=sc.broadcast(d2_map)
d2_dict=d2_broadcast.value
d1.map(lambda row:(row[0],(row[1],d2_dict.get(row[0])))).flatMap(doJoin).collect()

>>>[(1, (2, 'd')), (1, (2, 'a')), (2, (3, 'b')), (2, (4, 'b')), (3, (4, None))]

2、join

这里的join指的是innerjoin即只取出匹配到的数据项,只需要在上面的实现方式中加个filter即可

d1.map(lambda row:(row[0],(row[1],d2_dict.get(row[0])))).filter(lambda row:row[1][1] is not None).flatMap(doJoin).collect()

>>>[(1, (2, 'd')), (1, (2, 'a')), (2, (3, 'b')), (2, (4, 'b'))]

二、大表与大表之间的join(Reduce-join)

大表之间的join无法通过缓存数据来达到优化目的,因此需要把优化的重点放在分区效率及key的设计上

1、join的key值尽量使用数值类型,减少分区及shuffle的操作时间,在join时数值类型的key值在匹配时更快

2、将过滤条件放在join之前,使得join的数据量尽量最少

3、在join之前将两个表按相同分区数进行重新分区

reduce-join:指将两个表按key值进行分区,相同key的数据会被分在同一个分区,最后使用mapPartition进行join操作。

4、如果需要减少分区和并行度,请使用coalesce 而非repartition 方法。

* If you are decreasing the number of partitions in this RDD, consider using `coalesce`,
* which can avoid performing a shuffle.

三、其它优化方式

1、同一份数据被多次用到,在读入时进行缓存,后面直接使用,例如配置表,如果数据量不大则进行broadcast,否则使用cache

2、尽量减少重复计算,同样的计算逻辑只计算一次

3、几个优化参数

spark.akka.frameSize 1000                       集群间通信 一帧数据的大小,设置太小可能会导致通信延迟

spark.akka.timeout 100                             通信等待最长时间(秒为单位)
spark.akka.heartbeat.pauses 600                 心跳失败最大间隔(秒为单位)
spark.serializer org.apache.spark.serializer.KryoSerializer    序列化方式(sprak自己的实现方式)
spark.sql.autoBroadcastJoinThreshold -1           禁止自动broadcast表
spark.shuffle.consolidateFiles true             shuffle 自动合并小文件

四、后续优化方向

1、内存优化:对象所占用的内存,访问对象的消耗以及垃圾回收(garbage collection)所占用的开销

2、优化数据结构

3、优化RDD存储

4、并行度

Spark 中的join方式(pySpark)的更多相关文章

  1. Spark中的Join类型

    常规连接: 左半连接: 左半连接结果集:仅仅保留左边表中的行,这些行的joinkey出现在右边表中!!!(类似于leftTable.joinKey in (rightTable.joinKeys)). ...

  2. 大数据学习day19-----spark02-------0 零碎知识点(分区,分区和分区器的区别) 1. RDD的使用(RDD的概念,特点,创建rdd的方式以及常见rdd的算子) 2.Spark中的一些重要概念

    0. 零碎概念 (1) 这个有点疑惑,有可能是错误的. (2) 此处就算地址写错了也不会报错,因为此操作只是读取数据的操作(元数据),表示从此地址读取数据但并没有进行读取数据的操作 (3)分区(有时间 ...

  3. 【原创】大数据基础之Spark(8)Spark中Join实现原理

    spark中join有两种,一种是RDD的join,一种是sql中的join,分别来看: 1 RDD join org.apache.spark.rdd.PairRDDFunctions /** * ...

  4. Oracle中的三种Join 方式

    基本概念 Nested loop join: Outer table中的每一行与inner table中的相应记录join,类似一个嵌套的循环. Sort merge join: 将两个表排序,然后再 ...

  5. SQL Server中的三种Join方式

      1.测试数据准备 参考:Sql Server中的表访问方式Table Scan, Index Scan, Index Seek 这篇博客中的实验数据准备.这两篇博客使用了相同的实验数据. 2.SQ ...

  6. Spark获取DataFrame中列的方式--col,$,column,apply

    Spark获取DataFrame中列的方式--col,$,column,apply 1.官方说明 2.使用时涉及到的的包 3.Demo 原文作者:大葱拌豆腐 原文地址:Spark获取DataFrame ...

  7. Oracle SQL中join方式总结

    在ORACLE数据库中,表与表之间的SQL JOIN方式有多种(不仅表与表,还可以表与视图.物化视图等联结).SQL JOIN其实是一个逻辑概念,像NEST LOOP JOIN. HASH JOIN等 ...

  8. Spark中常用工具类Utils的简明介绍

    <深入理解Spark:核心思想与源码分析>一书前言的内容请看链接<深入理解SPARK:核心思想与源码分析>一书正式出版上市 <深入理解Spark:核心思想与源码分析> ...

  9. Spark中的编程模型

    1. Spark中的基本概念 Application:基于Spark的用户程序,包含了一个driver program和集群中多个executor. Driver Program:运行Applicat ...

随机推荐

  1. Java 对象属性的遍历

    package com.cn.mybatis.test; import java.io.IOException; import java.io.InputStream; import java.lan ...

  2. Tomcat源码学习记录--web服务器初步认识

    Tomcat作为开源的轻量级WEB服务器,虽然不是很适合某些大型项目,但是它开源,读其源代码可以很好的提高我们的编程功底和设计思维.Tomcat中用到了很多比较好的设计模式,其中代码风格也很值得我们去 ...

  3. IOS多线程知识总结/队列概念/GCD/串行/并行/同步/异步

    进程:正在进行中的程序被称为进程,负责程序运行的内存分配;每一个进程都有自己独立的虚拟内存空间: 线程:线程是进程中一个独立的执行路径(控制单元);一个进程中至少包含一条线程,即主线程. 队列:dis ...

  4. SQL反模式部分内容笔记

    规范化: 1, 以一种我们能够理解的方式表达这个世界中的事物; 2, 减少数据冗余存储, 防止异常或者不一致的数据; 3, 支持完整性约束.  Tips: 提高数据的性能不在此列表中. 意义: 规范化 ...

  5. 2014-11-9------- 设有一数据库,包括四个表:学生表(Student)、课程表(Course)、成绩表(Score)以及教师信息表(Teacher)。

    一.            设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表(一)~表( ...

  6. CSS Margin(外边距)

    CSS Margin(外边距)属性定义元素周围的空间. Margin margin清除周围的元素(外边框)的区域.margin没有背景颜色,是完全透明的 margin可以单独改变元素的上,下,左,右边 ...

  7. group By 和 Union 、 Union all的用法

    我学习的是MySQL,学习写sql语句过程中遇到Group By 和 Union. 大家乐意看这两个链接,写的很好 Group By: www.cnblogs.com/rainman/archive/ ...

  8. PHP 单一入口

    单一入口概述 单一入口的应用程序就是说用一个文件处理所有的HTTP请求,例如不管是列表页还是文章页,都是从浏览器访问index.php文件,这个文件就是这个应用程序的单一入口. 打个比方,大家都要上W ...

  9. [学习笔记]设计模式之Proxy

    为方便读者,本文已添加至索引: 设计模式 学习笔记索引 写在前面 “魔镜啊魔镜,谁是这个世界上最美丽的人?” 每到晚上,女王都会问魔镜相同的问题(见Decorator模式).这是她还曾身为女巫时留下的 ...

  10. AS3.0的int uint Number的使用原则

    int uint Number的使用原则: 1.能用整数值时优先使用:int uint 2.整数值有正负时使用:int 3.只处理正整数时使用:uint 4.处理好和颜色相关的值时使用:uint 5. ...