Spark常见问题汇总

注意:如果Driver写好了代码,eclipse或者程序上传后,没有开始处理数据,或者快速结束任务,也没有在控制台中打印错误,那么请进入spark的web页面,查看一下你的任务,找到每个分区日志的stderr,查看是否有错误,一般情况下一旦驱动提交了,报错的情况只能在任务日志里面查看是否有错误情况了

1Operation category READ is not supported in state standby

org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.ipc.StandbyException):  Operation category READ is not supported in state  standby

此时请登录Hadoop的管理界面查看运行节点是否处于standby

如登录地址是:

http://192.168.50.221:50070/dfshealth.html#tab-overview

如果是,则不可在处于StandBy机器运行spark计算,因为该台机器为备分机器

2、配置spark.deploy.recoveryMode选项为ZOOKEEPER

如果不设置spark.deploy.recoveryMode的话,那么集群的所有运行数据在Master重启是都会丢失,可参考BlackHolePersistenceEngine的实现。

3、多Master如何配置

       因为涉及到多个Master,所以对于应用程序的提交就有了一点变化,因为应用程序需要知道当前的MasterIP地址和端口。这种HA方案处理这种情况很简单,只需要在SparkContext指向一个Master列表就可以了,如spark://host1:port1,host2:port2,host3:port3,应用程序会轮询列表。

4No Space Left on the deviceShuffle临时文件过多)

              由于Spark在计算的时候会将中间结果存储到/tmp目录,而目前linux又都支持tmpfs,其实就是将/tmp目录挂载到内存当中。

那么这里就存在一个问题,中间结果过多导致/tmp目录写满而出现如下错误

No Space Left on the device

解决办法

第一种:修改配置文件spark-env.sh,把临时文件引入到一个自定义的目录中去即可

export  SPARK_LOCAL_DIRS=/home/utoken/datadir/spark/tmp

第二种:偷懒方式,针对tmp目录不启用tmpfs,直接修改/etc/fstab

 

5java.lang.OutOfMemory, unable to create new native thread

Caused by:  java.lang.OutOfMemoryError: unable to create new native thread

at  java.lang.Thread.start0(Native Method)

at  java.lang.Thread.start(Thread.java:640)

上面这段错误提示的本质是Linux操作系统无法创建更多进程,导致出错,并不是系统的内存不足。因此要解决这个问题需要修改Linux允许创建更多的进程,就需要修改Linux最大进程数。

[utoken@nn1  ~]$ulimit  -a

临时修改允许打开的最大进程数

[utoken@nn1  ~]$ulimit -u  65535

临时修改允许打开的文件句柄

[utoken@nn1  ~]$ulimit -n  65535

永久修改Linux最大进程数量

[utoken@nn1  ~]$ vim  /etc/security/limits.d/90-nproc.conf

*          soft    nproc      60000

root       soft    nproc      unlimited

永久修改用户打开文件的最大句柄数,该值默认1024,一般都会不够,常见错误就是not open  file

[utoken@nn1  ~]$ vim  /etc/security/limits.conf

bdata  soft    nofile   65536

bdata  hard    nofile   65536

 

6Worker节点中的work目录占用许多磁盘空间

目录地址:

/home/utoken/software/spark-1.3.0-bin-hadoop2.4/work

这些是Driver上传到worker的文件,需要定时做手工清理,否则会占用许多磁盘空间

 

7spark-shell提交Spark Application如何解决依赖库

spark-shell的话,利用--driver-class-path选项来指定所依赖的jar文件,注意的是--driver-class-path后如果需要跟着多个jar文件的话,jar文件之间使用冒号(:)来分割。 


8、Spark在发布应用的时候,出现连接不上master问题,如下 15/11/19 11:35:50 INFO AppClient$ClientEndpoint: Connecting to master  spark://s1:7077... 15/11/19 11:35:50 WARN ReliableDeliverySupervisor: Association with remote  system [akka.tcp://sparkMaster@s1:7077] has failed, address is now gated for  [5000] ms. Reason: [Disassociated] 

