spark python java.lang.IllegalStateException: Did not find registered driver with class org.apache.spark.sql.execution.datasources.jdbc.DriverWrapper

最近在学习spark分布式计算框架,其中遇到这样的问题

提交的命令是

bin/spark-submit  --jars lib/mysql-connector-java-5.1.38-bin.jar --master spark://Wechat-6:7077 examples/hsbhadoop/demo.py

出错的语句是

df.write.jdbc(MYSQL_CONNECTION_URL, 'Date_statistic', mode='append')

分析原因是在数据写入mysql的时候发生的错误, 至于为什么不清楚, 在apache上面找到一个类似的提问, 说是只在1.6.1上面出现, 无奈之下我下载了1.6.0, 果然不再出现问题.

 

然后又经过半天的优化, 代码有了一些变化, 突然想起来再回到1.6.1上面去跑一边看问题是不是继续存在, 这时发现问题不再出现了, 囧...

 

体内的洪荒之力一下子就控制不住了, 就不信了...

开始删代码, 得到一个最小的包含错误的代码片段(即多删除任意一行代码程序都不能运行,或者bug不出现, 当然能够确定不干扰的可以忽略)

 

sqlsc=SQLContext(sc)
dataframe_mysql = sqlsc.read.format("jdbc").options(
    url = MYSQL_CONNECTION_URL,
    dbtable = "`SystemEvents-"+date+"`",
    driver = "com.mysql.jdbc.Driver").load()

# 下面这行是没有问题的代码

# source = dataframe_mysql.select('Message').limit(1).map(lambda r: ('com/asdfadsfad', 'afafasdfasdfas'))

#下面这行是有问题的代码

source = sc.parallelize([('com/asdfadsfad', 'afafasdfasdfas')])

rdd = source.map(lambda r: ('com/asdfadsfad', "2016-04-02", 1, 2, 3))
df = rdd.toDF(['url', 'time', 'pv', 'uv', 'level'])
df.write.jdbc(MYSQL_CONNECTION_URL, 'Date_statistic', mode='append')

具体原因不明,但是区别已经能够看出来了, 只有从mysql.select返回的rdd后面进行toDF操作之后才可能正常进行写操作,否则就会造成错误, 但是同样的代码在1.6.0下面是正常的.

posted @ 2016-04-09 17:06  bojoyzhou  阅读(764)  评论(0编辑  收藏  举报