IDEA中使用Spark SQL 连接Hive

Spark SQL命令行模式是可以直接连接Hive的,Hive的安装和mysql作为metastore配置可以参考文章。将hive-site.xml复制到Spark-Home/conf目录下即可。但是通常我们需要使用IDEA开发调试程序,在IDEA中连接Hive有些需要注意的地方,这里记录一下,折腾了一下午。

1. 复制hive-site.xml

将Spark-Home/conf目录下的hive-site.xml复制到IDEA工程的resource目录下

2. 修改入口

Spark 2.x版本将SparkContext和HiveContext整合起来,统一使用SparkSession作为连接入口。所以建立连接需要使用如下代码

val conf = new SparkConf()
conf.setAppName("WordCount").setMaster("local")
val hive = SparkSession.builder().enableHiveSupport().config(conf).getOrCreate()
hive.sql(xxx)

一定要加上enableHiveSupport(),不然使用的是默认的配置,不会读取hive-site.xml
若使用Spark 1.X版本可以通过如下代码使用Hive

val sc = new SparkContext(conf)
val hive = new HiveContext(sc)
hive.sql(xxxx)

3. 修改hive-site.xml

若出现下面这种问题

18/04/15 19:27:14 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Exception in thread "main" java.lang.IllegalArgumentException: Error while instantiating 'org.apache.spark.sql.hive.HiveSessionStateBuilder':
........
Caused by: java.lang.RuntimeException: java.io.FileNotFoundException: File /user/hive/tmp does not exist
......

找不到/user/hive/tmp文件(对应于hive-site.xml中的目录),但是在HDFS上是存在该目录的。在命令行模式下可以直接访问没问题,那么就需要做一些修改。
将/user/hive/tmp改为hdfs://master/9000:/user/hive/tmp, hive-site.xml中的其他路径也做相同修改。因为直接通过命令行貌似默认hive-site.xml中的/user/hive/tmp就是在HDFS上的路径,但是在IDEA中则默认为系统的文件系统路径,所以会存在找不到文件或者目录的情况。
修改后的hive-site.xml

<configuration>
<property>
    <name>hive.exec.scratchdir</name>
    <value>hdfs://master:9000/user/hive/tmp</value>
</property>
<property>
    <name>hive.metastore.warehouse.dir</name>
    <value>hdfs://master:9000/user/hive/warehouse</value>
</property>
<property>
    <name>hive.querylog.location</name>
    <value>hdfs://master:9000/user/hive/log</value>
</property>
<property>
      <name>hive.metastore.uris</name>
      <value>thrift://localhost:9083</value>
 </property>

<property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&amp;characterEncoding=UTF-8&amp;useSSL=false</value>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>hive</value>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>hive</value>
</property>
</configuration>

之后就可以顺利访问啦!!!
测试代码:输出所有database

import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.sql.SparkSession

object TestHive {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf()
    conf.setAppName("TestHive").setMaster("local")
    val spark = SparkSession.builder().enableHiveSupport().config(conf).getOrCreate()

    spark.sql("show databases").collect().foreach(println)
  }
}

运行结果

18/04/15 19:35:49 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
[default]
[test]
Logo

更多推荐