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.
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. –
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 /' –
... plus eine "Standard" ACL, wenn Sie Partitionen, dh Unterverzeichnisse erstellen müssen. –