Spark 3.3.2是一个包含稳定性修复的维护版本。这个版本是基于Spark的3.3版本线最新维护分支。
1. spark-shell启动报错NoClassDefFoundError
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/shaded/javax/ws/rs/core/NoContentException
解决方案:
网上有说将 {SPARK_HOME}/jars/hadoop-client-runtime-3.3.2.jar 替换为hadoop-client-runtime-3.3.1.jar
是否科学?这种做法比较清奇,待抽空验证。
另一解决方案更为合理:
参考相似问题解法是:在/etc/hadoop/yarn-site.xml中将yarn.timeline-service.enabled设置的true-更新为false,之后错误消失了。
能用配置解决的,就不要换包。但这样是修改YARN的配置,显然不太可取,更合适的做法是增加Spark的配置,我实际解决办法是配置Spark的参数:
spark.hadoop.yarn.timeline-service.enabled=false
此外还实测了另外一种解决办法:
将spark自带的hadoop的4个jar包统统删除,然后在spark-env.sh中配置一个环境变量即可解决:
export SPARK_DIST_CLASSPATH=$(hadoop classpath)
这种办法也是可行的,但要求Hadoop客户端与Spark同一台机器部署。
2. Spark Thrift Server启动失败找不到配置文件
spark thrift server启动报错找不到fairscheduler.xml这样一个配置文件,但在本地路径上确实存在该文件,内容及权限均正常。因为该配置及启动命令在spark 3.1.1版本完全正常,多次尝试后无果,因此颇为苦恼。
解决方案:
发现报错与hadoop相关,怀疑实际上是在HDFS上找不到对应的文件,因此修改对应的路径为file://开头解决了。
而在spark 3.1.1时是无需特地将路径加上协议符号的,应该是在当前的3.3.2版本变为了默认从HDFS读取。
3. 如有Yarn Shuffle问题
报错主要内容是:Class org.apache.spark.network.yarn.YarnShuffleService not found
解决方案:
将{SPARK_HOME}/yarn 下的spark-3.3.2-yarn-shuffle.jar 复制到 /usr/hdp/3.0.1.0-187/hadoop-yarn/lib/ 下
或配置yarn的相应参数:
<property>
<name>yarn.nodemanager.aux-services.spark_shuffle.class</name>
<value>org.apache.spark.network.yarn.YarnShuffleService</value>
</property>
# yarn.nodemanager.aux-services.spark_shuffle.classpth配置为jar包所在路径也可!
# 也就是{SPARK_HOME}/yarn/*
如果上述配置不正确会导致NodeManager启动后挂掉或者无法启动。
4. 设置spark.yarn.jars加速任务提交
测试提交任务时,总是警告未设置上述变量,实测一下配置后的加速效果如何。
# 上传本地jar包
hdfs dfs -mkdir /user/spark/spark3jars
hdfs dfs -put /usr/hdp/3.1.0.1-187/spark3/jars/* /user/spark/spark3jars/
# 然后提交任务时可以指定 --conf spark.yarn.jars=hdfs:///user/spark/spark3jars/*
做个对比,设不设置该参数提交各3次相同任务,结果如下:
(虚拟机3节点集群,千兆网环境)
| 项目(秒) | 第一次 | 第二次 | 第三次 |
|---|---|---|---|
| 对照组 | 24 | 22 | 22 |
| 设置jars | 15 | 13 | 13 |
结果可以发现平均快了9秒左右,整体执行速度提高了64%。
结论:这对小型任务的加速效果还是不错的。
5. Spark History Server不显示历史任务
上面测试完任务提交后,到History UI界面查看不到任务,显示没有完成的任务,也没有进行中的任务。
页面提示是否正确设置了spark.history.fs.logDirectory和权限是否有权限访问。
解决办法三部曲:
- 检查一下
spark-defaults中的spark.history.fs.logDirectory配置,如hdfs:///user/spark-hitory; - 再检查一下spark任务运行时配置的这个目录是否与配置相同;
- 最重要的
/user/spark-hitory的属主owner是否是spark,也就是权限要对,一切就绪重启History Server即可,可以看到历史任务日志了。
一般是手动创建的日志目录才会导致权限问题。
6. 其他周边问题
Hive 开启 Ranger权限验证后:使用自定义参数 set xxx 时会报错:
Error while processing statement: Cannot modify xxx at runtime. It is not in list of params that are allowed to be modified at runtime.
解决办法:
在hiveserver2.xml中加入以下参数,通配以|隔开:
<property>
<name>hive.security.authorization.sqlstd.confwhitelist</name>
<value>parquet.*|hive.*|mapreduce.*|spark.*|yarn.*</value>
</property>
# 我只设置了上述一个配置就可以了,还有说再增加下面这样一个:
<property>
<name>hive.security.authorization.sqlstd.confwhitelist.append</name>
<value>mapred.*|hive.*|mapreduce.*|spark.*</value>
</property>
综上,初步的适配及调优都已完成,有其他问题再补充。