本人spark小白一枚,最开始使用spark时遇到过许多问题,现在把它们都记录下来,希望给后人一个参考。大神不要嘲笑哦~~~
1.清除mac缓存:rm -rf /etc/udev/rules.d/70-persistent-net.rules
2.spark-submit \
--class main.scala.SparkWordCount \
--master spark://192.168.109.130:7077 \
/home/yingying/SparkTest.jar \
file:///usr/spark/spark-1.5.1-bin-hadoop2.6/README.md
3.出错Error: Could not find or load main class org.apache.spark.launcher.Main时,把spark重新装一遍即可= =
4. 出现"*** is already defined as object ***"错误
编写好SogouResult后进行编译,出现"Sogou is already as object SogouResult"的错误,
出现这个错误很可能不是程序代码的问题,很可能是使用Scala JDK版本问题,作者在使用scala-2.11.4遇到该问题,换成scala-2.10.4后重新编译该问题得到解决,需要检查两个地方配置:Libraries和Global Libraries分别修改为scala-2.10.4
def main(args:Array[String]){
val cOnf= new SparkConf().setAppName("Spark Pi")
val spark = new SparkContext(conf)
val data = spark.textFile("data")
val mappeddata = data.map(num => {(num % 10 , num)})
val count = mappeddata.reduceByKey((a,b) => {a+b}).collect()
val sum_count = count.map(data => {data._2}).sum
var temp = 0
var index = 0
val mid = sum_count/2
for(i <- 0 to 10) {
temp = temp + count(i)
if(temp >= mid) {
index = i
break
}
}
val offset = temp -mid
val result = mappeddata.filter(num => num._1 == index).takeOrdered(offset)
println("Median is "+ result(offset))
spark.stop()
}
5.WARN scheduler.TaskSchedulerImpl: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient resources
解决方法:因为我的集群环境,每个节点只剩下500MB内存了,由于我没有配置SPARK_EXECUTOR_MEMORY参数,默认会使用1G内存,所以会出现内存不足,从而出现上面日志报的警告信息。
所以解决办法是添加如下参数:
export SPARK_EXECUTOR_MEMORY=100M
转自:http://blog.csdn.net/jiangshouzhuang/article/details/48844859
6.集群启动spark-shell,即MASTER=spark://SparkMaster:7077 ./spark-shell出错,解决方法:把MASTER改成master(==简直不能再无语。。)相关链接:http://bbs.csdn.net/topics/390941085
7.hadoopdatanode启动不起
例如:
NameNode和DataNode的namespaceID不一致,这个错误是很多人在安装时会遇到的,日志信息为:
java.io.IOException: Incompatible namespaceIDs in/root/tmp/dfs/data:
NameNode namespaceID = 1307672299; DataNode namespaceID =389959598
若HDFS一直没有启动,读者可以查询日志,并通过日志进行分析,以上提示信息显示了NameNode和DataNode的namespaceID不一致。
这个问题一般是由于两次或两次以上的格式化NameNode造成的,有两种方法可以解决,第一种方法是删除DataNode的所有资料(及将集群中每个datanode的/hdfs/data/current中的VERSION删掉,然后执行hadoopnamenode-format重启集群,错误消失。<推荐>);第二种方法是修改每个DataNode的namespaceID(位于/hdfs/data/current/VERSION文件中)<优先>或修改NameNode的namespaceID(位于/hdfs/name/current/VERSION文件中),使其一致。
参考:http://kisuntech.blog.51cto.com/8003773/1304629
8.
ERROR util.SparkUncaughtExceptionHandler: Uncaught exception in thread Thread[appclient-registration-retry-thread,5,main]
spark-submit RECEIVE SIGNAL 15
解决方法:提交任务时,把Master:7077改成192.168.109.130:7077
9.某个datanode突然连不上namenode时,先把这个datanode的tmp目录里面的VERISON删掉,然后在namonode上执行hadoop dfsadmin -refreshNodes ,再在死掉的datanode上面执行hadoop-daemon.sh start datanode,然后ok
相关链接:http://zhousheng29.iteye.com/blog/1667101(跟他的错误原因不一样,但是解决方法一样)
10.用spark-submit提交作业时,读取本地文件明明路径是对的但是报错file doesn exists。
至今不知道解决方法,换了个文件就好了,无语==
11.
代码一:object WorldCount {
def main(args:Array[String]){
val master = args(0)
val sc = new SparkContext(master,"WordCount",System.getenv("SPARK_HOME"))
val input = sc.textFile(args(1))
val words = input.flatMap(_.split(" "))
val count = words.map((_,1)).reduceByKey(_+_)
count.saveAsTextFile(args(2))
}
}
代码二:object WordCount2 {
def main(args:Array[String]){
val master = args(0)
val sc = new SparkContext(master,"WordCount2",System.getenv("SPARK_HOME"))
val input = sc.textFile(args(1))
val wordcount = input.flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_)
wordcount.collect
wordcount.saveAsTextFile(args(2))
}
}
代码一不能执行成功但是代码二可以,因为。。。。代码二多了一个collect。。。。哎呦我去,折腾了一下午,宝宝心里苦
12.scala程序打包:
(0)最最首先要在projectStruture里面把spark的库添加进去,添加好的时候如图
(1)scr目录下面建目录main,再在main下面建一个目录scala(不知道这两个目录是不是必需的)
(2)projectStruture里面,Artifacts--->添加上,然后把没用的包都删掉,弄好之后如图
(3)Bulid--->bulid Artifacts--->bulid
(4)完活,去工程的文件夹--->out--->artifacts里面就可以找到啦
13.以指定executor-memory的方式启动spark-shell:
14.slave机器用jps查看进程的时候有DataNode,但是用web查看的话或者用bin/hadoop dfsadmin -report,live nodes为0. 这说明datanode没有正常启动。看了datanode的log,显示一直在连接master但是一直retry,我查过所有的hosts,并且无论用ping还是ssh都是通的。
解决办法:是配置文件core-site.xml出了问题,sparkslave1的里面的core-site.xml中
fs.defaultFS
hdfs://Master:9000
其中master的端口与Master相应配置文件的端口不一致。。。。。
查出bug的一瞬间想手刃自己。。。