# 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()完美
赶紧分析点有趣的数据,,,哈哈