spark在idea中本地如何运行?(处理问题NoSuchFieldException: SHUTDOWN_HOOK_PRIORITY)
2017-10-20 15:49
567 查看
spark在idea中本地如何运行?
前几天尝试使用idea在本地运行spark+scala的程序,出现了问题,http://www.cnblogs.com/yjf512/p/7662105.html 当时还以为是本地spark安装问题,今天发现原来不是。记录如下:
之前以为是我本地没有安装spark的问题。后来我的同事使用eclipse可以在本地运行一个spark的程序。于是反思是不是我的项目问题。
看这篇文章https://support.datastax.com/hc/en-us/articles/207038146-DSE-Spark-job-initialisation-returns-java-lang-NoSuchFieldException-SHUTDOWN-HOOK-PRIORITY-
说的是classPath里面的Hadoop的jar包不要使用2.x的,需要使用内置的jar。
打印了classPath,把 /Users/yejianfeng/.m2/repository/org/apache 里面的hadoop文件夹改名了
看了下源码,大概是说在/Users/yejianfeng/.m2/repository/org/apache/spark/spark-core_2.10/1.6.3/spark-core_2.10-1.6.3-sources.jar!/org/apache/spark/util/ShutdownHookManager.scala
下面有个代码:
里面先获取FileSystem,然后再获取FileSystem的SHUTDOWN_HOOK_PRIORITY属性,而这个属性在当前的FileSystem中并不存在。看起来是个版本问题,而且是org.apache.hadoop.fs.FileSystem的版本问题。
发现我的FileSystem版本在pom里面已经设置的是2.7.1,查看了下源码,
public static final int SHUTDOWN_HOOK_PRIORITY = 10;
里面有这个属性。
使用ide的提示,我发现我的FileSystem被两个引用了
很明显,hadoop-core只有到1.2.1 于是我就尝试把hadoop-core从我的pom中移除,并且从mvn仓库中移除。
问题解决
可以在本机运行spark读取本地文件了
好,处理了之后就可以使用idea在本地直接运行spark的程序了。
前几天尝试使用idea在本地运行spark+scala的程序,出现了问题,http://www.cnblogs.com/yjf512/p/7662105.html 当时还以为是本地spark安装问题,今天发现原来不是。记录如下:
现象
使用pom写了一个程序,发现出现下面的错误17/10/12 17:09:43 INFO storage.DiskBlockManager: Created local directory at /private/var/folders/bv/0tp4dw1n5tl9cxpc6dg2jy180000gp/T/blockmgr-0b0bf3cf-dd77-4bb4-97dc-60d6a65a35ae Exception in thread "main" java.lang.ExceptionInInitializerError at org.apache.spark.storage.DiskBlockManager.addShutdownHook(DiskBlockManager.scala:147) at org.apache.spark.storage.DiskBlockManager.<init>(DiskBlockManager.scala:54) at org.apache.spark.storage.BlockManager.<init>(BlockManager.scala:78) at org.apache.spark.SparkEnv$.create(SparkEnv.scala:365) at org.apache.spark.SparkEnv$.createDriverEnv(SparkEnv.scala:193) at org.apache.spark.SparkContext.createSparkEnv(SparkContext.scala:288) at org.apache.spark.SparkContext.<init>(SparkContext.scala:457) at com.didichuxing.scala.BenchMarkMain$.main(BenchMarkMain.scala:21) at com.didichuxing.scala.BenchMarkMain.main(BenchMarkMain.scala) Caused by: java.lang.NoSuchFieldException: SHUTDOWN_HOOK_PRIORITY at java.lang.Class.getField(Class.java:1695) at org.apache.spark.util.SparkShutdownHookManager.install(ShutdownHookManager.scala:223) at org.apache.spark.util.ShutdownHookManager$.shutdownHooks$lzycompute(ShutdownHookManager.scala:50) at org.apache.spark.util.ShutdownHookManager$.shutdownHooks(ShutdownHookManager.scala:48) at org.apache.spark.util.ShutdownHookManager$.addShutdownHook(ShutdownHookManager.scala:191) at org.apache.spark.util.ShutdownHookManager$.<init>(ShutdownHookManager.scala:58) at org.apache.spark.util.ShutdownHookManager$.<clinit>(ShutdownHookManager.scala) ... 9 more
之前以为是我本地没有安装spark的问题。后来我的同事使用eclipse可以在本地运行一个spark的程序。于是反思是不是我的项目问题。
看这篇文章https://support.datastax.com/hc/en-us/articles/207038146-DSE-Spark-job-initialisation-returns-java-lang-NoSuchFieldException-SHUTDOWN-HOOK-PRIORITY-
说的是classPath里面的Hadoop的jar包不要使用2.x的,需要使用内置的jar。
打印了classPath,把 /Users/yejianfeng/.m2/repository/org/apache 里面的hadoop文件夹改名了
看了下源码,大概是说在/Users/yejianfeng/.m2/repository/org/apache/spark/spark-core_2.10/1.6.3/spark-core_2.10-1.6.3-sources.jar!/org/apache/spark/util/ShutdownHookManager.scala
下面有个代码:
Try(Utils.classForName("org.apache.hadoop.util.ShutdownHookManager")) match { case Success(shmClass) => val fsPriority = classOf[FileSystem] .getField("SHUTDOWN_HOOK_PRIORITY") .get(null) // static field, the value is not used .asInstanceOf[Int] val shm = shmClass.getMethod("get").invoke(null) shm.getClass().getMethod("addShutdownHook", classOf[Runnable], classOf[Int]) .invoke(shm, hookTask, Integer.valueOf(fsPriority + 30)) case Failure(_) => Runtime.getRuntime.addShutdownHook(new Thread(hookTask, "Spark Shutdown Hook")); }
里面先获取FileSystem,然后再获取FileSystem的SHUTDOWN_HOOK_PRIORITY属性,而这个属性在当前的FileSystem中并不存在。看起来是个版本问题,而且是org.apache.hadoop.fs.FileSystem的版本问题。
发现我的FileSystem版本在pom里面已经设置的是2.7.1,查看了下源码,
public static final int SHUTDOWN_HOOK_PRIORITY = 10;
里面有这个属性。
使用ide的提示,我发现我的FileSystem被两个引用了
很明显,hadoop-core只有到1.2.1 于是我就尝试把hadoop-core从我的pom中移除,并且从mvn仓库中移除。
问题解决
可以在本机运行spark读取本地文件了
总结
说到底,这个是jar包的版本问题,最终只需要确保FileSystem的jar包是2.x以上,且没有多个FileSystem包就可以了。好,处理了之后就可以使用idea在本地直接运行spark的程序了。
相关文章推荐
- java运行报错:nested exception is java.lang.NoSuchFieldError: INSTANCE,但使用@Test测试是好的
- ubuntu下如何处理出现“ unable to execute ./DrClientLinux: No such file or directory”,“没有那个文件或目录”的问题。
- Java进阶(六)Java反射机制可恶问题NoSuchFieldException
- Struts2使用小问题-NoSuchFieldException
- Java进阶(六)Java反射机制可恶问题NoSuchFieldException
- Java反射机制可恶问题NoSuchFieldException
- java.security.NoSuchProviderException: no such provider: BC.这问题如何解决
- 在tomcat8.0上运行ssh项目是出现java.lang.NoSuchFieldException: resourceEntries
- Spark本地运行出错问题:Exception in thread "main" java.lang.NoSuchMethodError: scala.Predef$.refArrayOps([Lja
- Java进阶(六)Java反射机制可恶问题NoSuchFieldException
- strtus2.3 java.lang.NoSuchFieldException: DEFAULT_PARAM>
- strtus2.3 java.lang.NoSuchFieldException: DEFAULT_PARAM>
- Could not reload resource bundles java.lang.NoSuchFieldException: cacheList
- axis2 实现双向SSL 因为密码问题出现NoSuchAlgorithmException
- 存在bug<java.lang.NoSuchFieldException: DEFAULT_PARAM>
- ssh整合报错,nested exception is java.lang.NoSuchFieldError: TRACE
- 奋斗了n(n>7)小时,终于解决了连接远程JMS JNDI的问题:java.rmi.NoSuchObjectException: no such object in table
- 解决代码混淆后出现javax.mail.nosuchproviderexception smtp的问题
- [struts2]2.3.14 json-plugin 存在bug<java.lang.NoSuchFieldException: DEFAULT_PARAM>