spark job 异常问题

 

[编辑] 1、java.io.IOException : Cannot run program "/usr/local/bin/python"

yarn-client模式 sparrk-python 任务异常 java.io.IOException: Cannot run program "/usr/local/bin/python": error=2, No such file or directory

异常原因
线上集群的python 路径是 /usr/bin/python

可检查driver 所在的客户端python 的路径 可执行如下命令:which python ,发现与线上python 不一致。spark 将driver上python 路径分发到executor上。executor找不到以上异常的python 路径。

解决办法
在执行脚本中加上如下代码:

export PYSPARK_DRIVER_PYTHON=/usr/bin/python
export PYSPARK_PYTHON=/usr/bin/python

[编辑]2、org.apache.hadoop.fs.viewfs.NotInMountPointException

Exception.bmp

异常原因及解决
该异常表示 hdfs目录无挂载点。也就是说没有以下目录。 可查看hdfs目录是如何产生的。如果输出路径是由输入文件中一些参数拼出来的,请查看异常地方的输入文件中数据是否有问题。导致拼出来的路径是有问题的。

 

[编辑] 3、yarn-client spark调scf FileNotFoundException

异常原因:scf 初始化会扫描classpath中的所有类,yarn-client 模式会将上传的jar 取别名加到classpath中,但是包不会上传到hdfs 再让executor下载,而是直接从driver上传到executor,不是以别名命名,因此,这个classpath中的包名的包是不存在的。所以报异常。

解决办法: 在yarn-cluster 模式和local 模式都不会有这个问题,可以考虑使用这两种,或者scf 服务可以catch这种异常。

[编辑] 4、java.lang.OutOfMemoryError: Java heap space

Java.png
异常原因: 大数据量放到数组中。

解决办法: 1)可以加大driver-memory executor-memory 2)优化代码,不要将过大的数据量放到数组中。

[编辑] 5、spark 访问hive 异常

yarn 模式,要指定hive-cite.conf :--files /usr/lib/software/spark/spark-2.0/conf/hive-site.xml

[编辑] 6、找不到依赖的包 Exception in thread \"main\" java.io.FileNotFoundException:

   打包方式要使用maven,把依赖打在jar 包里 可解决以上问题。或者使用客户端提交任务--jars jar包也可以

 

[编辑] 7,spark直接调用hbase服务,导致executor节点的zookeeper连接过多,executor节点被拒绝访问

   将引入的类由org.apache.hadoop.hbase.mapred.TableOutputFormat、org.apache.hadoop.mapred.JobConf改为org.apache.hadoop.hbase.mapreduce.TableOutputFormat、 
   org.apache.hadoop.mapreduce.JobConf,这个bug是老版本hbase的遗留问题(打开的zookeeper连接没有被关闭,达到zookeeper server容忍上限后,节点就会被拒绝访问),使用新版本的就可
   以了。(如果mapred和mapreduce两包都有需要的类,建议全使用mapreduce包里的)。

[编辑] 8、spark 调ES 超时

遇到超时,在spark 这部分的处理,两种办法:
1)加大超时时间
2)try catch 超时异常,并做相应的处理。

[编辑] 9、spark读lzo文件报异常java.lang.RuntimeException: native-lzo library not available

可能是你自己使用的配置覆盖了spark的默认配置。加上--conf spark.driver.extraClassPath=/usr/lib/software/hadoop/share/hadoop/common/hadoop-lzo-0.4.20-SNAPSHOT.jar 就可以了

[编辑] 10、日志太长,定位问题难,想更改日志级别?

  • 使用如下配置可以使用自己的log4j配置文件。--conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=文件位置”
  • 填加一行代码在你的逻辑里参考如下:
val conf = new SparkConf()
val sc = new SparkContext(conf)
sc.setLogLevel("INFO")(log levels include: ALL, DEBUG, ERROR, FATAL, INFO, OFF, TRACE, WARN)这行代码相当于设置 log4j.rootCategory的级别

[编辑] 11、org.apache.spark.SparkException:Task not serializable

