01-Spark的Local模式与应用开发入门

news2024/11/18 19:46:34

1 Spark 的 local 模式

Spark 运行模式之一,用于在本地机器上单机模拟分布式计算的环境。在 local 模式下,Spark 会使用单个 JVM 进程来模拟分布式集群行为,所有 Spark 组件(如 SparkContext、Executor 等)都运行在同一个 JVM 进程中,不涉及集群间通信,适用本地开发、测试和调试。

1.1 重要特点和使用场景

  1. 本地开发和测试:在开发 Spark 应用程序时,可以使用 local 模式进行本地开发和测试。这样可以避免连接到集群的开销,加快开发迭代速度。同时,可以模拟集群环境中的作业执行流程,验证代码逻辑和功能。
  2. 单机数据处理:对于较小规模的数据处理任务,例如处理数百兆或数个 GB 的数据,可以使用 local 模式进行单机数据处理。这样可以充分利用本地机器的资源,快速完成数据处理任务。
  3. 调试和故障排查:在调试和故障排查过程中,使用 local 模式可以更方便地查看日志、变量和数据,加快发现和解决问题的速度。可以在本地环境中模拟各种情况,验证代码的健壮性和可靠性。
  4. 教学和学习:对于 Spark 的初学者或教学场景,local 模式提供了一个简单直观的学习环境。学习者可以在本地环境中快速运行 Spark 应用程序,理解 Spark 的基本概念和工作原理。

1.2 使用 local 模式

设置 SparkConf 中的 spark.master 属性为 "local" 来指定运行模式。如Scala中这样设置:

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

object SparkLocalExample {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("SparkLocalExample").setMaster("local")
    val sc = new SparkContext(conf)

    // 在这里编写你的 Spark 应用程序逻辑

    sc.stop()  // 停止 SparkContext
  }
}

1.3 注意

local 模式仅适用于小规模数据处理和本地开发测试场景,并不适用于生产环境的大规模数据处理任务。在生产环境中,需要使用集群模式(如 standalone、YARN、Mesos 等)来运行 Spark 应用程序,以便充分利用集群资源和提高作业的并行度。

2 Spark应用开发

2.1 SparkContext

通常一个 Spark 程序对应一个 SparkContext 实例。SparkContext 是 Spark 应用程序的主入口点,负责与集群进行通信,管理作业的调度和执行,以及维护应用程序的状态。因此,一个 SparkContext 实例通常对应一个独立的 Spark 应用程序。

在正常情况下,创建多个 SparkContext 实例是不推荐的,因为这可能会导致资源冲突、内存泄漏和性能下降等问题。Spark 本身设计为单个应用程序对应一个 SparkContext,以便于有效地管理资源和执行作业。

然而,在某些特殊情况下,可能会存在多个 SparkContext 实例的情况:

  1. 测试和调试:在测试和调试阶段,有时会创建额外的 SparkContext 实例来模拟不同的场景或测试不同的配置。这样可以更好地理解 Spark 应用程序的行为和性能,以便进行优化和调整。
  2. 交互式环境:在交互式环境下(如 Spark Shell、Jupyter Notebook 等),有时会创建多个 SparkContext 实例来进行实验、测试或不同的作业执行。这些 SparkContext 实例可能是由不同的用户或会话创建的,用于并行执行不同的任务或查询。
  3. 多应用程序共享资源:在同一个集群上运行多个独立的 Spark 应用程序,并且它们需要共享同一组集群资源时,可能会创建多个 SparkContext 实例来管理各自的作业和资源。这种情况下,需要确保各个应用程序的 SparkContext 实例能够正确地管理资源,避免资源冲突和竞争。

创建多个 SparkContext 实例时需要谨慎处理,并且需要确保它们能够正确地管理资源、避免冲突,并且不会影响其他应用程序或作业的正常运行。在生产环境中,建议仅使用一个 SparkContext 实例来管理整个应用程序。

SparkContext是Spark应用的入口点,负责初始化Spark应用所需要的环境和数据结构。

2.2 运行一个Spark应用的步骤

  • 创建SparkContext,这会初始化Spark应用环境、资源和驱动程序
  • 通过SparkContext 创建RDD、DataFrame和Dataset
  • 在RDD、DataFrame和Dataset上进行转换和行动操作
  • 关闭SparkContext来关闭Spark应用

所以,一个标准的Spark应用对应一个SparkContext实例。通过创建SparkContext来开始我们的程序,在其上执行各种操作,并在结束时关闭该实例。

3 案例

3.1 测试数据文件

input.txt

JavaEdge,JavaEdge,JavaEdge
go,go
scalascala

