# Spark 分析Json數據存入Mysql 遇到的坑
折騰了兩天,終算是弄好了,入的坑不計其數,但是也要數一數。
坑(一)
之前搭建好了spark,就是簡單的wordcount一下,成功了也就沒在意。
這幾天重新拾起來,一上來就記得 --master spark://master:55555
這個55555端口其實是我的hdfs的端口,結果給記成spark群集的了,哇,很難受,一直卡住
說什么master不通,查了半天,忽然想起怎么不加 --master這個配置反而執行成功了,
查了一下不加 --master默認 --master local,呀,緊跟著后邊 --master spark://master:7077
(默認端口為7077)
~~~~~~~~~
恍然大悟,很難受,這樣一來,通了。。。。。
-------
坑(二)
```
17/04/30 13:37:29 INFO scheduler.TaskSchedulerImpl: Adding task set 0.0 with 2 tasks
17/04/30 13:37:44 WARN scheduler.TaskSchedulerImpl: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient resources
17/04/30 13:37:59 WARN scheduler.TaskSchedulerImpl: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient resources
```
查了一下,大體意思就是內存不足,資源不足。。。這個好辦,改了一下配置文件,不知道起沒起作用,估計是沒起作用,
在spark目錄中的spark_env.sh中添加了export SPARK_EXECUTOR_MEMORY=512M
其實主要不在這里,不加的話默認為1G。
就是啟動命令上我們 --executor-memory 1G 或者--executor-memory 512M 都沒問題,
--executor-memory 2G就有問題了。
這樣資源不足的問題也解決了。
-------
坑(三)
提交作業后,總是執行一半卡住,估計連一半也沒執行,看了后臺的works 輸出日志,
```
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
```
這錯誤挺明顯的,就是數據庫連接失敗了。
開始思考,是不是提交作業到群集每個slave上都需要一個 mysql.jdbc包呢,試了一下,
--jars /home/examples/mysql.jar 這個配置一開始就有,我只是在master上存在mysql.jdbc包,
于是把mysql.jdbc包放到slave的相同的位置。結果還是不行。。。
還是一樣的錯誤。。。
。。。。。。。。。。。
一宿過去了。。。。。。。。。。
爬起來,繼續干,靈光一現,,,,,,,,
```
"jdbc:mysql://localhost:3306/"+mysql_database+"?user="+mysql_user+"&password="+mysql_password
```
scala中連接數據庫我是這樣寫的,localhost的,有沒有,發現問題了吧。。。。
目前只是猜測,,,,,
我猜,slave向master連接數據庫時出現了問題。。。。
slave上并沒有mysql,,,
我們需要把數據都存入master上,
試著把localhost改成master,,,,哇哦。。。
成功了呢。。。。。
開心不
開心。
-------
到上邊已經算是結束了。
過程中還有一坑,,,就是一開始自己寫了個wordcount結果存入mysql的小實驗,
```
val conf = new SparkConf().setAppName("RDDToMysql").setMaster("local")
```
配置這樣寫的。。。。。
我特么怎么說不管 --master spark 還是 --master local都成功。。。問題在這里呀。我該
寫成空配置
```
val conf = new SparkConf()
```
還有,,,,要處理json,,,sc.textFile肯定是不太好的,因為他都是一行一行的讀取的,
如果你的json數據不是規則的一行一個數據,那就完蛋了。
最好的方式就是讀取批量小文件 ,我們規定一個txt文件只有一條json數據。。
直接讀取整個文件
sc.wholeTextFiles()完美
趕緊分析點有趣的數據,,,哈哈