Spark on Yarn(client和cluster模式,spark-shell 和 spark-submit 的区别,WorldCount实现与理解)

news2024/9/29 1:17:46

文章目录

  • Spark on Yarn
    • 两种模式
      • client
      • cluster
    • spark-shell 和 spark-submit 的区别的理解
      • spark-shell
      • spark-submit
    • WorldCount实现
      • IDEA本地实现
      • On Yarn 实现
      • WorldCount图解

Spark on Yarn

spark on yarn 的两种模式是指 spark 应用程序的 driver 进程(负责控制和协调整个应用程序的运行)在哪里运行的问题。

两种模式

client

yarn-client 模式是指 driver 运行在客户端上,通过 application master(负责向 yarn 的 resource manager 申请资源和监控应用程序状态)来管理集群中的 executor 进程(负责执行具体的任务)。这样做的好处是可以方便地获取日志和返回信息,因为 driver 在客户端。缺点是会占用客户端的资源,可能影响性能和并发。这种模式适合开发测试环境,因为可以方便地调试和交互。

在这里插入图片描述

cluster

yarn-cluster 模式是指driver 运行在 yarn 集群中的一个 worker 节点上,这个节点会在 spark web UI 上显示为 driver 节点。这样做的好处是可以节省客户端(提交 spark 应用程序的机器)的资源,不受客户端的限制。缺点是不方便查看日志和返回信息,因为 driver 不在客户端。这种模式适合生产环境,因为可以保证应用程序的稳定性和效率。

在这里插入图片描述

spark-shell 和 spark-submit 的区别的理解

spark-shell

spark-shell 是一个交互式的 shell,可以用来运行 spark 代码和 SQL 语句,支持 Scala 和 Python 两种语言。spark-shell 可以在本地或者集群上运行,可以方便地进行数据分析和探索,也可以用来测试和调试 spark 应用程序。spark-shell 启动时会创建两个对象,一个是 sc,一个是 spark。sc 是 SparkContext 的实例,是 spark 的底层核心对象,负责和集群进行通信和协调。spark 是 SparkSession 的实例,是 spark 的高层封装对象,提供了更多的功能和便利,如 SQL, DataFrame, Dataset 等。

spark-submit

spark-submit 是一个用来在集群上提交和运行 spark 应用程序的脚本,支持 Scala, Java 和 Python 三种语言。spark-submit 可以指定各种选项和配置,如集群管理器,部署模式,资源分配,依赖包等。spark-submit 需要提供一个包含 spark 应用程序的 jar 包或者 py 文件,以及传递给应用程序的参数。spark-submit 适合运行生产环境的 spark 应用程序,可以保证应用程序的稳定性和效率。

spark-submit 的一般语法是:

./bin/spark-submit \

–class <main-class> \

–master <master-url> \

–deploy-mode <deploy-mode> \

–conf <key>=<value> \# 其他选项

<application-jar> \

[application-arguments]

其中,一些常用的选项是:

–class: 应用程序的入口类(例如 org.apache.spark.examples.SparkPi)

–master: 集群的 master URL(例如 yarn)

–deploy-mode: 是否在 worker 节点上部署 driver(cluster)或者在本地作为一个外部客户端(client)(默认是 client)

–conf: 任意的 spark 配置属性,以 key=value 的格式。如果值包含空格,需要用引号括起来(如下所示)。多个配置需要用不同的参数传递。(例如 --conf <key>=<value> --conf <key2>=<value2>)

application-jar: 包含应用程序和所有依赖的 jar 包的路径。这个 URL 必须在集群中全局可见,例如,一个 hdfs:// 路径或者一个 file:// 路径,且在所有节点上存在。

WorldCount实现

IDEA本地实现

在maven中导入相应依赖

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.scala-lang</groupId>
      <artifactId>scala-library</artifactId>
      <version>2.12.10</version>
    </dependency>
    <dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-core_2.12</artifactId>
    <version>3.1.3</version>
    </dependency>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-lang3</artifactId>
      <version>3.9</version> </dependency>
    <dependency>
      <groupId>com.typesafe.akka</groupId>
      <artifactId>akka-actor_2.12</artifactId>
      <version>2.4.17</version>
    </dependency>
    <dependency>
      <groupId>com.typesafe.akka</groupId>
      <artifactId>akka-remote_2.12</artifactId>
      <version>2.4.17</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <!-- 打包插件, 否则 scala 类不会编译并打包进去 -->
      <plugin>
        <groupId>net.alchim31.maven</groupId>
        <artifactId>scala-maven-plugin</artifactId>
        <version>3.4.6</version>
        <executions>
          <execution>
            <goals>
              <goal>compile</goal>
              <goal>testCompile</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

