简单搞定Spark性能优化:常见异常解决(一)

32 篇文章 3 订阅
28 篇文章 1 订阅

spark日志查看方法

分享一个博客:https://blog.csdn.net/qq_33588730/article/details/109353336

 

异常集

1. org.apache.spark.SparkException: Kryo serialization failed: Buffer overflow

原因:kryo序列化缓存空间不足。

解决方法:增加参数,--conf spark.kryoserializer.buffer.max=2047m。

 

2. org.elasticsearch.hadoop.rest.EsHadoopNoNodesLeftException: Connection error

原因:此时es.port可能为9300,因为ElasticSearch客户端程序除了Java使用TCP方式连接ES集群以外,其他语言基本上都是使用的Http方式,ES客户端默认TCP端口为9300,而HTTP默认端口为9200。elasticsearch-hadoop使用的就是HTTP方式连接的ES集群。

解决方法:可以将es.port设置为 9200。

 

3. Error in query: nondeterministic expressions are only allowed in Project, Filter, Aggregate or Window, found

解决方法:如果是SparkSQL脚本,则rand()等函数不能出现在join...on的后面。

 

4. driver端日志中频繁出现:Application report for application_xxx_xxx (stage: ACCEPTED)

解决方法:通过yarn UI左侧的“Scheduler”界面,搜索自己任务提交的yarn队列,查看资源是否用完,与同队列同事协调资源的合理使用,优化资源使用量不合理的任务,如下所示:

 

5. Spark任务数据量过大(如上百亿条记录)跑不过去

原因:数据量过大导致executor内存扛不住那么多数据。

解决方法:增加参数,--conf spark.shuffle.spill.numElementsForceSpillThreshold=2000000,将过量数据写入到磁盘中。

 

6. user clas threw exeception:ml.dmlc.xgboost4j.java.XGBoostError:XGBoostModel trained failed, caused by Values to assemble cannot be null

原因:机器学习训练数据中有为null的地方。

解决方法:把数据中有null的地方去掉,或对null值先进行预处理再训练。

 

7. Caused by: org.apache.spark.sql.catalyst.parser.ParseException: Datatype void is not supported

原因:Spark不支持Hive表中的void字段类型,代码中临时create的Hive表中,如果from的源表中某字段为全空值,则create table时该临时表的这个字段类型就会变成void。

解决方法:如果是上面这种情况,可以用Hive跑任务或者修改该Hive表的字段类型不为void,或将null转换为string等。

 

8. ERROR SparkUI: Failed to bind SparkUI java.net.BindException: Address already in use: Service failed after 16 retries

原因:Spark UI端口绑定尝试连续16个端口都已被占用

解决方法:可以把spark.port.maxRetries参数调的更大如128。

 

9. Error in Query: Cannot create a table having a column whose name contains commas in Hive metastore

解决方法:查看SparkSQL脚本中是否存在类似于“round(t1.sim_score , 5)”这种以函数结果作为字段值的语句,后面如果没加“as”别名会导致该错误。

 

10. Fail to send RPC to ...

原因:数据量过大超出默认参数设置的内存分配阈值,container会被yarn杀掉,其他节点再从该节点拉数据时,会连不上。

解决方法:可以优化代码将过多的连续join语句(超过5个)拆分,每3个左右的连续join语句结果生成一个临时表,该临时表再和后面两三个连续join组合,再生成下一个临时表,并在临时表中提前过滤不必要的数据量,使多余数据不参与后续计算处理。只有在代码逻辑性能和参数合理的前提下,最后才能增加--executor-memory、--driver-memory等资源,不能本末倒置。

 

未完待续。。。

 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值