我在《学习火花:闪电般的大数据分析》一书中看到了这个例子:
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
)本身更安全?
由于其他答案没有提到它:它更安全的另一个原因是因为您引用的字段/方法的类可能无法序列化。由于Java不允许在编译时检查它,因此您会遇到运行时失败。在StackOverflow上有很多此类问题的示例:我发现的前几个是任务不可序列化:java.io.NotSerializableException在闭包之外调用函数时仅对类而不是对象,SparkContext在同伴对象内不可序列化,在不引起序列化问题的情况下丰富SparkContext,Spark序列化错误。搜索火花NotSerializableException
应该会给你更多,当然不仅仅是在Stack Overflow上。
或者它现在可以序列化,但显然不相关的更改(例如添加lambda不使用的字段)可能会使代码不可序列化或显著降低性能,从而破坏代码。
因为当你只提取查询时
必须被序列化并发送给工作人员。
如果您没有提取,将发送SearchFunctions
的完整实例。
Spark中的传递函数非常有用,并且可以回答您的问题。
其想法是,您只希望将查询传递给需要它的工作人员,而不是(类的)整个对象。
如果您没有这样做(如果您使用的是map()
中的字段,而不是局部变量),那么:
...发送包含该类的对象以及方法。以类似的方式,访问外部对象的字段将引用整个对象
请注意,这也更安全,而不仅仅是更高效,因为它最大限度地减少了内存使用。
你看,当处理真正的大数据时,你的工作将面临内存限制,如果超过了这些限制,它将被资源管理器(例如,Thread)杀死,因此我们希望确保使用尽可能少的内存,以确保我们的工作能够成功,而不会失败!
此外,大对象将导致更大的通信开销。当通信规模过大时,对等方可能会重置TCP连接,这将调用不必要的开销,我们希望避免这种情况,因为通信不好也是作业失败的原因之一。
谁能告诉我。
这是我写的一个脚本的摘录: 我的一个同事说,这里使用全局变量是不好的。 我可以看出这有多么不方便,因为我必须先使用,然后才能将其递增1。 但是为什么使用全局被认为是糟糕的编程呢? 如果这是一个非常明显的问题,我很抱歉,我对Python相对陌生,并试图尽可能多地理解事物。
问题内容: 编辑:在上面的链接中回答的问题。 不,PHP中的“全局”与其他语言中的“全局”不同,尽管它不引入任何安全性问题,但会使其他人较难理解该代码。 OP: 项目摘要-我正在编写一个Web CMS,以使自己熟悉PHP / MySQL。为了分解代码,我对以下基本层/模块有一个概念: 数据 -MySQL表 -PHP变量 功能 -SQL- 获取/设置/等 -前端-显示页面 -后端-管理器 演示文稿
问题内容: 我是一位Java程序员,对公司领域来说是新手。最近,我已经使用Groovy和Java 开发了一个应用程序。我编写的所有代码都使用了大量的静态变量。高级技术人员要求我减少使用的静电数量。我已经在谷歌上搜索了相同的内容,并且发现许多程序员都反对使用静态变量。 我发现静态变量更易于使用。而且我认为它们也是有效的(如果我错了,请纠正我),因为如果我必须对一个类中的一个函数进行10,000次调用
问题内容: 为什么全局变量是不好的?[closed] 问题答案: 这与Python无关。全局变量在任何编程语言中都是不好的。 但是,全局常量在概念上与全局变量并不相同。全局常数完全无害。只是在Python中没有强制性差异,只有约定是。 它们不好的原因是它们使函数具有隐藏的(非显而易见的,令人惊讶的,难以检测的)副作用,从而导致复杂性的增加,并有可能导致产生Spaghetti代码。 但是,即使在函数
问题内容: 我正在使用函数,这样我的程序就不会一团糟,但我不知道如何将局部变量变成全局变量。 问题答案: 这是两种实现相同目的的方法: 使用参数并返回(推荐) 运行时,将获得以下输出 使用全局变量(永远不要这样做) 现在您将获得: