问题描述:
在使用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
问题解决