关闭

Spark实践之join优化

标签: sparkscalajoin大数据
4670人阅读 评论(0) 收藏 举报
分类:


join优化应该是spark相关岗位面试必考的内容。 join其实常见的就分为两类: map-side join 和  reduce-side join。当大表和小表join时,用map-side join能显著提高效率。。


/**
 * Created by shenjiyi on 2015/7/8.
 */

package com.test

import com.test.utils.MySparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf

object TestJoin {
  def main (args: Array[String]): Unit ={
    val conf = new SparkConf()
      .setMaster(args(0))
      .setAppName("TestJoin")
      .set("spark.speculation", "true")
      .set("spark.default.parallelism", "200")
    val sc = new MySparkContext(conf)

    val input1 = sc.rawTextFile(args(1), "GB18030")
    val input2 = sc.rawTextFile(args(2), "GB18030")
    val output1 = args(3)
    val output2 = args(4)

    val pairs = input1.map { x =>
      val pos = x.indexOf(',')
      (x.substring(0, pos), x.substring(pos + 1))
    }.collectAsMap()


    //map-side join 适用于小表和大表join的情况
    //将小表load到内存,然后broad到各个节点之后,再个大表做join,可以避免shuffle,提高效率
    val broadCastMap = sc.broadcast(pairs)
    val result = input2.map{ x =>
      val pos = x.indexOf('\t')
      (x.substring(0, pos), x.substring(pos + 1))
    }.mapPartitions { iter =>
      val m = broadCastMap.value
      for {
        (k, v) <- iter
        if (m.contains(k))
      } yield (k, (v, m.get(k).getOrElse("")))
    }.saveAsTextFile(output1)


    //reduce-side join
    val pairs2 = input1.map { x =>
      val pos = x.indexOf('\t')
      (x.substring(0, pos), x.substring(pos + 1))
    }
    val result2 = input2.map { x =>
      val pos = x.indexOf('\t')
      (x.substring(0, pos), x.substring(pos + 1))
    }.join(pairs2).saveAsTextFile(output2)
  }
}


2
0
查看评论

RDD Join 性能调优

阅读本篇博文时,请先理解RDD的描述及作业调度:[《深入理解Spark 2.1 Core (一):RDD的原理与源码分析 》](http://blog.csdn.net/u011239443/article/details/53894611#t16)Join数据是我们在Spark操作中的很重要的一部...
  • u011239443
  • u011239443
  • 2017-01-12 17:18
  • 3259

Spark map-side-join 关联优化

将多份数据进行关联是数据处理过程中非常普遍的用法,不过在分布式计算系统中,这个问题往往会变的非常麻烦,因为框架提供的 join 操作一般会将所有数据根据 key 发送到所有的 reduce 分区中去,也就是 shuffle 的过程。造成大量的网络以及磁盘IO消耗,运行效率极其低下,这个过程一般被称为...
  • lsshlsw
  • lsshlsw
  • 2016-03-09 14:01
  • 6102

spark join broadcast优化

在大量数据中对一些字段进行关联。举例ipTable:需要进行关联的几千条ip数据(70k) hist:历史数据(百亿级别) 直接join将会对所有数据进行shuffle。使用broadcast将会把小表分发到每台执行节点上,基本就取消了shuffle的过程,运行效率大幅度提高。样本数据(2000w...
  • lsshlsw
  • lsshlsw
  • 2015-09-24 00:02
  • 5448

spark十亿数据join优化

转:https://daizuozhuo.github.io/spark-join/ 最近在项目中用Spark join了几十亿的数据,在debug和不断优化性能中感觉收获良多,特此记录一下。 任务很简单,就是join两张表,表A ship有几千万行,包含每日寄出去的包裹的信息,...
  • weixin_36630761
  • weixin_36630761
  • 2017-12-14 11:25
  • 46

Spark SQL之Join优化

SparkSQL总体流程介绍 在阐述Join实现之前,我们首先简单介绍SparkSQL的总体流程,一般地,我们有两种方式使用SparkSQL,一种是直接写sql语句,这个需要有元数据库支持,例如Hive等,另一种是通过Dataset/DataFrame编写Spark应用程序。如下图所示,sql...
  • weixin_37136725
  • weixin_37136725
  • 2018-01-06 15:23
  • 94

SparkSQL的3种Join实现

本文简单介绍SparkSQL中的几种Join实现。SparkSQL会根据用户配置,对不同大小的表应用不同的Join策略,兼顾效率和稳定性。
  • doggie_wangtao
  • doggie_wangtao
  • 2016-12-12 23:06
  • 8523

spark性能调优:资源优化

在开发完Spark作业之后,就该为作业配置合适的资源了。Spark的资源参数,基本都可以在spark-submit命令中作为参数设置。很多Spark初学者,通常不知道该设置哪些必要的参数,以及如何设置这些参数,最后就只能胡乱设置,甚至压根儿不设置。资源参数设置的不合理,可能会导致没有充分利用集群资源...
  • LW_GHY
  • LW_GHY
  • 2016-05-15 22:58
  • 4219

解决spark sql关联(join)查询使用“or“缓慢的问题

1.需求描述将a表的数据与b表的两个字段进行关联,输出结果a表数据约24亿条b表数据约30万条2.优化效果优化后执行时间从数天减少到数分钟3.资源配置spark 1.4.1200core,600G RAM4.代码简化版(优化前)sqlContext.sql("name,ip1,ip2 as...
  • lsshlsw
  • lsshlsw
  • 2015-10-20 19:55
  • 5196

基于spark实现表的join操作

1. 自连接假设存在如下文件:[root@bluejoe0 ~]# cat categories.csv 1,生活用品,0 2,数码用品,1 3,手机,2 4,华为Mate7,3每一行的格式为:类别ID,类别名称,父类ID现在欲输出每个类别的父类别的名称,类似于SQL的自连接,注意到join的外键...
  • bluejoe2000
  • bluejoe2000
  • 2015-08-05 23:39
  • 11513

Spark join和cogroup算子

join下面的代码包括RDD和DataFrame的join操作, 注释中有详细描述import org.apache.spark.sql.types.{DataTypes, StructField, StructType} import org.apache.spark.sql.{Row, SQLC...
  • wo334499
  • wo334499
  • 2016-06-16 09:39
  • 9352
    个人资料
    • 访问:114711次
    • 积分:2426
    • 等级:
    • 排名:第18053名
    • 原创:128篇
    • 转载:11篇
    • 译文:0篇
    • 评论:19条
    文章分类
    最新评论