请查看是否设置了该参数org.apache.spark.serializer.KryoSerializer 并在代码逻辑中有未序列化的类,需要在driver 和executor 之间传输,这种情况会报该异常。
解决:
1) 去掉设置以上参数,使用默认配置,将类序列化,实现接口 java.io.Serializable。
2)KryoSerializer 在使用目标类需要提前注册。具体注册类参考以下:

  • spark.kryo.classesToRegister:向Kryo注册自定义的的类型,类名间用逗号分隔
  • spark.kryo.referenceTracking:跟踪对同一个对象的引用情况,这对发现有循环引用或同一对象有多个副本的情况是很有用的。设置为false可以提高性能
  • spark.kryo.registrationRequired:是否需要在Kryo登记注册?如果为true,则序列化一个未注册的类时会抛出异常
  • spark.kryo.registrator:为Kryo设置这个类去注册你自定义的类。最后,如果你不注册需要序列化的自定义类型,Kryo也能工作,不过每一个对象实例的序列化结果都会包含一份完整的类名,这有点浪费空间
  • spark.kryo.unsafe:如果想更加提升性能,可以使用Kryo unsafe方式
  • spark.kryoserializer.buffer:每个Executor中的每个core对应着一个序列化buffer。如果你的对象很大,可能需要增大该配置项。其值不能超过
  • spark.kryoserializer.buffer.max
  • spark.kryoserializer.buffer.max:允许使用序列化buffer的最大值

[编辑] 12、[shuffle-client-1]:Failed while starting block fetches

遇到如下异常,通常都是内存溢出,container被yarn kill .
内存溢出的原因:如果是首次启动,可能是数据量太大,所需要的计算内存不足,建议增加executor 内存大小,或者调整代码减少内存的使用;如果是因为任务长时间未启动,导致数据堆积严重,任务启动每批次获取的数据量太大,低阶api临时调整executor 内存或者spark.default.parallelism 可恢复任务。之后尽量将参数调整回来,避免资源浪费。高阶api 设置参数spark.streaming.backpressure.enabled =true,spark.streaming.backpressure.initialRate=1000(看情况设定)

Eee.bmp

[编辑] 13、 SparkContext did not initialize after waiting for 100000 ms

同时appMaster之中的error日志中还有Exception in thread "Driver" java.lang.NullPointerException 异常。解决方法:将scala代码的入口类的关键字由class改为object。

 

[编辑] 14、 Spark任务执行失败,但是返回的状态却是SUCCEED

spark任务执行时,主程序(ApplicationMaster)会执行用户的main方法,main方法正常执行完成,会认为该任务执行成功。所以,切勿对main中引用spark内部方法捕获异常,这会导致main方法不能异常退出,ApplicationMaster也就不能捕获异常信息来做进一步处理。

[编辑] 15、spark or streaming 调用scf 异常scf.config 找不到

1)检查scfkey.key 内容是否有误。
2)是否将scfkey.key 上传到hdfs 且 --files ${hdfs目录}/scfkey.key

[编辑] 16、Output directory FileAlreadyExistsException

报错如图:Alreadyexit.jpg
解决方案:
1.运行程序前先确认该目录是否存在。
2.查看该目录在hdfs的生成时间。
如图:
Al.jpg
由图可见,在程序抛出异常前该目录已经生成。请检查代码逻辑。

[编辑] 16、spark 任务找不到__spark_conf__zip

异常描述:
yarn 报出找不到__spark_conf__zip
Yarn error.png
driver 端显示任务已经成功
Driverlog.png
原因:任务实际已经运行成功,成功后会删除相关文件,但任务又被yarn重新拉起,导致文件找不到。
解决办法:检查代码逻辑,看saprkcontext或StreamingContext是否初始化成功。若没初始化就相当于运行了一个jar。

[编辑] 17、bonecp 连接hive元数据库失败,SQL State=08S01

异常描述:
Bonecperror.png
原因:由hive的bug引起,详情见[1]
解决:尝试重试

[编辑] spark streaming 常见问题

[编辑] 1、任务运行的慢

原因及解决:

  • 可能数据处理不过来,导致数据堆积。解决:可考虑加大一批数据的时间间隔(batch time) 或者看下是哪个操作导致的处理的慢,优化一下代码。
  • 可能是数据倾斜,有长尾任务。解决:若有shuffle操作,检查输入数据中是否有null 或者空值。把这些特殊的值先过滤掉。
  • 任务数过多:并行度太高,产生大量的任务启动和切换开销
  • 任务数过低:并行度过低,无法发挥集群并行计算能力,会导致任务执行慢

建议:
1)streaming 的任务最好不要写hdfs.会产生大量文件,会对hdfs集群造成很大压力。可写hbase 、redis、kafka等

2)推荐每个CPU CORE分配2-3个任务,在做shuffle 操作时可调整分区数。也可以通过spark.default.parallelism进行默认分区数配置。

[编辑] 2、接收的kafka 数据量少了

原因及解决:

  • 可能是kafka partition 扩容。spark 低阶API的话partition 扩容 spark 在receiver partition不会发生变化 会导致数据少了 解决办法:重启job
  • 查看下是否与其他job共用相同的group.
  • 低阶API 可能是 maxRatePerPartition 没有设置,或者设置的小导致获取到的数据量小了。解决:可根据kafka的消息量设置值。建议值 :kafka 每秒多少条数据*2/partition

