2014-11-24 10 views
19

Ich habe eine temporäre Tabelle mit Spark-SQL registriert, wie in [this section] beschrieben:Zugriff auf Spark-SQL RDD-Tabellen durch den Thrift Server

people.registerTempTable("people") 
// I can run queries on it all right. 
val teenagers = sqlContext.sql("SELECT name FROM people WHERE age >= 13 AND age <= 19") 

Jetzt habe ich diese Tabelle zugreifen möchten remote über JDBC. Ich starte den Thrift-Server wie in [this other section] beschrieben.

./sbin/start-thriftserver.sh --master spark://same-master-as-above:7077 

Aber die Tabelle ist nicht sichtbar.

0: jdbc:hive2://localhost:10000> show tables;   
+---------+ 
| result | 
+---------+ 
+---------+ 
No rows selected (2.216 seconds) 

Ich denke, das liegt daran, dass die Tabelle „vorübergehend“ ist (das heißt, um die Lebensdauer des SqlContext Objekt gebunden). Aber wie mache ich nicht temporäre Tabellen?

Ich kann Hive tables über den Thrift-Server sehen, aber ich sehe nicht, wie ich eine RDD so aussetzen könnte. Ich habe gefunden a comment das schlägt vor, ich kann nicht.

Oder sollte ich den Thrift-Server in meiner Anwendung mit meinem eigenen SqlContext ausführen? Fast alle Klassen sind private, und dieser Code ist nicht in Maven Central (soweit ich sehe). Soll ich HiveThriftServer2.startWithContext verwenden? Es ist nicht dokumentiert und @DeveloperApi, aber könnte funktionieren.

+0

Haben Sie eine praktikable Antwort gefunden? – stackit

+0

bei der Verwendung von pyspark seine nicht – stackit

Antwort

4

Ändern spark-defaults.conf und spark.sql.hive.thriftServer.singleSession true hinzufügen.

Dadurch kann der Thrift-Server temporäre Tabellen anzeigen, die direkt auf RDD basieren, ohne die Tabelle speichern zu müssen. Sie können auch in Spark SQL CACHE TABLE XXX AS <query> tun und es über ODBC/JDBC verfügbar gemacht haben.

3

Von SPARK-3675:

Eine häufig gestellte Frage auf der Mailing-Liste ist, wie aus den temporären Tabellen über JDBC zu lesen. Während wir versuchen sollten, das meiste davon in SQL zu unterstützen, wäre es auch gut, generische RDDs über JDBC abzufragen.

Und die Lösung (in Spark 1.2.0 kommt) ist in der Tat zu verwenden HiveThriftServer2.startWithContext.

+0

arbeiten So verwenden HiveThriftServer2.startWithContext – stackit

+0

von pyspark.sql.hive.thriftserver Import HiveThriftServer2 ist in pyspark nicht verfügbar – stackit

+0

http://stackoverflow.com/questions/36628918/start-hivethriftserver-programmatically- In-Python – stackit

16

Wahrscheinlich haben Sie dieses Problem bereits gelöst. Aber ich habe kürzlich einen ähnlichen Anwendungsfall versucht und wollte meine Ergebnisse teilen. Spark Daten über JDBC aussetzen, müssen Sie Folgendes tun:

  • den thrift-Server starten, die von Spark kommt (ich verwendete Version 1.3.1), der thrift-Server mit Hive könnte genauso gut arbeiten aber ich habe das nicht getestet

    /opt/mapr/spark/spark-1.3.1/sbin/start-thriftserver.sh --master spark: // spark-master: 7077 --hiveconf hive.server2. thrift.bind.host Funken Master --hiveconf hive.server2.trift.port 10001

Stellen Sie sicher, geben Sie nicht "localhost", sondern das tatsächliche IP-Adresse/dnsname des Servers „hive.server2.thrift.bind.host“, sonst können nicht Sie zu diesem thrift-Server von einem anderen Host verbinden

  • Beeline ist ein einfacher JDBC-Client, der mit kommt Bienenstock & Funken. Starten Sie Beeline und verbinden Sie es mit Ihrem thrift Server

SPARK_HOME/bin/Beeline

Beeline>!Verbindung jdbc: hive2: // funkenMeister: 10001

  • Sie jede hiveql hier verwenden können, um die Daten, die Sie in eine Tabelle wollen zu laden, aber die SQL wird in Spark-Cluster

    erstellen vorübergehend ausgeführt werden Tabellen-Tweets mit org.apache.spark.sql.parquet Optionen (Pfad 'maprfs: /// Pfad zu Ihrem Parkett-Dateien /');

  • Cache der Tabelle in Funken Speicher

Cache-Tabelle Tweets

  • das ist es, alle Ihre Daten werden nun in der Funken Cluster zwischengespeichert und Sie können dies mit geringer Latenzzeit abfragen über remote jdbc

  • die jdbc-codierung ist genau das gleiche wie das schreiben von jedem hive jdbc-code, weil die sparsamkeitsserver verstehen die hiveql und übersetzt t hat, um sql hinter zu funken. Schauen Sie hier für hive jdbc Beispiele:

