Spark程序编写过程中的常见问题

1、使用IDEA 或者是 eclipse IDE来编写程序时,关于导包的问题。

在这些IDE过程中,如果网络可以的话,建议选择maven或者是sbt的模式,但是如果网络很差的话,还是老老实实的把我们需要的包导入吧,编写spark程序时,需要导入的 包,只有一个,那就是spark-assembly-1.4.0-hadoop2.6.0.jar,只要是assembly类型的集成包就行,一般都会满足你的基本需求。

(1)导包问题一

导入hadoop的包,在程序中没有用到hadoop的组件的时候,来导入hadoop的包,这样很容易出现问题,比如先导入hadoop的bin包,在导入spark的包,那么这时候程序执行就会出现问题,程序就会报如下的异常:

Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
15/09/23 15:47:15 INFO SparkContext: Running Spark version 1.4.0
Exception in thread "main" java.lang.NoClassDefFoundError: com/google/common/collect/Maps
at org.apache.hadoop.metrics2.lib.MetricsRegistry.(MetricsRegistry.java:42)
at org.apache.hadoop.metrics2.impl.MetricsSystemImpl.(MetricsSystemImpl.java:94)
at org.apache.hadoop.metrics2.impl.MetricsSystemImpl.(MetricsSystemImpl.java:141)
at org.apache.hadoop.metrics2.lib.DefaultMetricsSystem.(DefaultMetricsSystem.java:38)
at org.apache.hadoop.metrics2.lib.DefaultMetricsSystem.(DefaultMetricsSystem.java:36)
at org.apache.hadoop.security.UserGroupInformation$UgiMetrics.create(UserGroupInformation.java:120)
at org.apache.hadoop.security.UserGroupInformation.(UserGroupInformation.java:236)
at org.apache.spark.util.Utils$$anonfun$getCurrentUserName$1.apply(Utils.scala:2162)
at org.apache.spark.util.Utils$$anonfun$getCurrentUserName$1.apply(Utils.scala:2162)
at scala.Option.getOrElse(Option.scala:120)
at org.apache.spark.util.Utils$.getCurrentUserName(Utils.scala:2162)
at org.apache.spark.SparkContext.(SparkContext.scala:301)
at sparkSQL.SparkSQL_Jdbc01$.initalSparkContext(SparkSQL_Jdbc01.scala:18)
at sparkSQL.SparkSQL_Jdbc01$.main(SparkSQL_Jdbc01.scala:35)
at sparkSQL.SparkSQL_Jdbc01.main(SparkSQL_Jdbc01.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Caused by: java.lang.ClassNotFoundException: com.google.common.collect.Maps
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 20 more
15/09/23 15:47:15 INFO Utils: Shutdown hook called


这个问题不仅仅是在idea上面,在eclipse上面同样会有这样的问题,这个是我已经做过实验的,可能是跟程序的加载包的顺序有关,而且现在spark已经十分完善了,所以尽量不用导入hadoop的包。

(2)建议导入集成包,拒绝单包导入,这样会很麻烦,而且对于初学者也是一个不小的挑战。

(3)在spark SQL连接oracle数据库的过程中,如果数据库中存在自动生成的ID,一定要注意可能会有overflow precision这样的异常报出,这样报出的原因就是就是自动生成的ID是number类型,并且可能没有指定数据类型的长度,导致的,这个错误及其隐秘,大家要多多注意哦(特别是自己)


你可能感兴趣的:(spark)