Spark如何处理对象

2023-11-24

为了测试 Spark 中的序列化异常,我用两种方式编写了一个任务。
第一种方式:

package examples
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext

object dd {
  def main(args: Array[String]):Unit = {
    val sparkConf = new SparkConf
    val sc = new SparkContext(sparkConf)

    val data = List(1,2,3,4,5)
    val rdd = sc.makeRDD(data)
    val result = rdd.map(elem => {
      funcs.func_1(elem)
    })        
    println(result.count())
  }
}

object funcs{
  def func_1(i:Int): Int = {
    i + 1
  }
}

这样 Spark 的效果就非常好。
当我将其更改为以下方式时,它不起作用并抛出 NotSerializedException。
第二种方式:

package examples
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext

object dd {
  def main(args: Array[String]):Unit = {
    val sparkConf = new SparkConf
    val sc = new SparkContext(sparkConf)

    val data = List(1,2,3,4,5)
    val rdd = sc.makeRDD(data)

    val handler = funcs
    val result = rdd.map(elem => {
      handler.func_1(elem)
    })

    println(result.count())

  }
}

object funcs{
  def func_1(i:Int): Int = {
    i + 1
  }
}

我知道我收到错误“任务不可序列化”的原因是因为我试图发送不可序列化的对象funcs在第二个示例中从驱动程序节点到工作程序节点。对于第二个例子,如果我创建对象funcs extend Serializable,这个错误就会消失。

但在我看来,因为funcs是一个对象而不是类,它是一个单例,应该被序列化并从驱动程序发送到工作人员,而不是在工作人员节点本身内实例化。在这种情况下,虽然使用对象的方式funcs是不同的,我猜是不可序列化的对象funcs在这两个示例中,都是从驱动程序节点传送到工作程序节点。

我的问题是为什么第一个示例可以成功运行,但第二个示例失败并出现“任务不可序列化”异常。


当您在 RDD 闭包(映射、过滤器等)中运行代码时,执行该代码所需的所有内容都将被打包、序列化并发送到执行器来运行。任何被引用的对象(或其字段被引用)都将在此任务中序列化,有时您会在此处获得NotSerializableException.

不过,您的用例有点复杂,并且涉及 scala 编译器。通常,在 scala 对象上调用函数相当于调用 java 静态方法。该对象从未真正存在过——它基本上就像内联编写代码一样。但是,如果将对象分配给变量,那么实际上是在内存中创建对该对象的引用,并且该对象的行为更像是类,并且可能存在序列化问题。

scala> object A { 
  def foo() { 
    println("bar baz")
  }
}
defined module A

scala> A.foo()  // static method
bar baz

scala> val a = A  // now we're actually assigning a memory location
a: A.type = A$@7e0babb1

scala> a.foo()  // dereferences a before calling foo
bar baz
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spark如何处理对象 的相关文章

