2017-01-18 2 views
3

Im Ausführen einer Abfrage in Hive auf einer Tabelle mit Partitionen.Hive IllegalStateException Mehrdeutiger Eingabepfad

select count (*) aus der Tätigkeit in dem Datumsstempel = 2016-08-16

jedoch die Abfrage die folgende Ausnahme wirft

java.lang.IllegalStateException: Ambiguous input path hdfs://ip-172-29-1-53.us-west-2.compute.internal:8020/hive/dcm/activity/datestamp=2016-10-01/part-r-00000-41b9fc2f-101c-423a-901e-0f617c8fbd62.gz.parquet 
at org.apache.hadoop.hive.ql.exec.MapOperator.getNominalPath(MapOperator.java:454) 
at org.apache.hadoop.hive.ql.exec.MapOperator.cleanUpInputFileChangedOp(MapOperator.java:501) 
at org.apache.hadoop.hive.ql.exec.Operator.cleanUpInputFileChanged(Operator.java:1072) 
at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:545) 
at org.apache.hadoop.hive.ql.exec.tez.MapRecordSource.processRow(MapRecordSource.java:83) 

Failure while running task:java.lang.RuntimeException: java.lang.RuntimeException: java.lang.IllegalStateException: Ambiguous input path hdfs://ip-172-29-1-53.us-west-2.compute.internal:8020/hive/dcm/activity/datestamp=2016-08-16/part-r-00000-1fd9aa5b-6e66-4bf9-b015-a940cbd6cc5a.gz.parquet 
at org.apache.hadoop.hive.ql.exec.tez.TezProcessor.initializeAndRunProcessor(TezProcessor.java:173) 
at org.apache.hadoop.hive.ql.exec.tez.TezProcessor.run(TezProcessor.java:139) 
at org.apache.tez.runtime.LogicalIOProcessorRuntimeTask.run(LogicalIOProcessorRuntimeTask.java:344) 
at org.apache.tez.runtime.task.TezTaskRunner$TaskRunnerCallable$1.run(TezTaskRunner.java:181) 
at org.apache.tez.runtime.task.TezTaskRunner$TaskRunnerCallable$1.run(TezTaskRunner.java:172) 
at java.security.AccessController.doPrivileged(Native Method) 
at javax.security.auth.Subject.doAs(Subject.java:422) 
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1709) 
at org.apache.tez.runtime.task.TezTaskRunner$TaskRunnerCallable.callInternal(TezTaskRunner.java:172) 
at org.apache.tez.runtime.task.TezTaskRunner$TaskRunnerCallable.callInternal(TezTaskRunner.java:168) 
at org.apache.tez.common.CallableWithNdc.call(CallableWithNdc.java:36) 
at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
at java.lang.Thread.run(Thread.java:745) 

ich überprüft haben, dass der Weg auch tatsächlich hat partitions.I verwendet Parkett Werkzeuge Glas, um die Datei zu öffnen und sieht aus wie die Datei Daten im richtigen Format hat. Beliebige Leads zu dem, was am Pfad mehrdeutig ist

Antwort

0

Wir haben das gleiche Problem wie Ihres festgestellt, als es eine insert-Anweisung mit einer zuvor ausgeführten dynamischen Partition gab, die in existierende Partitionen eingefügt werden könnte.

Um Service und verhindern schwerere Probleme wiederherstellen, dass die möglicherweise beschädigte Metadaten (Partition info) führen, wurde eine schnelle Lösung angewendet dann das:

Wir manuell die Partition Metadaten reinigen. Das heißt, wir haben eine alter table xxxx drop partition (tag >= 'yyyyyyyy'); DDL ausgeführt, um alle Partitionen zu löschen. (Für eine externe Tabelle, würde dies keinen HDFS Betrieb aufrufen Daten wären intakt..)

Und dann:

Ausgeführt einen msck Reparaturtabelle Befehl.

Nach diesem Fix wurden Abfragen an diese Tabelle wieder normal.

Also meine Vermutung ist, dass die Partition Metadaten vorschlagen, es gibt mehr als eine Partition zeigen auf den gleichen Pfad (so dass es den Pfad ist mehrdeutig).

Um eine Hive-Abfrage auszuführen, ruft die Execute-Engine zuerst Metadaten ab, bevor sie in das zugrunde liegende Dateisystem eintaucht.