【数据倾斜出现的原因】
并行计算中,我们总希望分配的每一个任务(task)都能以相似的粒度来切分,且完成时间相差不大。但是由于集群中的硬件和应用的类型不同、切分的数据大小不一,总会导致部分任务极大地拖慢了整个任务的完成时间,数据倾斜原因如下:
  • 业务数据本身的特性
  • Key分布不均匀
  • 建表时考虑不周
  • 某些SQL语句本身就有数据倾斜
数据倾斜的表现:任务进度长时间维持,查看任务监控页面,由于其处理的数据量与其他任务差异过大,会发现只有少量(1个或几个)任务未完成。

【数据倾斜的解决方案】
数据倾斜有很多解决方案,本例简要介绍一种实现方式。假设表A和表B连接,表A数据倾斜,只有一个Key倾斜。首先对A进行采样,统计出最倾斜的Key。将A表分隔为A1只有倾斜Key,A2不包含倾斜Key,然后分别与B连接。

数据实例
------ ------ 
我们要实现上面两个表的连接,很容易发现在table1中(1,tom)出现的次数明显比其他的键值对要多,是倾斜数据。通过处理我们要把它拆分成两部分,如上图所示。然后这两部分分别与table2做连接操作,最后把结果汇总到一起。

SPARK 代码
 package spark

 import org.apache.spark.{SparkContext, SparkConf}

 /**
* Created by Liu Jinhong on 2016/5/27.
*/
object TiltJoin {
def main(args: Array[String]) {
val conf = new SparkConf().setAppName("TiltJoin").setMaster("local")
val sc = new SparkContext(conf)
val line1 = sc.textFile("E:\\testdoc\\a.txt")
val line2 = sc.textFile("E:\\testdoc\\b.txt") val table1 = line1.map(_.split(' ')).map(x => (x(0), x(1)))
val table2 = line2.map(_.split(' ')).map(x => (x(0), x(1)))
//对table1进行采样
val sample = table1.sample(false, 0.3, 9).map(x => (x._1, 1)).reduceByKey(_+_)
//找到table1中的倾斜数据
val maxrowKey = sample.map(x => (x._2, x._1)).sortByKey(false).take(1).toSeq(0)._2
//把table1拆分成两个表
val maxrowTable = table1.filter(_._1 == maxrowKey)
val maintable = table1.filter(_._1 != maxrowKey) val result = sc.union(maxrowTable.join(table2), maintable.join(table2)).foreach(println(_))
}
}

【涉及到的函数】

val maxrowKey = sample.map(x => (x._2, x._1)).sortByKey(false).take(1).toSeq(0)._2

上诉代码相当于实现了按照value降序排序。

Spark 倾斜连接的更多相关文章

  1. Spark Streaming连接TCP Socket

    1.Spark Streaming是什么 Spark Streaming是在Spark上建立的可扩展的高吞吐量实时处理流数据的框架,数据可以是来自多种不同的源,例如kafka,Flume,Twitte ...

  2. 【spark】连接Hbase

    0.我们有这样一个表,表名为Student 1.在Hbase中创建一个表 表明为student,列族为info 2.插入数据 我们这里采用put来插入数据 格式如下   put  ‘表命’,‘行键’, ...

  3. Spark Streaming连接Kafka的两种方式 direct 跟receiver 方式接收数据的区别

    Receiver是使用Kafka的高层次Consumer API来实现的. Receiver从Kafka中获取的数据都是存储在Spark Executor的内存中的,然后Spark Streaming ...

  4. Spark join连接

    内链接

  5. Spark SQL 官方文档-中文翻译

    Spark SQL 官方文档-中文翻译 Spark版本:Spark 1.5.2 转载请注明出处:http://www.cnblogs.com/BYRans/ 1 概述(Overview) 2 Data ...

  6. 《Spark大数据处理:技术、应用与性能优化 》

    基本信息 作者: 高彦杰 丛书名:大数据技术丛书 出版社:机械工业出版社 ISBN:9787111483861 上架时间:2014-11-5 出版日期:2014 年11月 开本:16开 页码:255 ...

  7. 《Spark大数据处理:技术、应用与性能优化》【PDF】 下载

    内容简介 <Spark大数据处理:技术.应用与性能优化>根据最新技术版本,系统.全面.详细讲解Spark的各项功能使用.原理机制.技术细节.应用方法.性能优化,以及BDAS生态系统的相关技 ...

  8. 《Spark大数据处理:技术、应用与性能优化》【PDF】

    内容简介 <Spark大数据处理:技术.应用与性能优化>根据最新技术版本,系统.全面.详细讲解Spark的各项功能使用.原理机制.技术细节.应用方法.性能优化,以及BDAS生态系统的相关技 ...

  9. Spark记录-SparkSql官方文档中文翻译(部分转载)

    1 概述(Overview) Spark SQL是Spark的一个组件,用于结构化数据的计算.Spark SQL提供了一个称为DataFrames的编程抽象,DataFrames可以充当分布式SQL查 ...

随机推荐

  1. JS 高效快速的数组去重

    Array.prototype.uniquer = function() { var result = [], hash = {}; ; i < this.length; i++) { if ( ...

  2. java基础第二天

    学习了关键字,标识符,数据类型.变量和常量,运算符和表达式,开始编写一些简单的输入输出运算的程序了.

  3. centos 6.5 安装openssl

    1.下载wget https://www.openssl.org/source/openssl-1.0.2h.tar.gz 2.解压tar zxf openssl-1.0.2h.tar.gzcd op ...

  4. 解决vs2013下创建的python文件,到其他平台(如linux)下中文乱码(或运行时报SyntaxError: (unicode error) 'utf-8' codec can't decode byte...)

    Vs2013中创建python文件,在文件中没输入中文时,编码为utf-8的,如图 接着,在里面输入几行中文后,再次用notepad++查看其编码如下,在vs下运行也报错(用cmd运行就不会): 根据 ...

  5. C#中的DataSet添加DataTable问题

    最近在使用DataTable来给前台控件绑定数据,开始时查了网上的一些给DataSet添加DataTable时需要注意的地方,一般都要添加表名并且使用DataTable.Copy()方法,否则会报错, ...

  6. Java的关键字和标识符

    1.关键字 Java中共有52个关键字,其中有两个保留字,虽然查到百度百科上说是50个,但是事实确实是有52个(47+3+2). 1.1保留字 Java语言的的保留字是指在Java中商务预留的关键字 ...

  7. Java线程池使用

    1.构造函数 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit ...

  8. JAVA 程序发布引发性能抖动

    发布或重启线上服务时抖动问题解决方案 一.问题描述       在发布或重启某线上某服务时(jetty8作为服务器),常常发现有些机器的load会飙到非常高(高达70),并持续较长一段时间(5分钟)后 ...

  9. [折腾纪实]JAVA的坑

    开贴记录使用JAVA踩的坑-- P.S. 学习编程最好的方法就是用一个贴心的IDE写,然后隔着屏幕都能感觉到IDE在骂自己SB-- Overridable method calls in constr ...

  10. JavaScript eval() 为什么使用eval()是一个坏主意 什么时候可以使用eval()

    ---------------------------------------------------------------------------------------------------- ...