【问题标题】:Accessing Shark tables (Hive) from Scala (shark-shell)从 Scala (shark-shell) 访问 Shark 表 (Hive)
【发布时间】:2014-05-12 15:08:06
【问题描述】:

我有shark-0.8.0,它在hive-0.9.0 上运行。我可以通过调用shark 在 Hive 上编程。我创建了一些表并在其中加载了数据。

现在,我正在尝试使用Scala 访问这些表中的数据。我使用shark-shell 调用了Scala shell。但是当我尝试选择时,我收到一个错误,表明该表不存在。

scala> val artists = sc.sql2rdd("select artist from default.lastfm")

Hive history file=/tmp/hduser2/hive_job_log_hduser2_201405091617_1513149542.txt
151.738: [GC 317312K->83626K(1005568K), 0.0975990 secs]
151.836: [Full GC 83626K->76005K(1005568K), 0.4523880 secs]
152.313: [GC 80536K->76140K(1005568K), 0.0030990 secs]
152.316: [Full GC 76140K->62214K(1005568K), 0.1716240 secs]
FAILED: Error in semantic analysis: Line 1:19 Table not found 'lastfm'
shark.api.QueryExecutionException: FAILED: Error in semantic analysis: Line 1:19 Table not found 'lastfm'
    at shark.SharkDriver.tableRdd(SharkDriver.scala:149)
    at shark.SharkContext.sql2rdd(SharkContext.scala:100)
    at <init>(<console>:17)
    at <init>(<console>:22)
    at <init>(<console>:24)
    at <init>(<console>:26)
    at <init>(<console>:28)
    at <init>(<console>:30)
    at <init>(<console>:32)
    at .<init>(<console>:36)
    at .<clinit>(<console>)
    at .<init>(<console>:11)
    at .<clinit>(<console>)
    at $export(<console>)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.spark.repl.SparkIMain$ReadEvalPrint.call(SparkIMain.scala:629)
    at org.apache.spark.repl.SparkIMain$Request$$anonfun$10.apply(SparkIMain.scala:890)
    at scala.tools.nsc.interpreter.Line$$anonfun$1.apply$mcV$sp(Line.scala:43)
    at scala.tools.nsc.io.package$$anon$2.run(package.scala:25)
    at java.lang.Thread.run(Thread.java:744)

根据文档 (https://github.com/amplab/shark/wiki/Shark-User-Guide),这些步骤足以启动并运行 Shark 并使用 Scala 选择数据。还是我错过了什么?是否需要修改一些配置文件才能从shark-shell 访问 Shark?

【问题讨论】:

    标签: scala hive apache-spark shark-sql


    【解决方案1】:

    您是否更新了您的 shark-hive 目录配置以正确反映 hive 元存储 jdbc 连接信息?

    您需要将 hive-default.xml 复制到 hive-site.xml 。然后确保设置了 Metastore 属性。

    这是 hive-site.xml 中的基本信息

    <property>
      <name>javax.jdo.option.ConnectionURL</name>
      <value>jdbc:mysql://myhost/metastore</value>
      <description>the URL of the MySQL database</description>
    </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>mypassword</value>
    </property>
    

    您可以在此处获取更多详细信息:configuring hive metastore

    【讨论】:

    • 感谢您的回复。如果可能的话,你能指出我正确的文件吗?在shark hive path conf 目录中,有一个hive-env.sh 和hive-default.xml 文件。我应该修改哪一个?
    • 我更新了我的答案。您需要将 hive-default.xml 复制到 hive-site.xml 并添加 Metastore 连接参数。
    • 感谢您添加详细信息。到目前为止,我正在使用 Derby Metastore(这是默认的)。那是问题吗?我有微弱的记忆,在某处读到 Derby Metastore 一次只支持一个用户。你认为我需要将 Metastore 更改为 MySQL 才能让 Shark-shell 工作吗?
    • 另外,我发现我的 Hive conf 目录中没有 hive-site-xml 文件,我将模板重命名为 hive-site.xml。不幸的是,从那时起,通过 Shark 的 Hive 命令也停止工作,出现此错误:Failed to start database 'metastore_db'。另外,我想知道如果我从 Derby Metastore 更改为 MySQL,我会丢失任何元数据并损坏我的表吗?
    • 您可能希望更改为 mysql 或一些持久性数据库。 H2 是另一种可能性。您将丢失现有的表 - 您必须重新创建它们。如果你决定坚持德比,我不确定接下来会如何发展,我无能为力。
    猜你喜欢
    • 1970-01-01
    • 2014-10-06
    • 2014-04-26
    • 1970-01-01
    • 2014-03-31
    • 2012-12-20
    • 1970-01-01
    • 2014-02-27
    • 1970-01-01
    相关资源
    最近更新 更多