spark的排错和调优

2022-05-31 00:00:00 程序 版本 解决 倾斜 被占

1、错误出现scala版本冲突问题

The version of scala library found in the build path of TestSpark (2.10.5) is prior to the one provided by scala IDE (2.11.7). Setting a Scala Installation Choice to match.	TestSpark		Unknown	Scala Version Problem
复制代码

解决方法:

新建scala工程
1.在工程中移除自带的scala版本库
1.添加spark 库spark-assembly-1.1.0-cdh5.2.0-hadoop2.5.0-cdh5.2.0.jar
3.修改工程中的scala编译版本
4.右击 –> Scala –> set the Scala Installation

也可以

右击工程–> Properties –> Scala Compiler –> Use project Setting 中选择spark对应的scala版本,此处选择Lastest2.10 bundle

2、问题: val rdd = data.filter(f1).filter(f2).reduceBy…经过以上 语句会有很多空任务或者⼩小任务

  • 解决: 使⽤用coalesce或者repartition去减少RDD中partition 数量
    ##3、问题: 每个记录的开销太⼤大 rdd.map{x=>conn=getDBConn;conn.write(x.toString);co nn.close}
  • 解决:rdd.mapPartitions(records => conn.getDBConn;for(item <records))write(item.toString); conn.close)

3、问题: 任务执⾏行速度倾斜

  • 3.1、 数据倾斜(一般是partition key取的不好) ,考虑其它的并行处理⽅方式中间可以加入一步 aggregation
  • 3.2、Worker倾斜(在某些worker上的executor不给力) ,设置spark.speculation=true 把那些持续不给力的node去掉

###4、问题: 不设置spark.local.dir 这是spark写shuffle输出的地⽅
解决: 设置⼀一组磁盘 spark.local.dir=/mn1/spark, /mnt2/spar, /mnt3/spark
增加IO即加快速度

5、问题: reducer数量不合适

解决: 需要按照实际情况调整
太多的reducer,造成很多的小任务,以此产⽣生很多启动任 务的开销。
太少的reducer,任务执⾏行慢!
reduce的任务数还会影响到内存

6、问题 : collect输出⼤大量结果慢,审视源码

解决 : 直接输出到分布式⽂文件系统

7、 问题:序列化 , Spark默认使⽤用JDK⾃自带的ObjectOutputStream

兼容性好,体积大,速度慢
解决: 使⽤用Kryo serialization

  • 体积小,速度快

8、 FAILED SelectChannelConnector@0.0.0.0:4040: java.net.BindException: Address already in use: bindjava.net.BindException: Address already in use: bind

产生错误的背景描述: 发送一个请求到netty server,netty server启动一个spark 程序,spark 程序的执行结果返回给netty client,关闭netty client,再起一个netty client,就出现上面的情况。

分析:spark应用程序提交的时候是首先从4040端口开始的,如果被占用,会使用4041,如果还被占用,就使用4042,一直轮询下去。也可以在程序中配置 spark.ui.port 属性使用指定端口。上述案例中由于上一个spark 程序没有正常结束,才导致端口一直被占用。

9、org.apache.spark.SparkException: Only one SparkContext may be running in this JVM (see SPARK-2243). To ignore this error, set spark.driver.allowMultipleContexts = true.

解决方法:sparkConf.set(“spark.driver.allowMultipleContexts”,“true”);

10、spark-submit的时候如何引入外部jar包

  • 在通过spark-submit提交任务时,可以通过添加配置参数来指定

    • -driver-class-path 外部jar包
  • –j ars 外部jar包

相关文章