Spark3.3.2适配Hadoop3踩坑填坑

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节点集群,千兆网环境)

项目(秒)第一次第二次第三次
对照组242222
设置jars151313

结果可以发现平均快了9秒左右,整体执行速度提高了64%。

结论:这对小型任务的加速效果还是不错的。

5. Spark History Server不显示历史任务

上面测试完任务提交后,到History UI界面查看不到任务,显示没有完成的任务,也没有进行中的任务。

页面提示是否正确设置了spark.history.fs.logDirectory和权限是否有权限访问。

解决办法三部曲:

  1. 检查一下spark-defaults中的spark.history.fs.logDirectory配置,如hdfs:///user/spark-hitory
  2. 再检查一下spark任务运行时配置的这个目录是否与配置相同;
  3. 最重要的/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>

综上,初步的适配及调优都已完成,有其他问题再补充。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1024点线面

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值