当前位置: 首页 > 知识库问答 >
问题:

为什么在火花中提取参数到局部变量被认为是更安全的?

卢宜然
2023-03-14

我在《学习火花:闪电般的大数据分析》一书中看到了这个例子:

class SearchFunctions(val query: String) {
 // more methods here
 def getMatchesNoReference(rdd: RDD[String]): RDD[String] = {
 // Safe: extract just the field we need into a local variable
 val query_ = this.query
 rdd.map(x => x.split(query_))
 }
}

我的问题是——评论说:安全:将我们需要的字段提取到局部变量中

为什么提取到局部变量比使用字段(定义为val)本身更安全?

共有3个答案

糜俊彦
2023-03-14

由于其他答案没有提到它:它更安全的另一个原因是因为您引用的字段/方法的类可能无法序列化。由于Java不允许在编译时检查它,因此您会遇到运行时失败。在StackOverflow上有很多此类问题的示例:我发现的前几个是任务不可序列化:java.io.NotSerializableException在闭包之外调用函数时仅对类而不是对象,SparkContext在同伴对象内不可序列化,在不引起序列化问题的情况下丰富SparkContext,Spark序列化错误。搜索火花NotSerializableException应该会给你更多,当然不仅仅是在Stack Overflow上。

或者它现在可以序列化,但显然不相关的更改(例如添加lambda不使用的字段)可能会使代码不可序列化或显著降低性能,从而破坏代码。

微生季
2023-03-14

因为当你只提取查询时必须被序列化并发送给工作人员。

如果您没有提取,将发送SearchFunctions的完整实例。

彭浩穰
2023-03-14

Spark中的传递函数非常有用,并且可以回答您的问题。

其想法是,您只希望将查询传递给需要它的工作人员,而不是(类的)整个对象。

如果您没有这样做(如果您使用的是map()中的字段,而不是局部变量),那么:

...发送包含该类的对象以及方法。以类似的方式,访问外部对象的字段将引用整个对象

请注意,这也更安全,而不仅仅是更高效,因为它最大限度地减少了内存使用。

你看,当处理真正的大数据时,你的工作将面临内存限制,如果超过了这些限制,它将被资源管理器(例如,Thread)杀死,因此我们希望确保使用尽可能少的内存,以确保我们的工作能够成功,而不会失败!

此外,大对象将导致更大的通信开销。当通信规模过大时,对等方可能会重置TCP连接,这将调用不必要的开销,我们希望避免这种情况,因为通信不好也是作业失败的原因之一。

 类似资料:
  • 这是我写的一个脚本的摘录: 我的一个同事说,这里使用全局变量是不好的。 我可以看出这有多么不方便,因为我必须先使用,然后才能将其递增1。 但是为什么使用全局被认为是糟糕的编程呢? 如果这是一个非常明显的问题,我很抱歉,我对Python相对陌生,并试图尽可能多地理解事物。

  • 问题内容: 编辑:在上面的链接中回答的问题。 不,PHP中的“全局”与其他语言中的“全局”不同,尽管它不引入任何安全性问题,但会使其他人较难理解该代码。 OP: 项目摘要-我正在编写一个Web CMS,以使自己熟悉PHP / MySQL。为了分解代码,我对以下基本层/模块有一个概念: 数据 -MySQL表 -PHP变量 功能 -SQL- 获取/设置/等 -前端-显示页面 -后端-管理器 演示文稿

  • 问题内容: 我是一位Java程序员,对公司领域来说是新手。最近,我已经使用Groovy和Java 开发了一个应用程序。我编写的所有代码都使用了大量的静态变量。高级技术人员要求我减少使用的静电数量。我已经在谷歌上搜索了相同的内容,并且发现许多程序员都反对使用静态变量。 我发现静态变量更易于使用。而且我认为它们也是有效的(如果我错了,请纠正我),因为如果我必须对一个类中的一个函数进行10,000次调用

  • 问题内容: 为什么全局变量是不好的?[closed] 问题答案: 这与Python无关。全局变量在任何编程语言中都是不好的。 但是,全局常量在概念上与全局变量并不相同。全局常数完全无害。只是在Python中没有强制性差异,只有约定是。 它们不好的原因是它们使函数具有隐藏的(非显而易见的,令人惊讶的,难以检测的)副作用,从而导致复杂性的增加,并有可能导致产生Spaghetti代码。 但是,即使在函数

  • 问题内容: 我正在使用函数,这样我的程序就不会一团糟,但我不知道如何将局部变量变成全局变量。 问题答案: 这是两种实现相同目的的方法: 使用参数并返回(推荐) 运行时,将获得以下输出 使用全局变量(永远不要这样做) 现在您将获得: