2016-05-23 10 views
0

Ich benutze einen Spark ThriftServer, damit ich Spark SQL-Befehle für Daten ausführen kann, die ich in einer Hive-Tabelle gespeichert habe.Spark Thriftserver stellt keine Verbindung zur richtigen Hive-Datenbank her

Als ich beginnen die beeline meine aktuellen Tabellen zu zeigen:

[email protected]~$ beeline 
!connect jdbc:hive2://mn:10000 
show tables; 
+------------+--------------+--+ 
| tableName | isTemporary | 
+------------+--------------+--+ 
+------------+--------------+--+ 

Die Ausgabe zeigt, dass es keine Tabellen in meiner Datenbank sind.

Allerdings, wenn ich die (veraltet) CLI hive verwendet, erhalte ich unterschiedliche Ausgabe:

[email protected]:~$ hive 
Logging initialized using configuration in jar:file:/opt/cloudera/parcels/CDH-5.4.4-1.cdh5.4.4.p0.4/jars/hive-common-1.1.0-cdh5.4.4.jar!/hive-log4j.properties 
WARNING: Hive CLI is deprecated and migration to Beeline is recommended. 
hive> show tables; 
OK 
table_1 
table_2 
Time taken: 1.683 seconds, Fetched: 6 row(s) 

Ich weiß, die Ausgabe von Beeline nicht korrekt ist, wie HDFS zeigt, dass es Tabellen in meiner Hive speichern.

[email protected]:~$ hadoop fs -ls /user/hive/warehouse 
Found 9 items 
drwxrwxrwt - cloudera hive   0 2015-07-30 13:20 /user/hive/warehouse/table_1 
drwxrwxrwt - cloudera hive   0 2015-08-04 16:28 /user/hive/warehouse/table_2 

Außerdem, wenn ich meine Funken verbinden Thriftserver (I Tableau bin mit den Daten abzufragen), zeigen keine Tabellen, wenn ich versuche, alle Tabellen in meinem aktuellen Schema zu sehen.

Ich habe das Gefühl, dass es ein Konfigurationsproblem gibt, das der Beeline CLI und der Spark Thriftserver teilen, aber ich bin mir nicht sicher, was es ist. Ich bin mir ziemlich sicher, dass der Thriftserver auf eine lokale Hive-Installation zeigt, da ich nur über den Thriftserver Tabellen anzeigen konnte, die auf lokal auf der Maschine gespeicherte Tabellen zeigten (anstatt in HDFS gespeicherte Tabellen). Ich hatte diese Tabellen innerhalb von beeline erstellt, und da ich bedenke, dass beeline nicht korrekt konfiguriert ist, wurden die Tabellen lokal anstatt in HDFS erstellt. Ich hatte Beeline Verbindung zu dem Port, auf dem SparkSQL läuft, also denke ich, das erklärt, warum diese beiden Teile der Software das gleiche Problem haben.

Welche Konfiguration sollte ich einstellen, damit der Thriftserver mit der richtigen Hive-Installation funktioniert? Ich habe festgestellt, dass der Hive-Befehl einige Konfigurationsdateien lädt, würde das die Antwort enthalten?

Jede Hilfe wird sehr geschätzt.

EDIT:

Hier ist meine hive-Datei site.xml:

<?xml version="1.0" encoding="UTF-8"?> 