[编辑] 3、spark hive 插数据觉得插不进去? 或者是job 数据延迟

spark hive 如果使用insert into 插数据,要批量插,一条语句就是一个mr job .如果数据量大的话,会导致插数据需要消耗很长时间,会导致job 有延迟,并会有数据没全部插进去的表象。

[编辑] 4、spark 或者streaming写hbase 报空指针

  • 确认有没有应用hbase 配置文件。--files hbase-site.xml
  • put 对象中是否 add row 和column

[编辑] 5、spark streaming 处理kafka数据任务没堆积 数据是延迟的怎么回事?

原因:数据的处理速度赶不上kafka 数据的生产速度。
解决办法:1)任务不延迟的情况下,适当减少batch time。
2)代码中的参数,fetch.message.max.bytes 参数设置适当加大。

[编辑] 6、spark streaming 处理kafka数据异常kafka.common.NotLeaderForPartitionException, org.apache.spark.SparkException: Couldn't find leader offsets for Set

原因:找不到leader 了,这种情况可能是kafka 集群做调整导致,若是调整集群导致,异常不可避免,可设置如下参数使任务不会失败掉
--conf spark.streaming.kafka.maxRetries=20 (重试次数,默认是1) --conf refresh.leader.backoff.ms=1000 (重试间隔,默认是200ms)

 

[编辑] 6、Caused by: java.lang.AssertionError: assertion failed: Ran out of messages before reaching ending offset xxx

可能原因: 1.任务停了一段时间,kafka中对应offset的数据已经删除。 2.数据量比较大 fetch时超过了限制

解决办法:1)原因 1 重置offset 或设置成正确的 offset
2)代码中的参数,fetch.message.max.bytes 参数值加大 (该参数为 kafka的参数 需要设置在 kafkaParams中 默认值为 1M )。

[编辑] spark mllib 异常问题

[编辑] 1、save model 是lzo 文件,load 模型解析异常

可以在save 模型的时候保存为非压缩格式的文件。参数mapreduce.output.fileoutputformat.compress 设置为false
参考代码:

val conf = new SparkConf()
val sc = new SparkContext(conf)
val configuration = sc.hadoopConfiguration
configuration.setBoolean("mapreduce.output.fileoutputformat.compress", false)

[编辑] 2、机器学习使用某算法时异常内存溢出 java.exception.OutOfMemory

可查看下数据是否有问题,导致数据倾斜问题。

[编辑] spark sql异常问题

[编辑] 1、执行sql报NULLPointerException异常

spark.sql("select token from (select * from defaultdb.table where date=20171030 and token is not null limit 1000) tmp group by token").show 解决:把limit去掉任务可正常 原因:具体原因待查证

[编辑] 2.Table or view not found

在spark脚本操作hive时找不到表。
解决:

  1.检查表是否存在。

  2.检查代码,是否添加enableHiveSupport()。

  3.提交脚本时是否制定配置文件。--files /usr/lib/software/spark/spark-2.1/conf/hive-site.xml 。注意:要指定spark-2.1下的hive-site.xml

  4.表前要加库名。

[编辑]3.hive和spark sql查询结果不一致

同一条语句,使用hive和spark sql查询结果不一致。
解决:

  1.使用hive检查表的分区字段是否与表字段一致,若不一致,删掉该分区,重新加载数据。

  2.检查join的字段类型,hive中bigint会转为double,导致匹配失败。可以改用spark sql查询。

[编辑]spark thriftsever异常问题

[编辑]select limit 语句hive瞬间出结果,thriftsever要很久

原因:hive对于select limit语句不会转成MR任务,计算过程在driver中执行,所以很快。对于spark来说不会在driver端计算,而是会启动task进行计算,
正常情况下速度也是很快,但由于某些原因造成task启动失败就会导致查询慢。

[编辑] 58dp 调度任务问题

[编辑] 1、任务调度不起来

查看任务是否指定了队列。spark 任务会默认指定队列。spark streaming 需要在spark 系统参数中指定 --queue 队列名
部门队列 可以到以下链接上查看。 http://10.126.81.187:9088/cluster (scheduler)

[编辑] 2、58dp 上日志没有appid, 退出码是127

任务没有正确调度起来,查看任务是否指定版本或者其它参数填写错误

[编辑] 3、58dp 上streaming任务提交后显示退出码是143,显示是运行成功。

这种情况代表任务提交正常,提交任务的客户端退出。直接看yarn 页面上的任务信息即可

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值