spark通过sample算子找出导致数据倾斜的key

原创 2018年04月15日 14:05:08

最近在整理原来学过的内容,看到sample算子就写一篇在实际开发中sample算子的具体应用

sample(withReplacement : scala.Boolean, fraction : scala.Double,seed scala.Long)

sample算子时用来抽样用的,其有3个参数

withReplacement:表示抽出样本后是否在放回去,true表示会放回去,这也就意味着抽出的样本可能有重复

fraction :抽出多少,这是一个double类型的参数,0-1之间,eg:0.3表示抽出30%

seed:表示一个种子,根据这个seed随机抽取,一般情况下只用前两个参数就可以,那么这个参数是干嘛的呢,这个参数一般用于调试,有时候不知道是程序出问题还是数据出了问题,就可以将这个参数设置为定值


下面是代码:

大概思路是:通过抽样取出一部分样本,在对样本做wordCount并排序最后取出出现次数最多的key,这个key就是导致数据倾斜的key

package com.lyzx.spark.streaming;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import scala.Tuple2;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Day05 {

    public static void main(String[] args) {
        SparkConf conf = new SparkConf().setMaster("local[2]").setAppName("Day05");
        JavaSparkContext jsc = new JavaSparkContext(conf);

        List<String> keys = getKeyBySample(jsc);
        System.out.println("导致数据倾斜的key是:"+keys);
        jsc.stop();
    }

    /**
     * 通过Sample算子进行抽样并把导致数据倾斜的key找出来
     * 然后可以做对计算做针对性的优化
     * @param jsc
     */
    public static List<String> getKeyBySample(JavaSparkContext jsc){
        List<String> data = Arrays.asList("A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A",
                "A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A",
                "A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A",
                "B","B","B","B","B","B","B","B","C","D","E","F","G");

        JavaRDD<String> rdd =  jsc.parallelize(data,2);
        List<Tuple2> item =
                rdd.mapToPair(x->new Tuple2<String,Integer>(x,1))
                .sample(true,0.4)
                .reduceByKey((x,y)->x+y)
                .map(x->new Tuple2(x._2,x._1))
                .sortBy(x->x._1,false,2)
                .take(3);

        List<String> keys = new ArrayList<>();
        System.out.println("keys="+item);
        for(int i=0;i<item.size();i++){
            if(i == item.size()-1)
               break;
            Tuple2 current = item.get(i);
            Tuple2 next = item.get(i+1);
            Integer v1 = Integer.parseInt(current._1.toString());
            Integer v2 = Integer.parseInt(next._1.toString());
            System.out.println(v1+"   "+v2);

            /**
             * 这儿的逻辑有问题,找出导致数据倾斜的key的方式和具体的业务也有关系
             * 这里只是给了一个简单的判断方法,很有局限性
             */
            if(v1/v2 >= 3){
                System.out.println("===");
                keys.add(current._2.toString());
            }
        }
        return keys;
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lyzx_in_csdn/article/details/79948799

数据倾斜是多么痛?spark作业调优秘籍

数据倾斜是多么痛?spark作业调优秘籍 不鸡道叫啥2016/11/09          有的时候,我们可能会遇到大数据计算中一个最棘手的问题——数据倾斜,此时Spa...
  • javastart
  • javastart
  • 2016-11-10 18:11:27
  • 1392

spark数据倾斜解决方案(一)炫酷的4个方案

A,数据倾斜解决方案  使用随机key实现双重聚合 使用随机key实现双重聚合 1、原理 把key前面都加上个随机数,使得key分散,让key跑到不同的task上面去! 然后再...
  • qq_21835703
  • qq_21835703
  • 2017-03-25 17:29:59
  • 473

Spark 算子

RDD算子分类,大致可以分为两类,即: Transformation:转换算子,这类转换并不触发提交作业,完成作业中间过程处理。 Action:行动算子,这类算子会触发SparkContext提交Jo...
  • tanggao1314
  • tanggao1314
  • 2016-06-03 22:07:35
  • 8755

Spark调优-数据倾斜-四个解决方案

A,数据倾斜解决方案  使用随机key实现双重聚合 使用随机key实现双重聚合 1、原理 这个方案的核心实现思路就是进行两阶段聚合。第一次是局部聚合,先给每个key都打上一个随机...
  • u013939918
  • u013939918
  • 2017-03-09 10:41:29
  • 580

spark性能优化之数据倾斜

数据倾斜一般只会发生在shuffle过程中,针对不同的数据分布情况,可以采用以下几种方式针对不同的应用场景。 1.分析有可能发生数据倾斜(data skew)的位置及发生数据倾斜时的现象 通常...
  • kaaosidao
  • kaaosidao
  • 2017-08-25 18:11:41
  • 195

spark 通过打散热点key解决数据倾斜问题

1.热点key的数据倾斜在大数据相关的统计与处理中,热点key造成的数据倾斜非常常见也非常讨厌,经常会造成job运行时间变长或者造成job的OOM最后导致任务失败。例如在wordcount任务中,如果...
  • bitcarmanlee
  • bitcarmanlee
  • 2017-12-22 16:06:11
  • 234

spark数据倾斜处理

调优概述       有的时候,我们可能会遇到大数据计算中一个最棘手的问题——数据倾斜,此时Spark作业的性能会比期望差很多。数据倾斜调优,就是使用各种技术方案解决不同类型的数据倾斜问题,以保...
  • qq_38534715
  • qq_38534715
  • 2017-12-04 11:16:15
  • 256

spark性能优化:数据倾斜调优

调优概述 有的时候,我们可能会遇到大数据计算中一个最棘手的问题——数据倾斜,此时Spark作业的性能会比期望差很多。数据倾斜调优,就是使用各种技术方案解决不同类型的数据倾斜问题,以保证Spark作业...
  • LW_GHY
  • LW_GHY
  • 2016-05-15 22:51:53
  • 22112

spark transform系列__sample

Sample是对rdd中的数据集进行采样,并生成一个新的RDD,这个新的RDD只有原来RDD的部分数据,这个保留的数据集大小由fraction来进行控制,这个分析中,不分析sample的两个算法的具体...
  • u014393917
  • u014393917
  • 2016-01-28 17:45:27
  • 2774

Spark 数据倾斜 join 调优

原文出处:https://tech.meituan.com/spark-tuning-pro.html前言继基础篇讲解了每个Spark开发人员都必须熟知的开发调优与资源调优之后,本文作为《Spark性...
  • a1043498776
  • a1043498776
  • 2017-08-17 13:22:52
  • 714
收藏助手
不良信息举报
您举报文章:spark通过sample算子找出导致数据倾斜的key
举报原因:
原因补充:

(最多只允许输入30个字)