Spark Streaming读取本地文件报NullPointerException问题求助
我之前在OS X环境下跑Spark Streaming也碰到过类似的坑,结合你描述的情况(spark-shell能正常读但IntelliJ跑就报NPE),给你几个针对性的排查和解决方向:
先确认文件路径与工作目录是否匹配
spark-shell里你大概率是在文件所在的目录启动的,所以相对路径能正常生效,但IntelliJ默认的工作目录是你的项目根目录,这时候用相对路径就会找不到文件(哪怕你觉得路径是对的)。
解决办法:要么把文件路径改成绝对路径(比如/Users/yourname/data/yourfile.txt),要么在IntelliJ的运行配置里,找到「Working directory」选项,手动改成你存放目标文件的目录。注意Spark Streaming读取本地文件的原子性要求
Spark Streaming的textFileStream或者fileStream对本地文件有个特殊要求:必须是原子性写入的文件才会被处理。如果你是直接把文件复制/拖进监控目录的,系统可能还没完成文件元数据的同步,或者文件还在写入过程中,这时候Streaming尝试读取就可能抛出NPE。
正确的操作方式是:先把文件写到监控目录之外的临时位置,写完后再移动/重命名到监控目录——这个操作是原子性的,能保证Streaming识别到的是完整可用的文件。核对依赖版本与Scala版本的一致性
Spark 2.2.0对应的Scala版本是2.11.x,如果你在IntelliJ里用了Scala 2.12,或者依赖的Spark版本和本地安装的2.2.0不一致,很容易出现奇怪的兼容性问题(包括NPE)。
比如用SBT的话,依赖应该这么写:libraryDependencies += "org.apache.spark" %% "spark-streaming" % "2.2.0" % Provided加上
Provided标签是为了避免打包时把Spark依赖包带进去,和本地Spark环境冲突。检查OS X的隐私权限设置
High Sierra的隐私管控很严格,如果你的目标文件在Documents、Downloads或者桌面这类受保护的目录里,IntelliJ可能没有访问权限。你可以去「系统偏好设置 → 安全性与隐私 → 隐私 → 文件与文件夹」里,找到IntelliJ IDEA,勾选对应的目录权限,再重新运行试试。
如果还是没解决,你可以在代码里加一行打印当前工作目录的代码:
// Java版本 System.out.println(System.getProperty("user.dir"));
或者Scala版本:
// Scala版本 println(System.getProperty("user.dir"));
看看输出的路径是不是你预期的文件所在目录,这样能快速定位路径相关的问题。
内容的提问来源于stack exchange,提问作者covfefe

