基础环境
配置
- 将Hive的conf目录下的hive-site-xml文件拷贝到spark的conf目录下;
- 将Hive中的mysql驱动包(mysql-connector-java-8.0.22.jar,根据自己mysql的版本进行选择)也拷贝到spark的jars目录下;
spark-shell
当完成了上面的步骤之后,在spaek-shell中,就可以访问hive了。
import org.apache.spark.sql.SparkSession
val warehouseLocation = "spark-warehouse"
val spark = SparkSession
.builder()
.appName("Spark Hive Example")
.config("spark.sql.warehouse.dir", warehouseLocation)
.enableHiveSupport()
.getOrCreate()
import spark.implicits._
import spark.sql
// 到这里,你就可以随意读取Hive了
// test是hive中的表名
df = sql("select * from test") // 返回spaek的DataFrame
df.show()
// 这里可以用sql语句,对Hive中的数据表进行任何的读写操作
sql(".....")
当然,这是在集群中的任意一个节点服务器中执行。
因此,你也可以使用spark-submit的方式。
最后,spark访问hive为什么这么简单呢?基本不需要什么复杂的配置?
这是因为hive的元数据实际还是存放在hdfs,所以,你的hadoop和spark集群配置才是关键工作,spark访问的根头还是hdfs。
错误规避
一、 Unable to instantiate SparkSession with Hive support because Hive classes are not found:
这个就是需要把spark-hive相关的包加到项目中。
坑人的是maven仓库官网中对spark-hive的引用是这样:
libraryDependencies += “org.apache.spark” %% “spark-hive” % “2.4.4” % “provided”
但是实际上,应该写成libraryDependencies += “org.apache.spark” %% “spark-hive” % “2.4.4”
二、Hive Schema version xxx does not match metastore’s schema version xxx Metastore is not upgraded or corrupt
解决方案:
1.登陆mysql,修改hive metastore版本:
进入mysql:mysql -uroot -p (123456)
use hive;
select * from version;
update VERSION set SCHEMA_VERSION='2.1.1' where VER_ID=1;
2.简单粗暴:在hvie-site.xml中关闭版本验证
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
三、Attempt to invoke the “HikariCP” plugin to create a ConnectionPool gave an error : The connection pool plugin of type “HikariCP” was not found in the CLASSPATH!
修改hive的数据库连接方式:
<property>
<name>datanucleus.connectionPoolingType</name>
<value>dbcp</value>
<description>
Expects one of [bonecp, dbcp, hikaricp, none].
Specify connection pool library for datanucleus
</description>
</property>