3.2 代码

package com.javaedge.bigdata.chapter02

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

/**
 * 词频统计案例
 * 输入:文件
 * 需求:统计出文件中每个单词出现的次数
 * 1)读每一行数据
 * 2)按照分隔符把每一行的数据拆成单词
 * 3)每个单词赋上次数为1
 * 4)按照单词进行分发,然后统计单词出现的次数
 * 5)把结果输出到文件中
 * 输出:文件
 */
object SparkWordCountApp {

  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf()
    val sc = new SparkContext(sparkConf)
    val rdd = sc.textFile("/Users/javaedge/Downloads/sparksql-train/data/input.txt")
    rdd.collect().foreach(println)
    sc.stop()
}

发现启动后,报错啦:

ERROR SparkContext: Error initializing SparkContext.
org.apache.spark.SparkException: A master URL must be set in your configuration
    at org.apache.spark.SparkContext.<init>(SparkContext.scala:368)
    at com.javaedge.bigdata.chapter02.SparkWordCountApp$.main(SparkWordCountApp.scala:25)
    at com.javaedge.bigdata.chapter02.SparkWordCountApp.main(SparkWordCountApp.scala)
ERROR Utils: Uncaught exception in thread main

必须设置集群?我才刚入门大数据诶,这么麻烦?劝退,不学了!还好 spark 也支持简单部署:

val sparkConf = new SparkConf().setMaster("local")

重启,又报错:

ERROR SparkContext: Error initializing SparkContext.
org.apache.spark.SparkException: An application name must be set in your configuration
    at org.apache.spark.SparkContext.<init>(SparkContext.scala:371)
    at com.javaedge.bigdata.chapter02.SparkWordCountApp$.main(SparkWordCountApp.scala:25)
    at com.javaedge.bigdata.chapter02.SparkWordCountApp.main(SparkWordCountApp.scala)
ERROR Utils: Uncaught exception in thread main
val sparkConf = new SparkConf().setMaster("local").setAppName("SparkWordCountApp")

成功了!

val rdd = sc.textFile("/Users/javaedge/Downloads/sparksql-train/data/input.txt")
rdd.flatMap(_.split(","))
  .map(word => (word, 1)).collect().foreach(println)
sc.stop()


output:
(pk,1)
(pk,1)
(pk,1)
(jepson,1)
(jepson,1)
(xingxing,1)

3.3 输出到文件

rdd.flatMap(_.split(","))
  // 3)每个单词赋上次数为1
  .map(word => (word, 1))
  .reduceByKey(_ + _)
  .saveAsTextFile("/Users/javaedge/Downloads/sparksql-train/data/output.txt")

3.4 按频率降序排

// 2)按照分隔符把每一行的数据拆成单词
rdd.flatMap(_.split(","))
  // 3)每个单词赋上次数为1
  .map(word => (word, 1))
  // 4)按照单词进行分发,然后统计单词出现的次数
  .reduceByKey(_ + _)
  // 结果按单词频率降序排列,既然之前是 <单词,频率> 且 sortKey 只能按 key 排序,那就在这里反转 kv 顺序
  .map(x => (x._2, x._1))
  .collect().foreach(println)

output:
(2,go)
(1,scalascala)
(3,JavaEdge)

显然结果不符合期望。如何调整呢?再翻转一次!

rdd.flatMap(_.split(","))
  .map(word => (word, 1))
  .reduceByKey(_ + _)
  // 结果按单词频率降序排列,既然之前是 <单词,频率> 且 sortKey 只能按 key 排序,那就在这里反转 kv 顺序
  .map(x => (x._2, x._1))
  .sortByKey(false)
  .map(x => (x._2, x._1))
  .collect().foreach(println)

output:
(JavaEdge,3)
(go,2)
(scalascala,1)

4 spark-shell启动

javaedge@JavaEdgedeMac-mini bin % ./spark-shell --master local
23/03/23 16:28:58 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Spark context Web UI available at http://172.16.1.55:4040
Spark context available as 'sc' (master = local, app id = local-1679560146321).
Spark session available as 'spark'.
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 2.4.3
      /_/

Using Scala version 2.11.12 (OpenJDK 64-Bit Server VM, Java 1.8.0_362)
Type in expressions to have them evaluated.
Type :help for more information.

scala>

4 通过YARN提交任务

$ ./spark-submit --master yarn \
  --deploy-mode client \
  --class <main_class> \
  --num-executors <num_executors> \
  --executor-memory <executor_memory> \
  --executor-cores <executor_cores> \
  <path_to_jar_or_py_file> \
  <app_arguments>

