文档首页/ MapReduce服务 MRS/ 故障排除/ 使用Spark/ spark-shell执行SQL跨文件系统load数据到Hive表失败
更新时间:2023-11-10 GMT+08:00

spark-shell执行SQL跨文件系统load数据到Hive表失败

用户问题

使用spark-shell命令执行SQL或者spark-submit提交的Spark任务里面有SQL的load命令,并且原数据和目标表存储位置不是同一套文件系统,上述两种方式MapReduce任务启动时会报错。

原因分析

当使用load导入数据到Hive表的时候,属于需要跨文件系统的情况(例如原数据在HDFS上,而Hive表数据存放在OBS上),并且文件长度大于阈值(默认32 MB),则会触发使用distcp的MapReduce任务来执行数据迁移操作。这个MapReduce任务配置直接从Spark任务配置里面提取,但是Spark任务的net.topology.node.switch.mapping.impl配置项不是hadoop的默认值,需要使用Spark的jar包,因此MapReduce会报类找不到。

处理步骤

方案一:

如果文件较小,则可以将默认长度设置得大于文件最大长度,例如最大的文件是95 MB,则设置:

hive.exec.copyfile.maxsize=104857600

方案二:

如果确实文件较大,需要使用distcp任务来提高数据迁移效率,则可以在Spark任务启动的时候增加设置参数:

--conf spark.hadoop.net.topology.node.switch.mapping.impl=org.apache.hadoop.net.ScriptBasedMapping