代码实现

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

object WordCount {
  def main(args: Array[String]): Unit = {
    //准备sc/SparkContext/Spark上下文执行环境
    /*这段代码的意思是创建一个 SparkConf 对象,用来配置 spark 应用程序的属性。SparkConf 对象可以传递给 SparkContext,用来创建 spark 环境。
    这段代码设置了两个属性:
    setAppName(“wc”): 设置 spark 应用程序的名称为 “wc”,这个名称会显示在 spark web UI 上,也可以用来标识应用程序。
    setMaster("local[*]"): 设置 spark 应用程序的运行模式为 local 模式,即在本地运行。
    local[*] 表示使用所有可用的 CPU 核数,也可以指定具体的数字,例如 local[2] 表示使用两个 CPU 核数。*/
    val conf: SparkConf = new SparkConf().setAppName("wc").setMaster("local[*]")
    /*这段代码的意思是创建一个 SparkContext 对象,用来初始化 spark 环境。
    SparkContext 是 spark 的核心对象,负责和集群进行通信和协调,创建 RDD, DataFrame, Dataset 等分布式数据集。
    这段代码传递了一个 SparkConf 对象,用来指定 spark 应用程序的配置属性,例如应用程序的名称,运行模式,资源分配等。*/
    val sc: SparkContext = new SparkContext(conf)
    sc.setLogLevel("WARN")

    //source/读取数据
    //RDD:A Resilient Distributed Dataset (RDD):弹性分布式数据集,简单理解为分布式集合!使用起来和普通集合一样简单!
    //从本地文件系统中读取 data/input/words.txt 文件,创建一个 RDD[String] 类型的数据集,每个元素是文件中的一行文本。
    val lines: RDD[String] = sc.textFile("data/input/words.txt")

    //transformation/数据操作/转换
    //对 lines 数据集进行 flatMap 转换操作,将每行文本按空格切分成单词,然后扁平化成一个 RDD[String] 类型的数据集,每个元素是一个单词。
    val words: RDD[String] = lines.flatMap(_.split(" "))
    //对 words 数据集进行 map 转换操作,将每个单词映射成一个 (单词, 1) 的元组,创建一个 RDD[(String, Int)] 类型的数据集,每个元素是一个 (单词, 1) 的键值对。
    // RDD[(单词, 1)]
    val wordAndOnes: RDD[(String, Int)] = words.map((_,1))
    //分组聚合:groupBy + mapValues(_.map(_._2).reduce(_+_)) ===>在Spark里面分组+聚合一步搞定:reduceByKey
    // 对 wordAndOnes 数据集进行 reduceByKey 转换操作,
    // 按照单词进行分组,然后对每组的值进行累加,创建一个 RDD[(String, Int)] 类型的数据集,每个元素是一个 (单词, 频数) 的键值对。
    val result: RDD[(String, Int)] = wordAndOnes.reduceByKey(_+_)
    
    //直接输出
    result.foreach(println)
    //收集为本地集合再输出
    println(result.collect().toBuffer)
    //输出到指定path(可以是文件/夹)
    /*result.repartition(1): 
        对 result 数据集进行 repartition 操作,将数据集的分区数调整为 1,即将所有的数据合并到一个分区中。
        这样做的目的是为了方便保存到一个文件中,但是可能会影响性能和并行度。
    saveAsTextFile(“data/output/result”): 
        对 repartition 后的数据集进行 saveAsTextFile 操作,将数据集的内容以文本格式保存到 data/output/result 目录中。
        每个分区对应一个文件,文件名为 part-00000, part-00001 等。
        因为 repartition 之后只有一个分区,所以只会生成一个文件,即 part-00000。*/
    result.repartition(1).saveAsTextFile("data/output/result")
    result.repartition(2).saveAsTextFile("data/output/result2")

    //为了便于查看Web-UI可以让程序睡一会
    Thread.sleep(1000 * 60)
    //关闭资源
    sc.stop()
  }
}

On Yarn 实现

代码实现

import org.apache.hadoop.fs.{FileSystem, Path} //导入Hadoop文件系统相关的类
import org.apache.spark.{SparkConf, SparkContext} //导入Spark相关的类

