本文主要講述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″)
再次提交叢集即可順利完成任務。