在看本文前,请先阅读一下: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