object WordCount1 {
  def main(args: Array[String]): Unit = {
    //这里不需要设置setMaster,因为在集群运行时,可以通过 spark-submit 命令的 --master 选项来指定 master URL,而不需要在代码中设置
    val conf: SparkConf = new SparkConf().setAppName("WordCount1") //创建SparkConf对象,设置应用程序名称
    val sc = new SparkContext(conf) //创建SparkContext对象
    val fs = FileSystem.get(sc.hadoopConfiguration) //获取Hadoop文件系统
    val outPutPath = new Path("/result") //设置输出路径
    if (fs.exists(outPutPath)) //如果输出路径已经存在,则删除
      fs.delete(outPutPath,true)
    sc.textFile("/FirstDemo.txt") //读取文本文件
      .flatMap(_.split(" ")) //将每一行按空格分割成单词
      .map((_, 1)) //将每个单词映射为(key, value)对,value为1
      .reduceByKey(_ + _) //按key进行聚合,统计每个单词出现的次数
      .saveAsTextFile("/result") //将结果保存到输出路径
    sc.stop() //停止SparkContext
  }
}

打包

在这里插入图片描述

虚拟机和hdfs

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

提交任务

 spark-submit  --class com.qst.spark.WordCount1  --master yarn  --deploy-mode client /home/project/sparkdemo-1.0-SNAPSHOT.jar

在这里插入图片描述

Yarn端查看

在这里插入图片描述

hdfs端查看

在这里插入图片描述

在这里插入图片描述

命令查看结果

在这里插入图片描述

WorldCount图解

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/429696.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA8的Optional类,还用 != null 判空?

在文章的开头&#xff0c;先说下NPE问题&#xff0c;NPE问题就是&#xff0c;我们在开发中经常碰到的NullPointerException.假设我们有两个类&#xff0c;他们的UML类图如下图所示 在这种情况下&#xff0c;有如下代码 user.getAddress().getProvince(); 这种写法&#xff0c;在…

springboot整合mybatis(idea)

从idea新建项目 选择spring启动* help、mvnw 文件可以删除 springBoot3.0需要的最小JDK是JDK17&#xff0c;当低于17的时候会报错。 改成2.7.6 新建控制层Controller、Mapper层和Model文件夹 必须在springBoot启动项下面新建&#xff0c;不然无法识别。 允许XML进入target…

Java - 泛型

一、什么是泛型&#xff1f; 一般的类和方法&#xff0c;只能使用具体的类型: 要么是基本类型&#xff0c;要么是自定义的类。如果要编写可以应用于多种类型的 代码&#xff0c;这种刻板的限制对代码的束缚就会很大。----- 来源《Java编程思想》对泛型的介绍。 泛型是在JDK1.5…

初次使用yolov8遇到的问题

记录第一次使用yolo8跑自己的数据&#xff1b; 首先将官方文档看一下&#xff0c;大概捉摸了2个小时&#xff0c;地址&#xff1a;GitHub - ultralytics/ultralytics: NEW - YOLOv8 &#x1f680; in PyTorch > ONNX > CoreML > TFLite 获得了基本的一些了解&#x…

$\Beta$分布推导与可视化

$\Gamma$函数 $\Gamma$函数(Gamma函数)是阶乘函数在实数和复数域的扩展。对于正整数$n$&#xff0c;阶乘函数表示为$n! 1 \times 2 \times ... \times n$。然而&#xff0c;这个定义仅适用于正整数。Gamma函数的目的是将阶乘扩展到实数和复数域&#xff0c;从而计算实数和复数…

代码随想录【链表】--->删除倒数第N个节点、链表相交、环形链表

⭐️代码随想录⭐️ 数组篇: 二分查找 移除数组 有序数组的平方 长度最小的数组 螺旋矩阵 链表篇&#xff1a; 链表移除 设计链表 反转链表 交换链表中的节点 文章目录19. 删除链表的倒数第 N 个结点思路代码面试题 02.07. 链表相交思路代码142. 环形链表 II思路判断链表有环确…

ARM 制作简易的根文件系统

一、根文件系统概述 1、为什么需要根文件系统 (1) init 进程这个应用程序&#xff0c;在根文件系统上。 (2) 根文件系统提供了根目录&#xff1a;/。 (3) 内核启动后的应用层配置(/etc 目录)&#xff0c;在根文件系统上。几乎可以认为&#xff1a;发行版 内核 rootfs。 …

Arduino开发之如何连接压力传感器模块?

文章目录0.引言1.压力传感器模块说明2.代码编写3.功能演示0.引言 在利用Arduino开发过程中&#xff0c;若需知道设备能感知到受到外部按压&#xff0c;设备可以通过压力传感器模块来感知周围环境。本文在【Arduino如何进行开发&#xff1f;】基础上&#xff0c;借鉴现有网络资料…

数字营销新宠:探究2023年YouTube网红营销的核心趋势和商业价值

