Ich habe eine Spark-Anwendung, mit der ich JSON-Datensätze in eine DataFrame
lesen, umwandeln Sie die Daten (dh es für ein BI-Tool reduzieren), und fügen Sie es dann ein vorhandene partitionierte Hive-Tabelle. Die DataFrame
enthält nur Daten aus den gleichen Partitionsspalten, sagen x
und y
und die PARTITION
Klausel hat nur diese statischen Werte, so dass es keinen ALTER TABLE
Befehl gibt. Der Code, der zu erreichen sieht wie folgt aus:"Kann die Partition nicht ändern" in Hive von Spark App
df.registerTempTable("tempTab")
hc.sql(s"USE $schema")
hc.sql(
s"""INSERT INTO TABLE $table PARTITION (x="$x", y="$y")
| SELECT * FROM tempTab""".stripMargin)
Das Problem ist: Wenn ich die app laufen fügt es ein paar hundert MBs im Wert von Daten und dann gibt mir:
ERROR metadata.Hive: org.apache.hadoop.hive.ql.metadata.HiveException: Unable to alter partition.
at org.apache.hadoop.hive.ql.metadata.Hive.getPartition(Hive.java:1656)
at org.apache.hadoop.hive.ql.metadata.Hive.loadPartition(Hive.java:1256)
Die Sache ist, Ich ändere keine Partition, ich füge hinein. Und der erste Teil der Datensätze aus der gleichenDataFrame
sind tatsächlich in Hive eingefügt (ich überprüfte).
Der Fehler scheint durch verursacht werden:
Caused by: MetaException(message:java.security.AccessControlException: Permission denied: user=hive, access=WRITE, inode="/apps/hive/warehouse/demo.db/demotable/x=foo/y=bar":dude:hdfs:drwxr-xr-x
Wir verwenden MySQL als Metastore und Benutzeridentitätswechsel in Spark. Ich weiß, dass der Benutzer-Identitätswechsel nicht innerhalb von Spark an Hive weitergegeben wird, aber der hive
-Benutzer hat Zugriff auf rwx
über ACLs. Ich habe mit hdfs dfs -getfacl /apps/hive/warehouse/demo.db
überprüft und die Gruppe, die hive
gehört, hat alle Berechtigungen.
jedoch in der Nähe der Spitze des log sehe ich folgendes:
spark.SecurityManager: SecurityManager: authentication disabled; ui acls disabled; users with view permissions: Set(yarn, dude); users with modify permissions: Set(yarn, dude)
Dies ist für mich, um anzuzeigen scheint, dass die ACLs deaktiviert und nur die Grundrechte verwendet werden. Was mich beunruhigt, ist, dass ein guter Teil der Daten in Hive eingefügt wird, so dass ein Berechtigungsproblem sehr unwahrscheinlich erscheint. Ich glaube nicht, dass es einen Job im Hintergrund gibt, der Berechtigungen oder etwas Seltsames zurücksetzt.
Ich fand this discussion, wo eine einfache LOAD
-Anweisung verursacht die gleiche "Kann nicht die Partition ändern" Ausnahme und es könnte von MySQL als der Metastore verursacht worden sein. This post beschreibt die Möglichkeit einer zu hohen Belastung des Metasters.
Edit: Ich habe gerade die Partition innerhalb von Hive erstellt und die Berechtigungen unterscheiden sich von denen von Spark erstellt. Gibt es eine Möglichkeit, Spark gut spielen zu lassen?
Irgendwelche Einsichten?
Haben Sie versucht, Hive und Spark als Proxy-Benutzer zu machen? Ich denke, es ist anständiger Weg, um das Problem zu lösen – user1314742
Meinst du den 'proxy-user' Parameter von' spark-submit'? Das würde diese Benutzer verkörpern, oder? Ich bin mir ziemlich sicher, dass 'Hive' keinen Zugriff auf die JSON-Rohdokumente hat ... – Ian
Nein, der Proxy-Benutzer für hadoop, in core-site.xml. Dies ermöglicht es dem Hive, die Benutzer, die die Befehle (dude) ausgegeben haben, anzunehmen, anstatt sie als Hive auszuführen – user1314742