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