<!--Autogenerated by Cloudera Manager--> 
<configuration> 
    <property> 
    <name>hive.metastore.uris</name> 
    <value>thrift://w7:9083</value> 
    </property> 
    <property> 
    <name>hive.metastore.client.socket.timeout</name> 
    <value>300</value> 
    </property> 
    <property> 
    <name>hive.metastore.warehouse.dir</name> 
    <value>/user/hive/warehouse</value> 
    </property> 
    <property> 
    <name>hive.warehouse.subdir.inherit.perms</name> 
    <value>true</value> 
    </property> 
    <property> 
    <name>hive.enable.spark.execution.engine</name> 
    <value>false</value> 
    </property> 
    <property> 
    <name>hive.conf.restricted.list</name> 
    <value>hive.enable.spark.execution.engine</value> 
    </property> 
    <property> 
    <name>mapred.reduce.tasks</name> 
    <value>-1</value> 
    </property> 
    <property> 
    <name>hive.exec.reducers.bytes.per.reducer</name> 
    <value>67108864</value> 
    </property> 
    <property> 
    <name>hive.exec.copyfile.maxsize</name> 
    <value>33554432</value> 
    </property> 
    <property> 
    <name>hive.exec.reducers.max</name> 
    <value>1099</value> 
    </property> 
    <property> 
    <name>hive.metastore.execute.setugi</name> 
    <value>true</value> 
    </property> 
    <property> 
    <name>hive.support.concurrency</name> 
    <value>true</value> 
    </property> 
    <property> 
    <name>hive.zookeeper.quorum</name> 
    <value>mn</value> 
    </property> 
    <property> 
    <name>hive.zookeeper.client.port</name> 
    <value>2181</value> 
    </property> 
    <property> 
    <name>hbase.zookeeper.quorum</name> 
    <value>mn</value> 
    </property> 
    <property> 
    <name>hbase.zookeeper.property.clientPort</name> 
    <value>2181</value> 
    </property> 
    <property> 
    <name>hive.zookeeper.namespace</name> 
    <value>hive_zookeeper_namespace_hive</value> 
    </property> 
    <property> 
    <name>hive.cluster.delegation.token.store.class</name> 
    <value>org.apache.hadoop.hive.thrift.MemoryTokenStore</value> 
    </property> 
    <property> 
    <name>hive.server2.enable.doAs</name> 
    <value>true</value> 
    </property> 
    <property> 
    <name>hive.server2.use.SSL</name> 
    <value>false</value> 
    </property> 
</configuration> 

Antwort

1

Sie eine relationale Datenbank als Metastore für hive verwenden müssen, und stellen Sie sicher, dass Datenbank conn str in hive gesetzt -site.xml auf dem Server, auf dem hiveserver2 ausgeführt wird.

https://cwiki.apache.org/confluence/display/Hive/AdminManual+MetastoreAdmin helfen kann

+0

überprüfte ich meine hive-site.xml-Datei und die Cluster I eine Remote-relationalen Datenbank Metastore verwenden bin mit konfiguriert (so die Metastore Datenbank ist nicht auf der gleichen Maschine, die ich/der Thriftserver läuft gerade). Könnte das mit meinen Problemen zusammenhängen? – npp1993

+0

Ja, genau das ist der Grund. Mit beeline verbinden Sie sich mit dem Cluster mit einer anderen metasore db, sollten Sie den gleichen metasore db conn str etc. in Ihrer hive-site.xml setzen, wenn die entfernte metasore db in einem privaten Netzwerk ist, müssen Sie einen ssh erstellen tunnel, um es zu verwenden, andernfalls können Sie nur "beeline" verwenden, da der native CLI 'hive' nicht in der Lage ist, den richtigen Metastasen zu erhalten. – chutium

+0

Also, um zu klären: Wenn der Metastream auf der Maschine 'w7' ist, aber der Thriftserver auf der Maschine' mn' läuft, sollte ich mich mit dem folgenden Befehl mit beeline verbinden: '! Connect jdbc: hive2: // w7: 10000'? Sollte ich stattdessen eine Verbindung zu Port 9083 basierend auf meiner hive-site.xml herstellen? Ich schätze die Hilfe sehr. – npp1993

0

Sie benötigen die folgenden Eigenschaften festgelegt in hive-site.xml; Beispiel verwendet mariaDb-Treiber und mysql. Beeline Verbindung wurde mit zu

<property> 
    <name>javax.jdo.option.ConnectionURL</name> 
    <value>jdbc:mysql://hostname:3306/hive?createDatabaseIfNotExist=true</value> 
    <description>username to use against metastore database</description> 
    </property> 

    <property> 
    <name>javax.jdo.option.ConnectionDriverName</name> 
    <value>org.mariadb.jdbc.Driver</value> 
    <description>username to use against metastore database</description> 
    </property> 

    <property> 
    <name>javax.jdo.option.ConnectionUserName</name> 
    <value>username</value> 
    <description>username to use against metastore database</description> 
    </property> 

    <property> 
    <name>javax.jdo.option.ConnectionPassword</name> 
    <value>password</value> 
    <description>password to use against metastore database</description> 
    </property> 
Verwandte Themen