当前位置:   article > 正文

Spark运维中遇到的问题_uncaught exception in thread shutdown-hook-0

uncaught exception in thread shutdown-hook-0

1、spark-shell进入scala交互界面报错。

Error: Cluster deploy mode is not applicable to Spark shells.

报错信息如下:

  1. Exception in thread "main" org.apache.spark.SparkException: Cluster deploy mode is not applicable to Spark shells.
  2. at org.apache.spark.deploy.SparkSubmit.error(SparkSubmit.scala:857)
  3. at org.apache.spark.deploy.SparkSubmit.prepareSubmitEnvironment(SparkSubmit.scala:292)
  4. at org.apache.spark.deploy.SparkSubmit.submit(SparkSubmit.scala:143)
  5. at org.apache.spark.deploy.SparkSubmit.doSubmit(SparkSubmit.scala:86)
  6. at org.apache.spark.deploy.SparkSubmit$$anon$2.doSubmit(SparkSubmit.scala:924)
  7. at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:933)
  8. at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

解决方案

使用命令:

spark-shell --master yarn --deploy-mode client

运行成功进入交互页面

原因是因为spark2-shell运行在yarn上面,需要指定模式yarn-client,如果指定yarn-cluster,则会报错:

Error: Cluster deploy mode is not applicable to Spark shells.

因为spark-shell作为一个与用户交互的命令行,必须将Driver运行在本地,而不是yarn上。

其中的参数与提交Spark应用程序到yarn上用法一样。

2、spark-shell进入scala交互界面报错。Exception in thread "main" java.lang.NoSuchMethodError: org.apache.log4j.spi.LoggingEvent.getLogger()Lorg/apache/log4j/Category;

  1. Exception in thread "main" java.lang.NoSuchMethodError: org.apache.log4j.spi.LoggingEvent.getLogger()Lorg/apache/log4j/Category;
  2. at org.apache.spark.internal.SparkShellLoggingFilter.decide(Logging.scala:239)
  3. ERROR util.Utils: Uncaught exception in thread shutdown-hook-0
  4. java.lang.NoSuchMethodError: org.apache.log4j.spi.LoggingEvent.getLogger()Lorg/apache/log4j/Category;
  5. WARN util.ShutdownHookManager: ShutdownHook '$anon$2' failed, java.util.concurrent.ExecutionException: java.lang.NoSuchMethodError: org.apache.log4j.spi.LoggingEvent.getLogger()Lorg/apache/log4j/Category;

查了一下应该是log的jar包冲突 把hive-jdbc-2.1.1-cdh6.3.2-standalone.jar  这个jar包换了个名字 再运行spark-shell 就可以了

 3、启动多个spark-shell一直卡主不动,yarn处于ACCEPTED,spark-shell启动多个,从第二个开始,在default队列下,park-shell一直卡主不动,yarn处于ACCEPTED

原因是因为:

  1. 添加以下参数
  2. <property>
  3. <!-- Maximum resources to allocate to application masters
  4. If this is too high application masters can crowd out actual work -->
  5. <name>yarn.scheduler.capacity.maximum-am-resource-percent</name>
  6. <value>0.5</value>
  7. </property>

4、spark参数num-executors未生效

问题:

  1. spark-submit --master yarn --conf spark.default.parallelism=100 \
  2. --deploy-mode cluster --driver-memory 4G  --executor-memory 4G  \
  3. --num-executors 40  --executor-cores 2 \
  4. --conf spark.yarn.executor.memoryOverhead=5g \
  5. --class com.lz.hbase.CompanyInfo /tmp/test/original-spark_hbase01-1.0-SNAPSHOT.jar

以上提交参数中的--num-executors 40没有生效,executors 大于40并且占满yarn资源,导致后来的yarn任务阻塞

原因:

官方参数解释

  1. --num-executors NUM
  2. Number of executors to launch (Default: 2).
  3. If dynamic allocation is enabled, the initial number of executors will be at least NUM.
  4. 当开启动态分配时,num-executors成为了最小executors 数,而cdh中spark默认开启dynamic allocation,所以当yarn队列资源空闲时,真正的excutor数会大于设置的num-executors

解决方案:

提交参数添加--conf spark.dynamicAllocation.maxExecutors=40 限制最大excutor数

  1. 附:spark提交任务模板
  2. spark-submit --master yarn --conf spark.default.parallelism=100 \
  3. --conf spark.dynamicAllocation.maxExecutors=40\
  4. --deploy-mode cluster --driver-memory 4G --executor-memory 4G \
  5. --num-executors 40 --executor-cores 3 \
  6. --conf spark.yarn.executor.memoryOverhead=4G \
  7. --class com.lz.hbase.CompanyInfo /tmp/test_langzi/original-spark_hbase01-1.0-SNAPSHOT.jar

5、spark on yarn报错: Futures timed out after 100000 milliseconds

在提交任务命令或者启动配置文件里添加

  1. --conf spark.network.timeout=600
  2. 单位是s 不用写
  3. --conf spark.yarn.am.waitTime=6000s
  4. --conf spark.sql.broadcastTimeout= 6000
  5. 看文档这两个参数也可能有用 可以加了试试

6.spark任务执行变慢。报错CANNOT FIND ADDRESS

开发同事反馈spark任务变得很慢 原来1小时的任务需要执行7小时 找他要到任务id 

去spark ui上找到对应的任务。点进去找到时间很长的任务。

然后再点时间很长的阶段。

点进去

看 aggregated metrics by executor 

发现一大堆CANNOT FIND ADDRESS   google了一下发现没什么线索。。似乎大家都没遇到过这个问题。 根据报错信息怀疑是spark 找不到对应节点 。查了一下服务器上的hosts文件 果然提交任务的ds没有配置整个机器的完整hosts映射列表  补全后执行 。解决问题

6.spark submit hive任务报错 org.apache.hadoop.hbase.security.AccessDeniedException: Insufficient permissions  (user=test@cdh.com,scope=hbase.meta,params=[table=hbase:meta], action=EXEC)

虽然全程是操作hive  但是却报了这个错误 ,虽然没有交互到但是spark会校验权限  在submit的命令行里添加一下这个参数就行

spark.security.credentials.hbase.enabled=false

7、spark 操作hive 报错 hive.ql.metadata.hiveexception metaexxception does not have privileges for

这不是官方支持的方式。特别是开启了认证之后,开启认证授权后,其实是要求仅使用beeline/jdbc连接hive的方式,连hive cli的方式都是不支持的,原因是hive metastore不支持,spark操作hive的方式和hive cli的方式应该是一致的。

 

 Unsupported Features in CDH 6.3.0 | 6.x | Cloudera Documentation

Authorization With Apache Sentry | 6.3.x | Cloudera Documentation

一定要用的话有两种方式

一个是使用hive权限。另一个是让用户的权限能直接操作hdfs ,本质上都是让你的用户可以直接操作hdfs文件

8、spark 任务卡在最后几个  输出removed broadcast on in memory

去spark的页面查看一下任务的执行情况 ,有执行时间特别长的子任务可能是数据倾斜 。执行时间比较平均的话先增加一点资源。可能是资源不足 。也有可能是因为临时文件写满了磁盘,此时可以尝试 把 yarn.nodemanager.local-dirs  换到比较大的磁盘或者拆分任务

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/265925
推荐阅读
相关标签
  

闽ICP备14008679号