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

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 发布!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

获取淘宝商品评论的爬虫技术分享(已封装API,可测试)

item_review-获得淘宝商品评论 公共参数 请求地址: taobao/item_review 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,it…

基于python+vue网络相册设计与实现flask-django-nodejs-php

网络相册设计与实现的目的是让使用者可以更方便的将人、设备和场景更立体的连接在一起。能让用户以更科幻的方式使用产品&#xff0c;体验高科技时代带给人们的方便&#xff0c;同时也能让用户体会到与以往常规产品不同的体验风格。 与安卓&#xff0c;iOS相比较起来&#xff0…

python 函数(解包**、互相调用、作用域、函数的封装、内置函数:eval()、zip()、文件处理open())

函数解包 """ 1、函数的注释&#xff1a;参数和返回值 在注释里可以自动添加显示&#xff0c;只需手动加说明。2、函数的解包【拆包】&#xff1a;函数的参数要传递数据有多个值的时候&#xff0c;中间步骤拿到数据 保存在元组或者列表 或者字典里。 - 传递参数…

机器学习-06-无监督算法-01-划分聚类Kmeans算法

总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍机器学习中无监督算法&#xff0c;包括划分聚类等。 参考 数据分析实战 | K-means算法——蛋白质消费特征分析 欧洲48国英文名称的来龙去脉及其国旗动画 Kmeans在线动态演示 本门课程的目标 完成一个特定行业的…

【C#】使用C#窗体应用开启/停止Apache、MySQL服务

目录 一、前言 二、效果图 三、配置文件 四、代码 五、一键启动/停止所有服务 一、前言 使用C#窗体应用开启Apache、MySQL服务&#xff0c;不仅仅是Apache、MySQL&#xff0c;其他服务也可以使用同样的方法操作&#xff0c;包括开启自己写的脚本服务。 二、效果图 两种状…

短视频矩阵系统--技术实际开发打板3年真实开发分享

短视频矩阵系统--技术实际开发打板3年真实开发分享&#xff0c;短视频矩阵系统/矩阵获客系统是一种基于短视频平台的获客游戏。短视频矩阵系统可以通过多账号发布来替代传统的单账号游戏。可以一键发布所有账号&#xff0c;批量制作多个视频AI智能剪辑。过去很多人只能完成的工…

新版仿蓝奏网盘|城通网盘|百度网盘|闪客网盘|网盘源码系统,个人网盘系统

(购买本专栏可免费下载栏目内所有资源不受限制,持续发布中,需要注意的是,本专栏为批量下载专用,并无法保证某款源码或者插件绝对可用,介意不要购买!购买本专栏住如有什么源码需要,可向博主私信,第二天即可发布!博主有几万资源) 这是一款仿蓝奏网盘、城通网盘、百…

利用CSS3实现正在加载效果

一、代码区域 1.1css3代码 <style>* {padding: 0;margin: 0;list-style: none;}.loading {width: 300px;height: 100px;margin: 100px auto;}.loading ul {height: 100px;width: 65px;margin: 0 auto;display: flex;align-items: center;}.loading ul li {margin: 0 5p…

【XR806开发板试用】使用PWM模块模拟手机呼吸灯提示功能

一般情况下&#xff0c;我们的手机在息屏状态&#xff0c;当收到消息处于未读状态时&#xff0c;会有呼吸灯提醒&#xff0c;这次有幸抽中XR806开发板的试用&#xff0c;经过九牛二虎之力终于将环境搞好了&#xff0c;中间遇到各种问题&#xff0c;在我的另一篇文章中已详细描述…

Nginx 全局块配置 worker 进程的两个指令

1. 前言 熟悉 nginx 运行原理的都知道&#xff0c;nginx 服务启动后&#xff0c;会有一个 master 进程和多个 worker 进程&#xff0c;master 进程负责管理所有的 worker 进程&#xff0c;worker 进程负责处理和接收用户请求 在这里我们所要研究的是 master 进程一定要创建 wo…

后端前行Vue之路(一):初识Vue

1.Vue是什么 Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有项目整合。另一方…

罗格朗逸景PLUS IOT智能系统发布,为您提供更智能的生活体验!

罗格朗全新推出的逸景PLUS IOT智能系统现已正式上市,采用纤薄纯平的设计,功能丰富全面,支持灯光/温度/场景控制、背景音乐等多种功能,整合罗格朗IOT2.0系统,集成可视对讲,为用户打造更舒适、安全的智能生活。 罗格朗智能家居 罗格朗是全球电气与智能建筑系统专家,创立于1865年…

基于Java中的SSM框架实现考研指导平台系统项目【项目源码+论文说明】计算机毕业设计

基于Java中的SSM框架实现考研指导平台系统演示 摘要 应对考研的学生&#xff0c;为了更好的使校园考研有一个更好的环境好好的学习&#xff0c;建议一个好的校园网站&#xff0c;是非常有必要的。提供学生的学习提供一个交流的空间。帮助同学们在学习高数、学习设计、学习统计…

大模型分布式推理ray

一、目录 1 框架 2. 入门 3. 安装教程 4. 相关文档、案例阅读 二、实现 1 框架&#xff1a;Ray&#xff1a;将一个模型拆分到多个显卡中&#xff0c;实现分布式预测、训练等功能。 2. 入门 &#xff1a; 案例&#xff1a;通过ray 实现分布式部署&#xff0c;分布式推理服务。…

FMEA助力新能源汽车行业腾飞:安全、效率双提升

随着新能源汽车市场的迅猛发展&#xff0c;各大车企纷纷加大研发力度&#xff0c;力求在激烈的市场竞争中脱颖而出。其中&#xff0c;FMEA&#xff08;故障模式与影响分析&#xff09;作为一种先进的质量管理工具&#xff0c;正被越来越多地应用于新能源汽车的研发和生产过程中…

学习几个地图组件(基于react)

去年开发时用的公司封装的地图组件&#xff0c;挺方便的&#xff0c;但是拓展性不强&#xff0c;所以看看有哪些优秀的开源地图组件吧 1、React Leaflet 介绍&#xff1a;开源的JavaScript库&#xff0c;用于在web上制作交互式地图&#xff0c;允许你使用React组件的方式在应…

前端使用正则表达式进行校验

一、定义 设计思想是用一种描述性的语言定义一个规则&#xff0c;凡是符合规则的字符串&#xff0c;我们就认为它“匹配”了&#xff0c;否则&#xff0c;该字符串就是不合法的。 在 JavaScript中&#xff0c;正则表达式也是对象&#xff0c;构建正则表达式有两种方式&#x…

如何减少pdf的文件大小?pdf压缩工具介绍

文件发不出去&#xff0c;有时就会耽误工作进度&#xff0c;文件太大无法发送&#xff0c;这应该是大家在发送PDF时&#xff0c;常常会碰到的问题吧&#xff0c;那么PDF文档压缩大小怎么做呢&#xff1f;因此我们需要对pdf压缩后再发送&#xff0c;那么有没有好用的pdf压缩工具…

5、鸿蒙学习-ArkTs的基本组成

说明 自定义变量不能与基础通用属性/事件名重复 装饰器&#xff1a;用于装饰类、结构、方法以及变量&#xff0c;并赋予其特殊含义。如上述示例中Entry、Component和State都是装饰器&#xff0c;Component表示自定义组件&#xff0c;Entry表示该自定义组件为入口组件&#xff…