【问题标题】:Unable to get existing Hive tables from HiveContext using Spark无法使用 Spark 从 HiveContext 获取现有 Hive 表
【发布时间】:2018-04-25 17:49:36
【问题描述】:

我正在尝试使用 HiveContext 从 spark 获取 Hive 的数据库或表详细信息。但我无法指向现有的 Hive 数据库,如下所示: 火花版本:2.2.0 蜂巢版本:2.3.0

在 Spark Shell 中使用下面的脚本连接到现有的 Hive 服务器(下面使用的 127.0.0.1 是我的机器 ip 地址):

scala> val hc = new org.apache.spark.sql.hive.HiveContext(sc)
warning: there was one deprecation warning; re-run with -deprecation for details
hc: org.apache.spark.sql.hive.HiveContext = org.apache.spark.sql.hive.HiveContext@6dde913e

scala> hc.setConf("hive.metastore.uris","thrift://127.0.0.1:9083")

scala> val df = hc.sql("show databases")
df: org.apache.spark.sql.DataFrame = [databaseName: string]

scala> df.show
+------------+
|databaseName|
+------------+
|     default|
+------------+


scala> val dfTables = hc.sql("show tables");
dfTables: org.apache.spark.sql.DataFrame = [database: string, tableName: string ... 1 more field]

scala> dfTables.show
+--------+---------+-----------+
|database|tableName|isTemporary|
+--------+---------+-----------+
+--------+---------+-----------+

如上所示,我无法获取现有的 Hive 数据库和表。 HiveContext 指向新数据库(默认)并且没有可用的表。 下面列出了我的配置单元数据库:

hive> show databases;
OK
default
mydbbackup
Time taken: 7.593 seconds, Fetched: 2 row(s)
hive> use mydbbackup;
OK
Time taken: 0.021 seconds
hive> show tables;
OK
customers
customerspart
customerspart1
Time taken: 0.194 seconds, Fetched: 3 row(s)
hive> 

下面是我的 hive-site.xml:

<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:derby:;databaseName=/home/hduser/apache-hive-2.3.0-bin/metastore_db;create=true</value>
<description>
JDBC connect string for a JDBC metastore.
To use SSL to encrypt/authenticate the connection, provide database-specific SSL flag in the connection URL.
For example, jdbc:postgresql://myhost/db?ssl=true for postgres database.
</description>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
<description>location of default database for the warehouse</description>
</property>
<property>
<name>hive.metastore.uris</name>
<value/>
<description>Thrift URI for the remote metastore. Used by metastore client to connect to remote metastore.</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>org.apache.derby.jdbc.EmbeddedDriver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.PersistenceManagerFactoryClass</name>
<value>org.datanucleus.api.jdo.JDOPersistenceManagerFactory</value>
<description>class implementing the jdo persistence</description>
</property>
</configuration>

下面是我的 spark conf 目录:

total 40
drwxr-xr-x  2 root root 4096 Nov 12 20:22 ./
drwxr-xr-x 12 root root 4096 Nov  9 22:57 ../
-rw-r--r--  1 root root  996 Nov  9 22:57 docker.properties.template
-rw-r--r--  1 root root 1105 Nov  9 22:57 fairscheduler.xml.template
-rw-r--r--  1 root root 2025 Nov  9 22:57 log4j.properties.template
-rw-r--r--  1 root root 7313 Nov  9 22:57 metrics.properties.template
-rw-r--r--  1 root root  865 Nov  9 22:57 slaves.template
-rw-r--r--  1 root root 1292 Nov  9 22:57 spark-defaults.conf.template
-rwxr-xr-x  1 root root 3699 Nov  9 22:57 spark-env.sh.template*

我是否需要修改任何东西以指向现有的 Hive 服务器而不是创建新的。请帮助我。

【问题讨论】:

  • 为此您需要在 hive 和 spark 之间设置公共元存储
  • 你不需要显式地创建一个 hive contect。您可以直接使用 spark2 创建的 spark 会话来运行与 hive 相关的查询。使用 scala> spark.sql("show databases") res0: org.apache.spark.sql.DataFrame = [databaseName: string]
  • @AmitKumar 我尝试使用与您建议的相同但仅显示默认数据库的方法。你能帮我配置hive和spark之间的通用元存储吗?
  • 我没有看到 hive-site.xml 中更新的元存储值。 hive.metastore.uris远程元存储的Thrift URI。 Metastore 客户端用于连接到远程 Metastore。
  • 您可以尝试将 spark2 shell 启动为:spark2-shell --conf hive.metastore.uris=thrift://127.0.0.1:9083

标签: hadoop apache-spark hive spark-dataframe hivecontext


【解决方案1】:

如下图所示启动你的spark shell:

./spark-shell --driver-java-options 
"-Dhive.metastore.uris=thrift://localhost:9083"

【讨论】:

    【解决方案2】:

    这将为您提供所需的结果:

    导入 org.apache.spark.sql.hive.HiveContext

    val hc = new HiveContext(sc)

    导入 hc.implicits._

    val df = hc.sql("显示数据库")

    df.show

    【讨论】:

      【解决方案3】:

      在 hive-site.xml 中使用属性:

      <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://<<hostname>>:<<port>>/hive?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>username</value>
      </property>
      
      <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>password</value>
      </property>
      

      然后将hive-site.xml放到spark安装的conf文件夹中再试一次

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-08
        • 1970-01-01
        • 2019-06-07
        • 1970-01-01
        • 2018-05-06
        • 2023-03-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多