SparkSQL Driver ClassNotFoundException的解决方案

在使用SparkSQL连接关系型数据库时,需要通过JDBC来加载对应数据库的驱动,如SQLServer JDBC连接用到的sqljdbc4.jar,处理时经常会遇到sparksql抛出jdbc的驱动程序ClassNotFoundException,类似下面的错误提示
       Exception in thread "main" java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver
       at java.net.URLClassLoader$1.run(Unknown Source)
       at java.net.URLClassLoader$1.run(Unknown Source)
       at java.security.AccessController.doPrivileged(Native Method)
       at java.net.URLClassLoader.findClass(Unknown Source)
       at java.lang.ClassLoader.loadClass(Unknown Source)
       at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
       at java.lang.ClassLoader.loadClass(Unknown Source)
       at org.apache.spark.sql.jdbc.package$DriverRegistry$.register(jdbc.scala:227)
       at org.apache.spark.sql.jdbc.DefaultSource.createRelation(JDBCRelation.scala:94)
       at org.apache.spark.sql.sources.ResolvedDataSource$.apply(ddl.scala:265)
       at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:114)
       at org.apache.spark.sql.SQLContext.load(SQLContext.scala:1242)
       at com.test.SparkSQLSample$.test(SparkSQLSample.scala:21)
       at com.test.SparkSQLSample$.main(SparkSQLSample.scala:32)
       at com.test.SparkSQLSample.main(SparkSQLSample.scala)
 
 分享一下自己的处理方式
 1.最简单的Spark程序以local方式在本地启动,只需要将sqljdbc4.jar关联到项目中即可
 
 2.Spark程序运行在mesos或yarn等分布式任务调度系统上
 
 2.1 这种情况下,可以考虑将驱动包如sqljdbc4.jar,利用maven或sbt打包到spark-submit提交的jar包中,
     不过这种方式并不推荐,原因有两点:首先每次新增的依赖包都需要重新打包,其次我在将sqljdbc4打包到Spark-submit的jar,执行Spark作业时发现,底层抛出异常,大致意思sqljdbc4.jar需要用jdk_1.6的版本编译,而我用的1.7,然而其它的依赖包中编译却需要1.7,总的来说,这种方式可能出力后还可能达不到效果


    2.2 推荐使用下面的方式,简单便捷,只需要我们在Spark节点添加SPARK_CLASSPATH,并把需要的包引用到SPARK_CLASSPATH即可。
以CentOS为例,在/etc/profile中添加export SPARK_CLASSPATH="/usr/local/lib/*",source /etc/profile 后即生效,这样我们只需要把依赖的驱动包添加到/usr/local/lib/下就可以了

你可能感兴趣的:(spark,sparksql)