2016-04-27 8 views
0

Ich benutze Spark 1.3 und ich versuche, eine Tabelle von einem RDD zu generieren. Dies ist der Pseudo-Code:Berechtigung verweigert, wenn SPARK Datenframes Methode "saveAsTable"

val sc = new org.apache.spark.SparkContext(conf) 
val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc) 
import sqlContext.implicits._ 

val rdd1=sc.textFile(path_1).map(........) // RDD[(string,Double)] 
val rdd2=sc.textFile(path_2).map(........) // RDD[(string,Double)] 
val rdd_join=rdd1.fullOuterJoin(rdd2)  // RDD[String,(Option(Double),Option(Double))) 
val rdd_get = rdd_join.map(....}   // RDD[(String,Double,Double)] 
rdd_get.toDF().saveAsTable("database.tablename") 

Wenn Sie diesen Code bin ich laufen die Berechtigungsfehler bekommen:

org.apache.hadoop.security.AccessControlException: Zugriff verweigert: user = XXXXXXXX, access = WRITE , inode = "/ Benutzer/Hive/Warehouse": Hive: Hive: Drwxrwx - X: Benutzer: Hive: Rwx, Gruppe :: ---, Gruppe: Hive: Rwx

Wenn ich die Tabelle erstellen als:

rdd_get.toDF().registerTempTable("rdd_get_temp") 
    sqlContext.sql("CREATE TABLE database.tablename AS SELECT * FROM rdd_get_temp") 

Dann funktioniert es und crea testet den Tisch. Es sieht so aus, als ob saveAsTable() versucht, meinen Benutzer zu verwenden, um in "/ user/hive/warehouse" zu schreiben (dies ist durch Kerberisierung verboten), während sqlContext.sql den Benutzer "hive" dafür verwendet.

Bin ich richtig ?? Ist das ein Fehler? Funktioniert es in neueren Funken-Versionen?

Vielen Dank.

+2

Kein Fehler. Wenn Sie die Autorisierungseinstellungen "säubern" möchten, können Sie HiveServer2 so einrichten, dass Ihr tatsächliches Benutzerkonto anstelle des 'Bienenstock'-Dienstkontos verwendet wird. Aber dann müssen Sie ACLs in jedem HDFS-Verzeichnis verwalten, das von einer Hive-Tabelle verwendet wird - genau wie bei einem Netzwerklaufwerk (pro Benutzer, pro Gruppe usw.). Dieser generische 'Bienenstock'-Account ist ein sehr lahmes Ding - und Sentry/Ranger sind nur lächerliche Pflaster, um Unternehmenssaugern eine Illusion von Sicherheit zu geben. –

+1

Wenn Sie jedoch Administratorrechte erhalten (z. B. ein Kerberos-Ticket als 'hdfs' erhalten), können Sie eine ACL für das Verzeichnis erstellen, in dem Spark Dateien erstellen soll, damit * Ihr * Benutzer Schreibrechte erhält. Sthg wie 'hdfs dfs -setfacl -m Benutzer: johndoe: rx/Benutzer/hive/warehouse /' dann 'hdfs dfs -setfacl -m Benutzer: johndoe: rwx/Benutzer/Bienenstock/warehouse/someable /' –

+0

... plus eine "Standard" ACL, wenn Sie Partitionen, dh Unterverzeichnisse erstellen müssen. –

Antwort

0

SaveAsTable erstellt eine physische Tabelle, während registerTempTable eine (temporäre) Tabelle im Speicher erstellt. Sie haben Recht, Benutzer benötigt die richtigen Berechtigungen zum Erstellen von physischen Tabellen.

Verwandte Themen