Spark SQL load hdfs数据报错解决方法

问题描述:

在使用spark sql 加载 hdfs 上的数据的时候报错,加载本地的就没问题,一直报找不到路径的错,但是hdfs上是有文件的

load data inpath 'data/spark/teacher_basic.txt' into table spark_on_hive.teacher_basic

在spark sql上 run这个load语句报错:

Error in query: java.lang.IlleagalArgumentException: Wrong FS: hdfs:/, expected: file:///;

在这里插入图片描述
在hive里面run同样的语句却可以执行

load data inpath 'data/spark/teacher_basic.txt' into table spark_on_hive.teacher_basic

在这里插入图片描述

如果与我的情况一样,那么报错的原因是因为hive-site.xml少了配置

大家在配hive的时候hive-site一般是这么配的

<configuration>
	<property>
		<name>javax.jdo.option.ConnectionURL</name>
		<value>jdbc:mysql://localhost:3306/hive_bd1906?createDatabaseIfNotExist=true</value>
		<description>JDBC connect string for a JDBC metastore</description>
		<!-- 配置的mysql的连接url 如果 mysql 和 hive 在同一个服务器节点,那么请更改 hadoop03 为 localhost -->
	</property>
	<property>
		<name>javax.jdo.option.ConnectionDriverName</name>
		<value>com.mysql.jdbc.Driver</value>
		<description>mysql的驱动类</description>
	</property>
	<property>
		<name>javax.jdo.option.ConnectionUserName</name>
		<value>root</value>
		<description>mysql用户名</description>
	</property>
	<property>
		<name>javax.jdo.option.ConnectionPassword</name>
		<value>123456</value>
		<description>mysql密码</description>
	</property>
</configuration>

不需要配下面这个参数

<property>
	<name>hive.metastore.warehouse.dir</name>
	<value>/user/hive/warehouse</value>
	<description>hive default warehouse, if nessecory, change it</description>
</property>

因为这个路径就是hive默认的路径,所以在hive中run的时候是没有问题的。但是在spark sql中,它首先会去读你的配置文件,它从你的配置文件中读不到hive.metastore.warehouse.dir这个属性,所以它就调用了spark 自带的hive-site.xml,使用的是元数据库derby,所以自然它就找不到我们hdfs上的路径了

解决办法:

先备份hive里面的数据!!!
修改hive-site.xml,重新初始化元数据库,然后将hive-site放在$SPARK_HOME/conf下,重新启动spark sql即可

自行备份数据,修改hive-site.xml

<configuration>
	<property>
		<name>javax.jdo.option.ConnectionURL</name>
		<value>jdbc:mysql://localhost:3306/hive_bd1906?createDatabaseIfNotExist=true</value>
		<description>JDBC connect string for a JDBC metastore</description>
		<!-- 配置的mysql的连接url 如果 mysql 和 hive 在同一个服务器节点,那么请更改 hadoop03 为 localhost -->
	</property>
	<property>
		<name>javax.jdo.option.ConnectionDriverName</name>
		<value>com.mysql.jdbc.Driver</value>
		<description>mysql的驱动类</description>
	</property>
	<property>
		<name>javax.jdo.option.ConnectionUserName</name>
		<value>root</value>
		<description>mysql用户名</description>
	</property>
	<property>
		<name>javax.jdo.option.ConnectionPassword</name>
		<value>123456</value>
		<description>mysql密码</description>
	</property>
	<property>
		<name>hive.metastore.uris</name>
		<value>thrift://hadoop03:9083</value>
	</property>
	<property>
		<name>hive.metastore.warehouse.dir</name>
		<value>/user/hive/warehouse</value>
		<description>hive default warehouse, if nessecory, change it</description>
	</property>
</configuration>

登录到mysql,删除hive的元数据库

mysql> drop database hive_bd1906;

重新初始化元数据库

schematool -dbType mysql -initSchema

将hive-site.xml拷贝到$SPARK_HOME/conf下,(hdfs-site&core-site&mysql jdbc 连接的jar包也需要拷贝到这个目录下)

cp hive-site.xml /$SPARK_HOME/conf

后台启动hive服务

nohup hive --service metastore 1>/home/hadoop/logs/hive_thriftserver.log 2>&1 &

重新启动spark sql

spark-sql

在这里插入图片描述

问题解决

发布了110 篇原创文章 · 获赞 289 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/a805814077/article/details/104522114