Scala | Spark核心编程 | SparkCore | 算子



一、SparkCore

1.RDD

1.1 概念

  RDD(Resilient Distributed Dataset) ,弹性分布式数据集。

1.2 RDD的五大属性(重点)
  1. RDD 是由一系列的 partition 组成的。
  2. 函数是作用在每一个 partition(split)上的。
  3. RDD 之间有一系列的依赖关系。
  4. 分区器是作用在 K,V 格式的 RDD 上。
  5. RDD 提供一系列最佳的计算位置,体现了大数据中“计算移动数据不移动”的理念。
1.3 RDD理解图

在这里插入图片描述
注意

  • textFile 方法底层封装的是MR 读取文件的方式,读取文件之前先 split,默认 split 大小是一个 block 大小。

  • RDD 实际上不存储数据,这里方便理解,暂时理解为存储数据。

  • 什么是 K、V 格式的 RDD?
    如果 RDD 里面存储的数据都是二元组对象,那么这个 RDD 我们就叫做 K,V 格式的 RDD。

  • 哪里体现 RDD 的弹性?
    RDD 是由 一系列的partition 组成。其大小和数量都是可以改变的,默认情况下,partition的个数和block块个数相同,体现了 RDD 的弹性。

  • 哪里体现 RDD 的容错?
    RDD 之间存在依赖关系,子RDD可以找出对应的父RDD然后通过一系列计算得到相应结果,这就是容错的体现。

  • 哪里体现 RDD 的分布式?

    • RDD 是由 Partition 组成,partition 是分布在不同节点上的。
    • RDD 提供计算最佳位置,体现了数据本地化。体现了大数据中“计算移动数据不移动”的理念。

2.Spark任务执行原理

  以standalone模式为例,Standalone模式是Spark自带的一种集群模式,Standalone模式是真实地在多个机器之间搭建Spark集群的环境,完全可以利用该模式搭建多机器集群,用于实际的大数据处理。
在这里插入图片描述
以上图中有四个机器节点,Driver 和 Worker 是启动在节点上的进程,运行在 JVM 中的进程。其中:

  • Master角色以Master进程存在, Worker角色以Worker进程存在
  • Driver和Executor运行于Worker进程内, 由Worker提供资源供给它们运行
  • Driver 与集群节点之间有频繁的通信。
  • Driver 负责任务(tasks)的分发和结果的回收。任务的调度。如果 task的计算结果非常大就不要回收了。会造成 oom。

这里只是做了简单介绍,更多可查看Spark四种运行模式介绍

3.Spark代码流程

  1. 创建 SparkConf 对象
    • 可以设置 Application name
    • 可以设置运行模式及资源需求。
  2. 创建 SparkContext 对象
  3. 基于 SparkContext 即上下文环境对象创建一个 RDD,对 RDD 进行处理。
  4. 应用程序中要有 Action 类算子来触发 Transformation 类算子执行。
  5. 关闭 Spark 上下文对象。

二、算子

  常见的算子如下图所示,主要也分为如下几种:
在这里插入图片描述

1.Transformations转换算子

  Transformations 类算子是一类算子(函数)叫做转换算子,如map,flatMap,reduceByKey 等。Transformations 算子是延迟执行,也叫懒加载执行。

1.1 filter算子

  filter:过滤符合条件的记录数,true 保留,false 过滤掉。
Operator_filter.scala

package com.shsxt.scalaTest.core.transform_operator

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

object Operator_filter {
   
  def main(args: Array[String]): Unit = {
   
    val conf = new SparkConf()
    conf.setMaster("local").setAppName("filter")
    val sc =  new SparkContext(conf)
    val lines = sc.textFile("data/word.txt")
    val result = lines.filter {
    _.indexOf("Spark") >= 0 }
    result.foreach {
    println}
    sc.stop()
  }
}
hello Spark
1.2 map算子

  map:将一个 RDD 中的每个数据项,通过 map 中的函数映射变为一个新的元素。
特点:输入一条,输出一条数据。

package com.shsxt.scalaTest.core.transform_operator

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

object Operator_map {
   