各参数含义:

  • --master yarn: 指定使用YARN作为Spark的资源管理器。
  • --deploy-mode client: 指定部署模式为client模式,即Driver程序运行在提交Spark任务的客户端机器上。
  • --class <main_class>: 指定Spark应用程序的主类。
  • --num-executors <num_executors>: 指定执行器的数量。
  • --executor-memory <executor_memory>: 指定每个执行器的内存大小。
  • --executor-cores <executor_cores>: 指定每个执行器的核心数。
  • <path_to_jar_or_py_file>: 指定要提交的Spark应用程序的JAR文件或Python文件的路径。
  • <app_arguments>: 指定Spark应用程序的参数。

如提交一个Scala版本的Spark应用程序的命令:

$ ./spark-submit --master yarn \
  --deploy-mode client \
  --class com.example.MySparkApp \
  --num-executors 4 \
  --executor-memory 2G \
  --executor-cores 2 \
  /path/to/my-spark-app.jar \
  arg1 arg2 arg3

如果你要提交一个Python版本的Spark应用程序,可以使用以下命令:

$ ./spark-submit --master yarn \
  --deploy-mode client \
  /path/to/my-spark-app.py \
  arg1 arg2 arg3

这样就可以通过YARN提交Spark任务,Spark会向YARN请求资源并在集群上执行任务。

关注我,紧跟本系列专栏文章,咱们下篇再续!

作者简介:魔都技术专家兼架构,多家大厂后端一线研发经验,各大技术社区头部专家博主。具有丰富的引领团队经验,深厚业务架构和解决方案的积累。

负责:

  • 中央/分销预订系统性能优化

  • 活动&优惠券等营销中台建设

  • 交易平台及数据中台等架构和开发设计

  • 车联网核心平台-物联网连接平台、大数据平台架构设计及优化

    目前主攻降低软件复杂性设计、构建高可用系统方向。

参考:

  • 编程严选网

    本文由博客一文多发平台 OpenWrite 发布!

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

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

相关文章

@EnableConfigurationProperties注解使用

前言 当我们想把配置的内容,动态赋值到某个配置类上的时候,可以使用EnableConfigurationProperties ConfigurationProperties注解 代码准备 创建配置文件prop.properties nameada age18 email123qq.com 创建配置类 ComponentScan("com.test.pops") PropertySo…

nacos-config实现配置中心功能

快速开始 | Spring Cloud Alibaba 官方的demo照着做了一遍&#xff0c;走不通&#xff0c;报各种错误&#xff0c;所以自己搞一个。 jdk版本及安装 因为用的nacos是2022.0.0.0-RC2版本的&#xff0c;要求jdk为jdk21 Java Downloads | Oracle 下载并安装jdk21&#xff0c;重…

异步任务 - 1

Thread Runnable - run function Jdk - 1.5之后 Callable - 范型 其实就是方法的返回值 阻塞等待 线程池 异步非常多 内存是有限的 业务代码内 - 启动线程的方式都不能用 - 会导致资源耗尽 将所有的多线程异步任务都交给线程池进行 - 资源控制 高并发系统 - 线程池 整…

代码随想录算法训练营 DAY 17 | 110.平衡二叉树 257.二叉树的所有路径 404.左叶子之和

110.平衡二叉树 平衡二叉树的定义&#xff1a;任何节点的左右子树高度差绝对值不超过1 空树也是AVL! 确定遍历顺序&#xff1a; 求高度用后序&#xff0c;求深度用前序。&#xff08;取决于需不需要从下往上返回结果&#xff09; 先判断它是不是平衡二叉树 如果是就返回 如…

图论07-被包围的区域(Java)

7.被包围的区域 题目描述 给你一个 m x n 的矩阵 board &#xff0c;由若干字符 X 和 O &#xff0c;找到所有被 X 围绕的区域&#xff0c;并将这些区域里所有的 O 用 X 填充。 示例 1&#xff1a; 输入&#xff1a;board [["X","X","X",&qu…

【进程概念】进程状态以及僵尸进程(结合代码)

文章目录 进程状态实验观察进程的各个状态动态监视进程的脚本代码样本1&#xff1a;观察S&#xff08;浅度睡眠&#xff09;状态代码样本2&#xff1a;观察R(运行)状态发送kill -19 信号 观察T&#xff08;暂停&#xff09;状态&#xff1a;调试代码&#xff0c;观察t&#xff…

原型、原型链

如图&#xff1a; 判断对错&#xff1a; Q1:在JS 中 proto 和 constructor 属性是对象和函数都有的属性 prototype属性仅是函数对象所独有的。 由于JavaScript中一切皆对象,即函数对象也是一种对象,所以函数也拥有__proto__和constructor属性。 Q2:通过 proto 属性来连接对象…