解决方式:检查所有机器时间是否一致、hosts是否都配置了映射、客户端和服务器端的Scala版本是否一致、Scala版本是否和Spark兼容 检查是否兼容问题请参考官方网站介绍:

9、开发spark应用程序(和Flume-NG结合时)发布应用时可能出现org.jboss.netty.channel.ChannelException: Failed to bind to: /192.168.10.156:18800 15/11/27 10:33:44 ERROR ReceiverSupervisorImpl: Stopped receiver with error: org.jboss.netty.channel.ChannelException: Failed to bind to: /192.168.10.156:18800
15/11/27 10:33:44 ERROR Executor: Exception in task 0.0 in stage 2.0 (TID 70)
org.jboss.netty.channel.ChannelException: Failed to bind to: /192.168.10.156:18800
          at org.jboss.netty.bootstrap.ServerBootstrap.bind(ServerBootstrap.java:272)
         at org.apache.avro.ipc.NettyServer.<init>(NettyServer.java:106)
         at org.apache.avro.ipc.NettyServer.<init>(NettyServer.java:119)
         at org.apache.avro.ipc.NettyServer.<init>(NettyServer.java:74)
         at org.apache.avro.ipc.NettyServer.<init>(NettyServer.java:68)
          at org.apache.spark.streaming.flume.FlumeReceiver.initServer(FlumeInputDStream.scala:163)
          at org.apache.spark.streaming.flume.FlumeReceiver.onStart(FlumeInputDStream.scala:170)
          at org.apache.spark.streaming.receiver.ReceiverSupervisor.startReceiver(ReceiverSupervisor.scala:148)
          at org.apache.spark.streaming.receiver.ReceiverSupervisor.start(ReceiverSupervisor.scala:130)
          at org.apache.spark.streaming.scheduler.ReceiverTracker$ReceiverTrackerEndpoint$$anonfun$9.apply(ReceiverTracker.scala:542)
          at org.apache.spark.streaming.scheduler.ReceiverTracker$ReceiverTrackerEndpoint$$anonfun$9.apply(ReceiverTracker.scala:532)
          at org.apache.spark.SparkContext$$anonfun$37.apply(SparkContext.scala:1984)
          at org.apache.spark.SparkContext$$anonfun$37.apply(SparkContext.scala:1984)
         at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:66)
         at org.apache.spark.scheduler.Task.run(Task.scala:88)
         at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:214)
          at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
          at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
          at java.lang.Thread.run(Thread.java:744)
Caused by: java.net.BindException: Cannot assign requested address
         at sun.nio.ch.Net.bind0(Native Method)
         at sun.nio.ch.Net.bind(Net.java:444)
         at sun.nio.ch.Net.bind(Net.java:436)
         at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:214)
         at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
          at org.jboss.netty.channel.socket.nio.NioServerBoss$RegisterTask.run(NioServerBoss.java:193)
          at org.jboss.netty.channel.socket.nio.AbstractNioSelector.processTaskQueue(AbstractNioSelector.java:372)
          at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:296)
          at org.jboss.netty.channel.socket.nio.NioServerBoss.run(NioServerBoss.java:42)
         ... 3 more 由于spark通过Master发布的时候,会自动选取发送到某一台的worker节点上,所以这里绑定端口的时候,需要选择相应的worker服务器,但是由于我们无法事先了解到,spark发布到哪一台服务器的,所以这里启动报错,是因为在  192.168.10.156:18800的机器上面没有启动Driver程序,而是发布到了其他服务器去启动了,所以无法监听到该机器出现问题,所以我们需要设置spark分发包时,发布到所有worker节点机器,或者发布后,我们去寻找发布到了哪一台机器,重新修改绑定IP,重新发布,有一定几率发布成功。详情可见《印象笔记-战5渣系列——Spark  Streaming启动问题 - 推酷
10、spark-shell 找不到hadoop so问题解决 

在Spark的conf目录下,修改spark-env.sh文件,加入LD_LIBRARY_PATH环境变量,值为HADOOP的native库路径即可


你可能感兴趣的:(Spark常见问题汇总)