https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Clients#HiveServer2Clients-ConnectionURLs

Für Benutzername, können Sie einen beliebigen Linux-Benutzernamen in der thrift-Server-Maschine geben und lassen Sie das Kennwort leer (dies ist nicht gesicherten Modus, können Sie die Dinge mehr, wenn erforderlich) gesichert

  • die Tabelle „Tweets“ sind nicht sichtbar mit „Show-Tabellen“ etc, da die Tabelle nicht im Stock Metastore registriert ist, aber Sie können mit der Tabelle über jdbc

    alle sQL-Abfragen zu tun
  • Sie können Spark verwenden, um Daten im Speicher zwischenzuspeichern und diese über remote jdbc/odbc abzufragen. Dies führt zu niedrigen Latenzantworten, ich habe < 2 Sekunden Antworten für eine Datengröße von etwa 40 GB. Aber das Caching funktioniert nicht für wirklich große Daten, wie Tera Bytes. In diesem Fall vermeiden, dass die „Cache-Tabelle ...“ Befehl und Sie können immer noch den Remote-jdbc/odbc verwenden, aber Antworten werden nicht in dem Low-Latency-Bereich

All das Beste sein!

MK

+0

Danke, das ist eine Menge nützlicher Details! Was aber fehlt ist, dass ich den Thriftserver nicht einfach von der Kommandozeile starten kann. Ich habe eine Spark RDD, die ich über JDBC zugänglich machen möchte. Also brauche ich den Thriftserver, um den SparkContext meiner Spark-Anwendung zu benutzen. Ich habe 'HiveThriftServer2.startWithContext' noch nicht ausprobiert, aber wenn ich es tue, sind Ihre Anweisungen sehr hilfreich! –

+1

@ user1158559: Nein, tut mir leid. Es stellte sich heraus, dass wir dafür keinen praktischen Anwendungsfall hatten, also habe ich es nicht weiter verfolgt. –

+1

Danke. Um es jedem zu ermöglichen, der es liest, habe ich es nach dem Posten dieses Kommentars funktionierend gemacht. Die temporären Tabellen sind pro SQL-Sitzung, daher müssen Sie spark.sql.hive.thriftServer.singleSession aktivieren, um sie mit Ihren SQL-Clients zu teilen. https://spark.apache.org/docs/latest/sql-programming-guide.html#upgrading-from-spark-sql-15-to-16 – user1158559

2

Die allgemeine Idee hinter einer temporären Tabelle, zumindest von der ursprünglichen Absicht RDBMS ist, dass es sehr wenig Spielraum hat, in der Regel die Benutzersitzung, und geht aus dem Anwendungsbereich & wird gereinigt, wenn die Sitzung beendet .

Wenn Sie eine temporäre Tabelle in einer Sitzung erstellen, wird eine andere Sitzung, die über JDBC oder ODBC mit dem Thrift-Server verbindet, nicht in der Lage sein, sie zu sehen, und das ist beabsichtigt. Wenn Sie eine Tabelle benötigen, die über eine Sitzung hinaus bestehen bleibt, ist sie per Definition nicht temporär.

Die Lösung vorgeschlagen, "spark.sql.hive.thriftServer.singleSession zu aktivieren, um sie mit Ihren SQL-Clients zu teilen" funktioniert ja, aber irgendwie besiegt den Zweck einer Multi-Session-Umgebung. Durch das Setzen einer einzelnen Sitzung werden temporäre Tabellen zwangsweise dazu gezwungen, sich als persistente Tabellen zu verhalten, außer dass sie bei einem Neustart des Hive-Meta-Speichers aus dem Kontext gerissen werden.

Es ist leicht genug, um die SqlContext zu verwenden CREATE TABLE oder verwendet saveAsTable() siehe: https://spark.apache.org/docs/1.6.0/sql-programming-guide.html#saving-to-persistent-tables

EDIT: Es erscheint saveAsTable erwähnt wird zunächst in den Funken 1.3 Dokumentation, aber Sie können die inlineSQL Methode, wenn Sie verwenden sind auf einer früheren Version.

people.write.saveAsTable("people") 

Das wird die Personentabelle in Ihrer Standarddatenbank beibehalten. Besser eine Datenbank zuerst zu erstellen, und geben Sie es:

people.write.saveAsTable("databaseName.people") 

oder mit Inline-SQL

sqlContext.sql("CREATE TABLE IF NOT EXISTS people 
as SELECT name FROM people WHERE age >= 13 AND age <= 19") 

Diese beiden Methoden wird die persistente Tabelle im Stock Metastore registrieren. saveAsTable hat auch Optionen, ob Sie anhängen oder überschreiben möchten.