本文主要講述sparkR鏈接Mysql的過程和坑。 SparkR的開發可以用RStudio工具進行開發,連接spark可以通過RStudio界面中的Connections進行配置連接;具體方法這裡不做介紹。 下麵為spark程式的部分代碼: 在集群和sparkR shell里會有一個不知道是不是bu ...
本文主要講述sparkR鏈接Mysql的過程和坑。
SparkR的開發可以用RStudio工具進行開發,連接spark可以通過RStudio界面中的Connections進行配置連接;具體方法這裡不做介紹。
下麵為spark程式的部分代碼:
if (nchar(Sys.getenv("SPARK_HOME")) < 1) { Sys.setenv(SPARK_HOME = "/usr/local/spark/") } library(SparkR, lib.loc = c(file.path(Sys.getenv("SPARK_HOME"), "R", "lib"))) sc <- sparkR.init(master = "local[*]", sparkEnvir = list(spark.driver.memory="2g")) df<-read.jdbc("jdbc:mysql://192.168.1.181:3306/dsj_test?user=root&password=123456&characterEncoding=utf8","channel",user="root",password="123456") newdata<-select(df,df$channel,df$stream_id,df$region,df$isp) 省略具體操作 write.jdbc(newdata, "jdbc:mysql://192.168.1.181:3306/dsj_test?user=root&password=123456&characterEncoding=utf8", "testmysql", mode="overwrite", user = "root", password = "123456"
在集群和sparkR shell里會有一個不知道是不是bug的坑。
復現:
1. 啟動sparkR;
2.進入sparkR中,載入mysql驅動:
sparkR.session(sparkPackages="/usr/local/spark/jars/mysql-connector-java-8.0.11.jar")
3. 連接資料庫,獲取數據:
df<-read.jdbc("jdbc:mysql://192.168.1.181:3306/dsj_test?user=root&password=123456&characterEncoding=utf8","channel",user="root",password="123456")
在這一步的時候第一次執行是不會過去的,它會報一個異常:
18/05/21 15:44:56 ERROR RBackendHandler: jdbc on 5 failed
java.lang.reflect.InvocationTargetException......
Caused by: java.sql.SQLException: No suitable driver
at java.sql.DriverManager.getDriver(DriverManager.java:315)
at org.apache.spark.sql.execution.datasources.jdbc.JDBCOptions$$anonfun$7.apply(JDBCOptions.scala:84)
at org.apache.spark.sql.execution.datasources.jdbc.JDBCOptions$$anonfun$7.apply(JDBCOptions.scala:84)
at scala.Option.getOrElse(Option.scala:121).......
4. 再次執行第三步,並不會再次報錯,而是顯示成功;
在集群中也一樣,即使添加了mysql驅動也會報出第三步的異常;集群提交的命令為:(載入驅動的三個方式選一個就好,但是提交.jar人物,選--driver-class-path參數)
./spark-submit --master spark://leeco:7077 --packages mysql:mysql-connector-java:8.0.11 --driver-class-path /usr/local/spark/jars/mysql-connector-java-8.0.11.jar --jars /usr/local/spark/jars/mysql-connector-java-8.0.11.jar /Users/leeco/work/R/analysis/analysisF.R
這裡的這個坑是在集群中發現的,主要是sparkR第一次載入驅動的時候報異常,第二次正常運行,不知道是不是bug,還是我的配置有問題,有大神知道可以告知,感激不盡。
解決辦法:
在R語言中捕獲異常,再次執行載入數據語句即可:
possibleError <- tryCatch(
df<-read.jdbc("jdbc:mysql://192.168.1.181:3306/dsj_test?user=root&password=123456&characterEncoding=utf8","channel",user="root",password="123456"),
error=function(e) {0}
)
df<-read.jdbc("jdbc:mysql://192.168.1.181:3306/dsj_test?user=root&password=123456&characterEncoding=utf8","channel",user="root",password="123456")
再次提交集群即可順利完成任務。