场景: spark on hive 使用sparksql查询hive的ORC表。
select * from evchk_ods.ODS_CAR_DRIVE_INFO_P_D
报错如下:
java.sql.SQLException: java.lang.RuntimeException: serious problem
at org.apache.hive.jdbc.HiveStatement.execute(HiveStatement.java:279)
at org.apache.hive.jdbc.HiveStatement.executeQuery(HiveStatement.java:375)
at com.xxxxx.xxxxx.datasource.dao.impl.AbstractDataSource.executeQuery(AbstractDataSource.java:465)
at com.xxxxx.xxxxx.datasource.dao.impl.AbstractDataSource.executeOneSql(AbstractDataSource.java:386)
at com.xxxxx.xxxxx.datasource.dao.impl.AbstractDataSource.sqlExecute(AbstractDataSource.java:333)
at com.xxxxx.xxxxx.datasource.dao.impl.AbstractDataSource.sqlExecute(AbstractDataSource.java:319)
at com.xxxxx.xxxxx.web.thread.QueryTask.run(QueryTask.java:91)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:748)
度娘一下相关资料,解决方案如下三种:
- set hive.fetch.task.conversion=none; (失败)
- set hive.exec.orc.split.strategy=BI; (失败)
- set hive.execution.engine=mr; (成功,但是不符合本意。本来需求就是用sparksql,这里设置了执行引擎为MR
最终解决方案:
在hive的配置文件hive-site.xml增加配置如下:
<property>
<name>hive.orc.compute.splits.num.threads</name>
<value>500</value>
</property>
然后用修改后的hive-site.xml 重新覆盖spark配置目录下的hive-site.xml文件。
或者直接在spark配置目录下的hive-site.xml中增加上述配置,然后重启hive和spark。
最后成功执行sql,查询数据和插入表。