在看本文前,请先阅读一下:scala spark sql 本地调试
本地spark连接远程hive,这样就可以不用自己造数据,或者从远程copy数据了。
前言:
想本地,spark连接远程hive,进行调试,要加载spark-hive包
//build.sbt增加
libraryDependencies ++= Seq(
"org.apache.spark" % "spark-core_2.11" % "2.3.0",
"org.apache.spark" % "spark-hive_2.11" % "2.3.0",
"org.apache.spark" % "spark-sql_2.11" % "2.3.0"
)
//pom.xml增加
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-hive_2.11</artifactId>
<version>2.3.0</version>
</dependency>
注意:版本不能是spark-hive_2.12,不然会报以下错误:
Exception in thread "main" java.lang.NoSuchMethodError: scala.Product.$init$(Lscala/Product;)V
一,测试代码
package com.tanktest
import org.apache.spark.sql.SparkSession
object tankzhang {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder().
master("local").
enableHiveSupport().
appName("tanktest").getOrCreate()
spark.sql("show databases").show()
}
}
二,通过javax连接hive元数据库的方式(方法一)
1,修改pom.xml
<dependencies> //在dependencies里面,如果没有,添加以下内容
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
</dependencies>
<resources> //检查一下build里面,有没有设置资源目录,没有添加
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/**</include>
</includes>
</resource>
</resources>
2,在src/main/resources目录下,建hive-site.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://bigserver1:3306/metastore?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>cdh6</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>Cdh6_123</value>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/home/cdh6/hive/warehouse</value>
</property>
</configuration>
3,测试结果
spark-sql javax的方式连接hive
三,通过thrift server的方式(方法二)
1,服务器查看ThriftMetastore是否启动
[root@bigserver1 ~]# netstat -tpnl |grep 9083 tcp 0 0 0.0.0.0:9083 0.0.0.0:* LISTEN 28524/java
如果没有启动,# hive --service metastore &
2,在src/main/resources目录下的hive-site.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hive.metastore.uris</name>
<value>thrift://bigserver1:9083,thrift://bigserver5:9083</value>
</property>
</configuration>
比方法一就简单多了。
四,代码端通过thrift server的方式(方法三)
object tankzhang {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder().
master("local").
config("hive.metastore.uris", "thrift://bigserver1:9083"). //多个thrift,逗号隔开
enableHiveSupport().
appName("tanktest").getOrCreate()
spark.sql("show databases").show()
}
}
这种方法是最简单的。
spark-sql 通过thrift的方式连接hive
小结:
1,打包发布的时候,把debug用的代码拿掉。因为没用。
2,如果namenode做了ha,本篇文章是不适用的。因为ha的namespace本地无法识别。
转载请注明
作者:海底苍鹰
地址:http://blog.51yip.com/hadoop/2338.html