内容简介:Spark踩坑之App闭包Null Pointer问题
昨天踩了 App子类闭包问题 ,刚开始用Spark 2.1的DataSet相关API,误以为是使用的姿势不正确,定位问题的方向不对,浪费了好多时间调试。后来改回成DataFrame API,问题得到了快速定位。因为这个bug在DataSet闭包中,使用broadcast的value不会报错,程序可以顺利执行;而在DataFrame闭包中,调用broadcast的value,会抛出null pointer异常。
看看下面的例子,
object DemoBug extends App { val conf = new SparkConf() val sc = new SparkContext(conf) val rdd = sc.parallelize(List("A","B","C","D")) val str1 = "A" val rslt1 = rdd.filter(x => { x != "A" }).count val rslt2 = rdd.filter(x => { str1 != null && x != "A" }).count println("DemoBug: rslt1 = " + rslt1 + " rslt2 = " + rslt2) }
输出内容
DemoBug: rslt1 = 3 rslt2 = 0
根据输出,说明变量 str1 并没有正确的传到 rdd 的闭包filter中。如果将App换成main,可以得到期望的结果。
object DemoBug { def main(args:Array[String]) = { val conf = new SparkConf() val sc = new SparkContext(conf) val rdd = sc.parallelize(List("A","B","C","D")) val str1 = "A" val rslt1 = rdd.filter(x => { x != "A" }).count val rslt2 = rdd.filter(x => { str1 != null && x != "A" }).count println("DemoBug: rslt1 = " + rslt1 + " rslt2 = " + rslt2) } }
输出内容
DemoBug: rslt1 = 3 rslt2 = 3
根据 spark官方bug 反馈,此问题已经解决了,但是实际来看还是没有解决。所以还是乖乖使用main吧!
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- go语言闭包问题
- JavaScript循环出现的问题——用闭包来解决
- 草根学Python(十五) 闭包(解决一个需求了解闭包流程)
- [原]谈一谈闭包
- Java闭包如何工作
- 理解 JavaScript 闭包
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
安全测试指南(第4版)
OWASP基金会 / 电子工业出版社 / 2016-7-1 / CNY 89.00
软件安全问题也许是这个时代面临的*为重要的技术挑战。Web应用程序让业务、社交等网络活动飞速发展,这同时也加剧了它们对软件安全的要求。我们急需建立一个强大的方法来编写和保护我们的互联网、Web应用程序和数据,并基于工程和科学的原则,用一致的、可重复的和定义的方法来测试软件安全问题。本书正是实现这个目标的重要一步,作为一本安全测试指南,详细讲解了Web应用测试的“4W1H”,即“什么是测试”、“为什......一起来看看 《安全测试指南(第4版)》 这本书的介绍吧!