2014-11-24 13 views
19

I hanno registrato una tabella temporanea con Spark SQL, come descritto in [this section]:Accesso Spark SQL RDD tabelle attraverso il 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") 

Ora voglio accedere a questa tabella in modalità remota tramite JDBC. Avvio del server Thrift come descritto in [this other section].

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

Ma la tabella non è visibile.

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

Credo che questo è perché il tavolo è "temporaneo" (cioè legato alla durata dell'oggetto SqlContext). Ma come posso creare tabelle non temporanee?

Posso vedere Hive tables attraverso il server di archiviazione, ma non vedo come ho potuto esporre un RDD come questo. Ho trovato a comment che suggerisce che non posso.

O dovrei utilizzare il Thrift Server nella mia applicazione con il mio SqlContext? Quasi tutte le classi intorno a questo sono private e questo codice non è in Maven Central (per quanto vedo). Dovrei usare HiveThriftServer2.startWithContext? Non è documentato e @DeveloperApi, ma potrebbe funzionare.

+0

Hai trovato una risposta praticabile per questo? – stackit

+0

quando si utilizza pyspark sua non funziona – stackit

risposta

4

Modificare spark-defaults.conf e aggiungere spark.sql.hive.thriftServer.singleSession true.

Ciò consente al server Thrift per vedere tabelle temporanee basate direttamente sul RDD, senza dover salvare la tabella. È anche possibile eseguire CACHE TABLE XXX AS <query> in Spark SQL e visualizzarlo tramite ODBC/JDBC.

3

Da SPARK-3675:

Una domanda comune sulla mailing list è come leggere le tabelle temporanee oltre JDBC. Mentre dovremmo provare e supportare la maggior parte di questo in SQL, sarebbe anche bello interrogare RDD generici su JDBC.

E la soluzione (che entra in Spark 1.2.0) è infatti quella di utilizzare HiveThriftServer2.startWithContext.

+0

Come utilizzare HiveThriftServer2.startWithContext – stackit

+0

da importazione pyspark.sql.hive.thriftserver HiveThriftServer2 non è disponibile in pyspark – stackit

+0

http://stackoverflow.com/questions/36628918/start-hivethriftserver-programmatically- in-python – stackit

16

Molto probabilmente hai già risolto questo problema. Ma ho provato un caso di utilizzo simile recentemente e ho voluto condividere le mie scoperte. per esporre i dati Spark oltre JDBC, è necessario effettuare le seguenti operazioni:

  • Avviare il risparmio-server che viene fornito con Spark (io ho usato la versione 1.3.1), il risparmio-server con Hive potrebbe anche lavorare ma non ho provato che

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

Assicurarsi non si danno "localhost", ma l'attuale ip-address/dnsname del server a "hive.server2.thrift.bind.host", altrimenti non puoi collegare a questo server parsimonia da un host diverso

  • linea d'aria è un semplice client JDBC che viene fornito con Hive & Spark. Inizia beeline e collegarlo al server parsimonia

SPARK_HOME/bin/Beeline

beeline>!la connessione JDBC: hive2: // scintilla-master: 10001

  • è possibile utilizzare qualsiasi hiveql qui per caricare i dati desiderati in una tabella, ma lo sql sarà eseguito in gruppo Spark

    creare temporanea tweet della tabella utilizzando le opzioni org.apache.spark.sql.parquet (percorso 'maprfs: /// path-to-your-parquet-files /');

  • della cache della tabella in memoria scintilla

tweets tabella di cache

  • Ecco fatto, tutti i dati vengono ora memorizzati nella cache del cluster scintilla e si può interrogare questo con bassa latenza su remote jdbc

  • la codifica jdbc è esattamente la stessa della scrittura di un codice jdbc hive perché il server di risparmio comprende l'hiveql e traduce t cappello per scintillare sql dietro. Guardate qui per esempi JDBC dell'alveare:

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

Per nome utente, si può dare alcun nome utente linux nella macchina parsimonia-server e lasciare la password vuota (questa è la modalità non sicura, è possibile rendere le cose più protetto se necessario)

  • la tabella "tweet" non saranno visibili con "mostra le tabelle" ecc perché la tabella non è registrata nel metastore alveare ma si può fare tutte le query SQL con la tabella sopra JDBC

  • è possibile utilizzare Spark per memorizzare i dati nella cache e interrogarli tramite jdbc/odbc remoto. Ciò produrrà risposte a bassa latenza, ho ottenuto risposte < a 2 secondi per la dimensione dei dati di circa 40 GB. Ma il caching non funzionerà per dati veramente grandi, come i tera byte. In tal caso, evitare la "tabella di cache ..." il comando e si può ancora utilizzare il telecomando JDBC/ODBC, ma le risposte non saranno in gamma bassa latenza

Tutto il meglio!

MK

+0

Grazie, ci sono molti dettagli utili! Ciò che manca però è che non posso semplicemente avviare Thriftserver dalla riga di comando. Ho alcuni Spark RDD che voglio rendere accessibili tramite JDBC. Quindi ho bisogno del Thriftserver per usare SparkContext della mia applicazione Spark in esecuzione. Non ho ancora provato 'HiveThriftServer2.startWithContext', ma quando lo faccio vostre istruzioni sarà molto utile! –

+1

@ user1158559: No, mi dispiace. Alla fine non abbiamo avuto alcun caso pratico per questo, quindi non l'ho approfondito ulteriormente. –

+1

Grazie. Solo per permettere a chiunque lo stia leggendo, l'ho capito dopo aver postato quel commento. Le tabelle temporanee sono per sessione SQL, quindi è necessario attivare spark.sql.hive.thriftServer.singleSession al fine di condividere con i vostri clienti di SQL. https://spark.apache.org/docs/latest/sql-programming-guide.html#upgrading-from-spark-sql-15-to-16 – user1158559

2

L'idea generale dietro una tabella temporanea, almeno dal l'intenzione originale RDBMS è che ha portata molto limitata, di solito la sessione utente, e va fuori di portata & viene ripulita quando al termine della sessione .

Se si crea una tabella temporanea in una sessione, un'altra sessione che si connette tramite JDBC o ODBC al server di controllo non sarà in grado di vederla, e in base alla progettazione. Se hai bisogno di una tabella per persistere oltre una sessione, allora non è temporanea per definizione.

La soluzione suggerita per "abilitare spark.sql.hive.thriftServer.singleSession per condividerli con i client SQL" funziona sì, ma in qualche modo sconfigge lo scopo di avere un ambiente multisessione. L'impostazione di una singola sessione sta forzando le tabelle temporanee a comportarsi come tabelle persistenti, ad eccezione del fatto che continueranno a uscire dal contesto se si riavvia il metad store dell'alveare.

E 'abbastanza facile da usare lo SqlContext per CREATE TABLE, o utilizzare saveAsTable() vedi: https://spark.apache.org/docs/1.6.0/sql-programming-guide.html#saving-to-persistent-tables

modifica, viene visualizzato saveAsTable è menzionato prima nella scintilla 1.3 documentazione, ma è possibile utilizzare il metodo inlineSQL se sono su una versione precedente.

people.write.saveAsTable("people") 

Ciò manterrà la tabella delle persone nel database predefinito. Meglio creare un database prima e specificarla:

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

o con linea di SQL

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

Entrambi questi metodi registrerà la tabella di persistente metastore alveare. saveAsTable ha anche opzioni se si desidera aggiungere o sovrascrivere