2023年&#xff0c;YouTube网红营销已经成为全球广告营销行业的重要组成部分。YouTube作为全球最大的视频分享平台&#xff0c;每月活跃用户数达到了20亿&#xff0c;其中有超过100万的YouTube网红在平台上分享自己的创意和想法。在这篇文章中&#xff0c;Nox聚星将和大家探讨2…

Visual Studio如何使用Qt开发桌面软件?

文章目录0.引言1.开发环境配置2.编写第一个Qt程序0.引言 笔者熟悉的第一门编程语言是C#&#xff0c;当初本科毕业设计需要进行Qgis的二次开发&#xff0c;本想利用C#编程&#xff0c;但网上资料较少&#xff0c;多是利用Qt进行Qgis的二次开发&#xff0c;Qt是利用C编程&#xf…

如何将aac转化为mp3,4种常用方法

aac是高级音频编码格式之一&#xff0c;支持多声道、解析度高&#xff0c;与mp3相比&#xff0c;aac格式的音质更佳&#xff0c;文件更小。在手机上录音时&#xff0c;保存下来的录音文件通常是AAC格式的。虽然aac格式有很多优点&#xff0c;但是&#xff0c;在不同的设备上&am…

POST请求与GET请求

get和post是HTTP协议中的两种发送请求的方法 HTTP是基于TCP/IP的关于数据如何在万维网中通信的协议 一、get请求与querystring get请求即客户端向server服务端请求数据&#xff0c;如&#xff1a;获取文章列表的分页码等 通过queryString来获取数据&#xff0c;如&#xff1…

设计模式 -- 模板方法模式

前言 月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂) 央是一片海洋,海乃百川,代表着一块海绵(吸纳万物) 泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出) 月央泽,学习的一种过程,从白纸->吸收各种知识->不断输入输出变成自己的内容 希望大家一起坚持这个过程,也同…

java生成随机字符串的方法

今天我们来学习下随机数的生成&#xff0c;随机数就是不确定的数&#xff0c;它可以是任意一个整数或者字符串。下面就让我们一起来学习下随机字符串的生成吧。 首先&#xff0c;我们需要先定义一个名为 str的数组&#xff0c;并将它作为输入文件。 1、使用 Java中的 str作为输…

传播的最大能量场来自私域的裂变——“春生百味”品牌营销裂变活动复盘后记

关于大宗家电等耐用品品牌想要精准触达潜在用户&#xff0c;如何实施传播策略&#xff1f; 刚刚与方太品牌方复盘完3月份“春生百味”关于营销裂变直播活动的整体效果&#xff0c;我们借此次整体案例实施过程的梳理&#xff0c;以分享几个裂变过程中的关键点。 传播的最大能量…

React styled-components(二)—— props、attrs属性

styled-components props、attrs属性propsprops 穿透添加 attrs 属性获取 state 中的样式变量控制样式通过 props 控制样式通过 css 控制样式props props 穿透 styled-components 可以 props 穿透&#xff0c;把属性穿透到元素中。 通常&#xff0c;用 css 的 input 组件实现…

【Python】【进阶篇】十七、Python爬虫实现实时翻译

目录十七、Python爬虫实现实时翻译17.1 JS代码slat与sign17.2 Python代码表示参数17.3 完整程序实现十七、Python爬虫实现实时翻译 YD翻译是以异步方式实现数据加载的&#xff0c;要实现数据抓取&#xff0c;其过程极其繁琐。 上一节《Python爬虫的浏览器实现抓包》&#xff…

使用LeafLet叠加Geoserver wms图层到已有底图的方法

背景 随着现代城市交通建设的飞速发展&#xff0c;各个城市的地铁路线和地铁站点也是越来越多。地铁极大的方便了广大人民的交通出行。作为Giser&#xff0c;经常会遇到需要将一份shp数据在地图上展示&#xff0c;甚至需要在网页端进行浏览的需要。把shp这种空间矢量数据进行we…

数据库笔记Ch04----概念数据库的设计(1)

前三章我们学习了如何使用DBMS我们学会了增删改查&#xff0c;插入数据库&#xff0c;创建视图... 这一章是我们的数据库刚刚建立&#xff0c;只有一个需求&#xff0c;需要根据用户的需求来创建数据库&#xff0c;每个表有哪些属性&#xff0c;参照关系是什么&#xff0c;主键…

一.Jetpack全套

Jetpack全套一.Jetpack介绍1.特性&#xff1a;2.分类&#xff1a;二.应用架构三.LifeCycle:1.简介2.简单使用3.实战&#xff1a;Dialog内存泄漏四.VideModel1.介绍2.简单使用3.AndroidViewModel使用4.使用viewmodel实现fragment直接数据共享五.LiveData1.介绍2.常用方法3.使用场…