MOSDANET

# in the figure refers to the first term of Equation 1 辅助信息 作者未提供代码

2024年【山东省安全员C证】免费试题及山东省安全员C证作业考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 山东省安全员C证免费试题根据新山东省安全员C证考试大纲要求&#xff0c;安全生产模拟考试一点通将山东省安全员C证模拟考试试题进行汇编&#xff0c;组成一套山东省安全员C证全真模拟考试试题&#xff0c;学员可通过…

Python中的环境管理与虚拟环境的使用【第148篇—虚拟环境】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Python中的环境管理与虚拟环境的使用 在Python开发中&#xff0c;环境管理是至关重要的一环…

【CKA模拟题】学会JSONPath,精准定位Pod信息!

题干 For this question, please set this context (In exam, diff cluster name) kubectl config use-context kubernetes-adminkubernetesyou have a script named pod-filter.sh . Update this script to include a command that filters and displays the label with the…

轻松去除视频号水印:高效下载无痕视频教程

短视频已经成为了我们获取知识、娱乐消遣的主要途径之一。而视频号作为一个新兴的短视频平台&#xff0c;凭借其丰富的内容和便捷的操作界面&#xff0c;吸引了大量用户的关注。然而&#xff0c;有时候我们想要保存自己喜欢的视频&#xff0c;却发现视频上带有水印&#xff0c;…

蓝桥杯2023省赛:蜗牛|DFS暴力、DP动态规划

题目链接&#xff1a; 1.蜗牛 - 蓝桥云课 (lanqiao.cn) 思路说明&#xff1a; 首先&#xff0c;考虑DFS暴力解&#xff1a;对于蜗牛来说&#xff0c;它出发的起点可能是&#xff1a; 1、Xi竹竿底部2、从上一根杆Xi-1传送门传送到的bi&#xff0c; 那么他有三种方式走&…

vue2源码学习01配置rollup打包环境

1.下载rollup相关依赖 npm i rollup rollup-plugin-babel babel/core babel/preset-env --save-dev 2.新建rollup.config.js配置打包选项 //rollup可以导出一个对象&#xff0c;作为打包的配置文件 import babel from rollup-plugin-babel export default {input: ./src/ind…

【Linux】/proc文件系统

&#x1f525;博客主页&#xff1a;PannLZ &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 文章目录 /proc文件系统1.获取与进程相关的信息:/proc/ID2./proc 目录下的系统信息3. 访问/proc 文件4.动态创建/proc文件系统4.1创建目录4.2创建proc…

程序设计语言与C语言发展

我们今天开始 来讲 C语言 程序设计 首先 我们来看一下 它的课程地位 对于 计算机科学等相关专业 我们这样安排 第一学期 学习 C语言基础 第二学期 学习 C语言程序进阶 第三学期 学习 一门面向对象语言 例如 java c python等 第四学期 学习 数据结果 第五学期 操作系统 最后 学…

【教程】PLSQL查看表属性乱码解决方法

一、前言 PL/SQL是Oracle数据库的编程语言&#xff0c;用于编写存储过程、触发器、函数等。 今天用plsql想查看表的属性&#xff0c;看看各个字段的注释&#xff0c;可是打开一看&#xff0c;居然是乱码的&#xff0c;如下面这样 如果在使用PL/SQL查看表属性时出现乱码&…

(一)基于IDEA的JAVA基础5

Scanner的使用 使用scanner可以接收键盘上输入的数据&#xff0c; Scanner inputnew Scanner(System.in)&#xff1b; 导包的方式: 什么是导包&#xff0c;导入的是jdk提供的java开发工具包&#xff0c;我们建一个java文件&#xff0c;psvm快捷输入后&#xff0c;打上new S…

预约陪诊APP定制开发方案以及流程详解

随着医疗行业的快速发展&#xff0c;越来越多的人开始关注自己的健康问题。然而&#xff0c;在看病的过程中&#xff0c;很多人都会感到孤独和无助。为了解决这个问题&#xff0c;许多医疗机构和企业推出了预约陪诊APP,旨在为用户提供一个安全、便捷的陪伴服务。本文将详细介绍…

基于Java的厦门旅游电子商务预订系统(Vue.js+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 景点类型模块2.2 景点档案模块2.3 酒店管理模块2.4 美食管理模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 学生表3.2.2 学生表3.2.3 学生表3.2.4 学生表 四、系统展示五、核心代码5.1 新增景点类型5.2 查询推荐的…