spark 连接远程hive调试的3种方法

张映 发表于 2020-01-02

分类目录: hadoop/spark/scala

标签:, , , ,

在看本文前,请先阅读一下: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 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 spark-sql 通过thrift的方式连接hive

小结:

1,打包发布的时候,把debug用的代码拿掉。因为没用。

2,如果namenode做了ha,本篇文章是不适用的。因为ha的namespace本地无法识别。



转载请注明
作者:海底苍鹰
地址:http://blog.51yip.com/hadoop/2338.html