Spark连接Hive,进行Hive数据表的读写操作

  1. Hadoop安装-1hadoop安装-2
  2. spark安装
  3. Hive安装
  1. 将Hive的conf目录下的hive-site-xml文件拷贝到spark的conf目录下;
  2. 将Hive中的mysql驱动包(mysql-connector-java-8.0.22.jar,根据自己mysql的版本进行选择)也拷贝到spark的jars目录下;

当完成了上面的步骤之后,在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>