  def main(args: Array[String]): Unit = {
   
    val conf = new SparkConf()
    conf.setMaster("local").setAppName("map")
    val sc = new SparkContext(conf)
    val lines = sc.textFile("data/word.txt")
    val result = lines.map {
    _.split(" ") }
    result.foreach(println)
    sc.stop()
  }
}
[Ljava.lang.String;@1c200b99
[Ljava.lang.String;@1ae41188
[Ljava.lang.String;@72a7be25
[Ljava.lang.String;@26de52e0
1.3 flatMap算子

   flatMap:先 mapflat。与 map 类似,每个输入项可以映射为 0 到多个输出项。

package com.shsxt.scalaTest.core.transform_operator

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

object Operator_flatMap {
   
  def main(args: Array[String]): Unit = {
   
    val conf = new SparkConf()
    conf.setMaster("local").setAppName("flatMap")
    val sc = new SparkContext(conf)
    val lines = sc.textFile("data/word.txt")
    val result = lines.flatMap {
    _.split(" ")}
    result.foreach(println)
    sc.stop()
  }
}
hello
tiantian
hello
shsxt
hello
gzsxt
hello
Spark
1.4 sample算子

   sample:随机抽样算子,根据传进去的小数按比例进行有放回或者无放回的抽样。

package com.shsxt.scalaTest.core.transform_operator

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

object Operator_sample {
   
  def main(args: Array[String]): Unit = {
   
    val conf = new SparkConf()
    conf.setMaster("local").setAppName("sample")
    val sc = new SparkContext(conf)
    val lines = sc.textFile("data/word.txt")
    lines.sample(true, 0.5,10).foreach(println)
  }
}
hello shsxt
1.5 reduceByKey算子

   reduceByKey:将相同的 Key 根据相应的逻辑进行处理。

package com.shsxt.scalaTest.core.transform_operator

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

object Operator_reduceByKey {
   
  def main(args: Array[String]): Unit = {
   
    val conf = new SparkConf()
    conf.setMaster("local").setAppName("reduceByKey")
    val sc = new SparkContext(conf)
    val lines = sc.textFile("data/word.txt")
    val flatMap = lines.flatMap {
    _.split(" ")}
    val map = flatMap.map {
   (_,1)}
    map.reduceByKey(_+_).foreach(println)
    sc.stop()
  }
}
(Spark,1)
(shsxt,1)
(tiantian,1)
(hello,4)
(gzsxt,1)
1.6 sortByKey与sortBy算子

   sortByKey/sortBy:作用在 K、V 格式的 RDD 上,对 key 进行升序或者降序排序。

package com.shsxt.scalaTest.core.transform_operator

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

object Operator_sortByKey {
   
  def main(args: Array[String]): Unit = {
   
    val conf = new SparkConf()
    conf.setMaster("local").setAppName("sortByKey")
    val sc = new SparkContext(conf)
    val lines = sc.textFile("data/word.txt")
    val reduceResult = lines.flatMap {
    _.split(" ")}.map {
    (_,1)}.reduceByKey(_+_)
    reduceResult.map(f => {
   (f._2,f._1)}).sortByKey(false).map(f => {
   (f._2,f._1)}).foreach(println)
    
    sc.stop()
  }
}
(hello,4)
(Spark,1)
(shsxt,1)
(tiantian,1)
(gzsxt,1)
package com.shsxt.scalaTest.core.transform_operator

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

object Operator_sortBy {
   
  def main(args: Array[String]): Unit = {
   
    val conf = new SparkConf()
    conf.setMaster("local").setAppName("sortBy")
    val sc = new SparkContext(conf)
    val lines = sc.textFile("data/word.txt")
    val reduceResult = lines.flatMap {
    _.split(" ")}.map{
    (_,1)}.reduceByKey(_+_)
    val result = reduceResult.sortBy(_._2,false)
    result.foreach{
   println}
    sc.stop()

  }
}
(hello,4)
(Spark,1)
(shsxt,1)
(tiantian,1)
(gzsxt,1)
1.7 join算子

   join算子:作用在 K,V 格式的 RDD 上。根据 K 进行连接,对(K,V)join(K,W)返回(K,(V,W))

  • leftOuterJoin算子
  • rightOuterJoin算子
  • fullOuterJoin算子

注意:join 后的分区数与父 RDD 分区数多的那一个相同

package com.shsxt.scalaTest.core.transform_operator

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

object Operator_Join {
   

    def main(args: Array[String]): Unit = {
   

        val conf = new SparkConf()
        conf.setMaster("local").setAppName("flatMap")
        val sc = new SparkContext(conf)

        val rdd1 = sc.parallelize(
            Array(("a",1),("b",2),("c",3)),
            3
        )

        val rdd2 = sc.parallelize(
            Array(("a",1),("d",2),("e",3)),
            2
        )

        val result1: RDD[(String, (Int, Int))] = rdd1.join(rdd2)
        
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

幼稚的人呐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值