2016-05-04 14 views
0

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?

Antwort

1

So, dachte ich, das Problem aus:

  • Wenn Spark-Partitionen erstellt es schafft, diese mit Hilfe von Benutzerberechtigungen, so in meinem Fall für den Benutzer dude und die Gruppe hdfs. Interessanterweise sind weder hive noch spark Benutzer in der Gruppe hdfs; dude ist auch nicht Teil dieser Gruppe. Aus irgendeinem Grund heißt die Gruppe, die hive und spark gehört hadoop auf unserem Cluster. Wie auch immer, das bedeutet hive kann nicht eingefügt werden, weil die ACLs standardmäßig ignoriert werden (mehr dazu später). Ich denke, Spark entlädt die Daten in Stapeln und nach dem ersten Stapel, der aufgrund der grundlegenden Berechtigungen ein Problem verursacht.
  • Ich kann die Partitionen direkt in Hive erstellen, die dann die Standardberechtigungen der Verzeichnisse verwendet. Das löst zumindest das Problem, aber im Idealfall würde ich Spark verwenden, um sie bei Bedarf zu erstellen.
  • Zu diesem Zweck musste ich den Parameter spark.acls.enable=true setzen, in diesem Fall hat es die ACLs verwendet und da die hadoop Gruppe lesen/schreiben/ausführen darf, ist alles gut.
+0

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

+0

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

+0

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

Verwandte Themen