随机推荐

  • C++ 中的 sizeof 运算符是如何实现的?

    有人可以向我指出 sizeof 运算符在 C 中的实现以及有关其实现的一些描述吗 sizeof 是不能重载的运算符之一 那么这意味着我们无法更改其默认行为 sizeof不是 C 中的真正运算符 它只是插入一个等于参数大小的常量的特殊语法 s
  • Python 中匹配非空白的正则表达式

    我想用研究提取第一组非空白字符 我有以下伪脚本来重现我的问题 usr bin env python2 7 import re line STARC 1 1 1 5 ConsCase WARNING Warning m re search S
  • C++,根据一个向量对另一个向量进行排序[重复]

    这个问题在这里已经有答案了 我得到的最好的例子是我想根据分数对名称进行排序 vector
  • R 缺少哪些其他语言有的调试工具? [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我熟悉browser trace traceback and options error
  • .NET HttpWebRequest 速度与浏览器

    我有一个关于 Net HttpWebRequest 客户端 或 WebClient 给出类似结果 性能的问题 如果我使用 HttpWebRequest 请求 html 页面 在本例中为 news bbc co uk 并分析应用程序读取响应的
  • 为什么设置 document.domain 不能允许对父域的 AJAX 请求?

    我有两个文件 domain com test2 php div div 和domain com test3 php b var1 var2 b 在本例中 domain com test2 php 输出var1 1 var2 2正如人们所期望
  • 固定长度和类型文字的列表

    我正在尝试在 Haskell 中定义固定长度列表的类型 当我使用标准方法将自然数编码为一元类型时 一切正常 然而 当我尝试在 GHC 的类型文字上构建所有内容时 我遇到了很多问题 我第一次尝试所需的列表类型是 data List n Nat
  • 无法捕获 DataIntegrityViolationException

    我使用 Spring Boot 2 和 spring boot starter data jpa 以及底层 MariaDB 我有一个带有唯一键 用户名 的表 我想抓住DataIntegrityViolationException如果违反了这
  • PHP 扩展对 docker-compose 中的 Composer 容器不可用

    我使用 docker compose 并在一个项目中拥有多个容器 Nginx PHP Composer 和 nginx 一切都很好 除了一件事 作曲家不工作 我正在尝试安装一个使用 GD 扩展的作曲家项目 该项目安装在 PHP 中 在 PH
  • 为什么 getOAuthAccessToken 方法总是在 twitter4j api 中引发异常?

    我正在按照大量说明从我的应用程序中创建一条简单的推文 我已经在 Twitter 上注册了 但我就是无法发推文 我可以登录 但无法更新我的状态 这是登录代码 private void twitterLogOn Twitter twitter
  • Android Studio pm 安装中止

    我试图从 android studio 在我的 GS5 上运行一个应用程序 我得到了这个 Waiting for device Target device samsung sm g900v f3af9744 Uploading file l
  • 为什么 [].append() 在 python 中不起作用? [复制]

    这个问题在这里已经有答案了 为什么这有效 a a append 4 print a 但这并不 print append 4 第二种情况的输出是None 你能解释一下输出吗 The append方法没有返回值 它会就地更改列表 并且由于您没有
  • Flutter:使用自定义 ErrorWidget

    有没有办法显示 在生产中 自定义错误小部件而不是死机红屏 我不会更改框架代码 而且即使我们尝试无错误地编程 我们也不能保证它会发生 可以通过更改来更改默认错误渲染ErrorWidget builder ErrorWidget builder
  • Google Analytics 缺少 __utmz cookie

    我在我的网站上安装了通用分析 并且想要解析 utmzcookie 来获取推荐信息 然而 我从未见过这个饼干集 有什么改变吗 有什么原因没有设置吗 我确实看到了 ga当我浏览我的网站时 我会看到 cookie utmzcookie 在我的浏览
  • Python找不到本地模块

    我有一个这样的文件夹结构 setup py core init py interpreter py tests init py test ingest py 如果我尝试导入core in test ingest py运行它 我得到一个Imp
  • 如何判断 onCreate firebase 云函数中的用户是否为“匿名”?

    在我的里面onCreatefirebase 处理程序的 auth 云函数 我如何判断用户是否是匿名的 例如这isAnonymous我在客户端获得的财产onAuthStateChanged or onIdTokenChanged回复 expo
  • URL 中的 # 是什么意思以及如何使用它?

    我经常发现一些如下所示的 URL www something com some page someword 编写此页面后 some page 将打开 然后设置滚动 以便我可以看到 someword 在我的屏幕开头 我不知道 是什么意思 我一
  • GetAdornerLayer 神秘地返回 null

    我一直在我的应用程序的多个版本中使用相同的代码 没有任何问题 但我现在神秘地收到NullRerefenceException具有以下内容 this Loaded delegate deleteBrush new DeleteBrushAdo
  • 如何重置SA密码?

    到底如何重置sa密码 我知道如何进入对话框并重置密码 这就是我现在要问的 它的运行比单击 单击 新密码更深入一点 完成 我不知道SA密码是什么 这台机器的先前用户也没有 之前的用户说他从未在这台机器上运行过 SQL Express 当我尝试
  • Spark如何处理对象

    为了测试 Spark 中的序列化异常 我用两种方式编写了一个任务 第一种方式 package examples import org apache spark SparkConf import org apache spark SparkC