【问题标题】:Hive:Getting error in execution select and drop partiton hive queries in same timeHive:同时执行选择和删除分区配置单元查询时出错
【发布时间】:2019-05-08 23:03:11
【问题描述】:

同时运行两个查询时出现错误。

这里是风景。

我正在使用 AWS EMR,下面是我的配置单元表架构。

CREATE TABLE India (OFFICE_NAME STRING,
OFFICE_STATUS     STRING,
PINCODE           INT,
TELEPHONE   BIGINT,
TALUK       STRING,
DISTRICT    STRING,
POSTAL_DIVISION   STRING,
POSTAL_REGION     STRING,
POSTAL_CIRCLE     STRING
)
PARTITIONED BY (STATE   STRING)
ROW FORMAT SERDE       'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
STORED AS INPUTFORMAT  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' 
OUTPUTFORMAT   'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION  's3a://mybucket/'
TBLPROPERTIES (  'parquet.compression'='SNAPPY',   'transient_lastDdlTime'='1537781726');

第一个查询:

SELECT count( distinct STATE ) FROM India;

第二次查询:

ALTER TABLE India DROP PARTITION (STATE='Delhi');

在运行第一个查询时,我同时执行了第二个查询,所以我在第一个查询中遇到了这个错误

Error: java.io.IOException: java.lang.reflect.InvocationTargetException
at org.apache.hadoop.hive.io.HiveIOExceptionHandlerChain.handleRecordReaderCreationException(HiveIOExceptionHandlerChain.java:97)
  at org.apache.hadoop.hive.io.HiveIOExceptionHandlerUtil.handleRecordReaderCreationException(HiveIOExceptionHandlerUtil.java:57)
  at org.apache.hadoop.hive.shims.HadoopShimsSecure$CombineFileRecordReader.initNextRecordReader(HadoopShimsSecure.java:271)
  at org.apache.hadoop.hive.shims.HadoopShimsSecure$CombineFileRecordReader.next(HadoopShimsSecure.java:144)
  at org.apache.hadoop.mapred.MapTask$TrackedRecordReader.moveToNext(MapTask.java:200)
  at org.apache.hadoop.mapred.MapTask$TrackedRecordReader.next(MapTask.java:186)
  at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:52)
  at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:455)
  at org.apache.hadoop.mapred.MapTask.run(MapTask.java:344)
  at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164)
  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:1698)
  at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)
Caused by: java.lang.reflect.InvocationTargetException
  at sun.reflect.GeneratedConstructorAccessor42.newInstance(Unknown Source)
  at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
  at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
  at org.apache.hadoop.hive.shims.HadoopShimsSecure$CombineFileRecordReader.initNextRecordReader(HadoopShimsSecure.java:257)
  ... 11 more
Caused by: com.amazon.ws.emr.hadoop.fs.consistency.exception.FileDeletedInMetadataNotFoundException: File 'mybucket/India/state=Delhi/000000_0' is marked as deleted in the metadata
  at com.amazon.ws.emr.hadoop.fs.consistency.ConsistencyCheckerS3FileSystem.getFileStatus(ConsistencyCheckerS3FileSystem.java:440)
  at com.amazon.ws.emr.hadoop.fs.consistency.ConsistencyCheckerS3FileSystem.getFileStatus(ConsistencyCheckerS3FileSystem.java:416)
  at sun.reflect.GeneratedMethodAccessor17.invoke(Unknown Source)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:498)
  at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:191)
  at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:102)
  at com.sun.proxy.$Proxy34.getFileStatus(Unknown Source)
  at com.amazon.ws.emr.hadoop.fs.s3n2.S3NativeFileSystem2.getFileStatus(S3NativeFileSystem2.java:227)
  at com.amazon.ws.emr.hadoop.fs.EmrFileSystem.getFileStatus(EmrFileSystem.java:509)
  at org.apache.parquet.hadoop.ParquetFileReader.readFooter(ParquetFileReader.java:386)
  at org.apache.parquet.hadoop.ParquetFileReader.readFooter(ParquetFileReader.java:372)
  at org.apache.hadoop.hive.ql.io.parquet.ParquetRecordReaderBase.getSplit(ParquetRecordReaderBase.java:79)
  at org.apache.hadoop.hive.ql.io.parquet.read.ParquetRecordReaderWrapper.<init>(ParquetRecordReaderWrapper.java:75)
  at org.apache.hadoop.hive.ql.io.parquet.read.ParquetRecordReaderWrapper.<init>(ParquetRecordReaderWrapper.java:60)
  at org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat.getRecordReader(MapredParquetInputFormat.java:75)
  at org.apache.hadoop.hive.ql.io.CombineHiveRecordReader.<init>(CombineHiveRecordReader.java:99)
  ... 15 more

谷歌搜索后我找到了这个链接

https://docs.aws.amazon.com/emr/latest/ManagementGuide/emrfs-files-tracked.html

无论如何要在运行时同步元数据,否则在第一个状态完成之前不会执行第二个查询。

请帮助我解决这个问题或任何建议,设置任何可以解决问题的参数。

【问题讨论】:

    标签: hadoop amazon-s3 hive amazon-emr hive-partitions


    【解决方案1】:

    一开始就计算分区路径和拆分。您的映射器已开始读取分区位置中的文件,同时您删除了分区,这导致了文件丢失,因为您的表是受管理的。这会导致运行时FileDeletedInMetadataNotFoundException 异常。

    如果你还想在读取时删除分区,试试这个:

    如果您将表设为 EXTERNAL,则 DROP PARTITION 不应删除文件,它们将保留并且不会导致异常,您可以稍后从文件系统中删除分区位置。或使用 S3 生命周期策略删除旧文件,如 here 所述。

    不幸的是,已经开始的作业无法检测到带有文件的 Hive 分区被删除并优雅地跳过读取它们,因为已经读取了 Hive 元数据,构建了查询计划并且已经可以计算拆分。

    因此,解决方案是删除 Hive 分区并推迟删除文件。

    顺便说一句,当您在查询表时添加分区时,它工作正常。

    【讨论】:

    • 感谢回复。不,我不能更改为外部表。
    • 无论如何,删除分区查询等待选择查询的完全执行
    • @Gabber 是的,尝试调整并发性。 cwiki.apache.org/confluence/display/Hive/…
    • @Also 好的解决方案可以是:将表设为 EXTERNAL 并删除分区或运行 RECOVER PARTITIONS(或 MSCK REPAIR),使用 AWS S3 存储桶 Lyfecycle 策略删除旧文件。您的上游工作流程应该只放置新文件。文件将根据生命周期策略过期,RECOVER PARTITIONS 将删除没有位置的分区并添加新的
    • 我的意思是您可以在同一会话中的查询之前执行 RECOVER PARTITIONS,而不是并行执行,上游进程将放置它的文件,S3 将删除过期文件。您的恢复分区将在同一会话中添加/删除分区
    猜你喜欢
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多