当前位置: 首页 > 知识库问答 >
问题:

带有配置单元的ORC文件:java.io.ioException:两个读取器

晋涛
2023-03-14

我有一个ACID hive表,里面有ORC格式的文件。尝试压缩时,出现以下错误:task:...exited:java.io.ioException:Two reader for...完整错误如下:

2019-06-03 07:01:05,357 ERROR [IPC Server handler 2 on 41085] org.apache.hadoop.mapred.TaskAttemptListenerImpl: Task: attempt_1558939181485_29861_m_000001_0 - exited : java.io.IOException: Two readers for {originalWriteId: 143, bucket: 536870912(1.0.0), row: 3386, currentWriteId 210}: new [key={originalWriteId: 143, bucket: 536870912(1.0.0), row: 3386, currentWriteId 210}, nextRecord={2, 143, 536870912, 3386, 210, null}, reader=Hive ORC Reader(hdfs://HdfsNameService/tbl/delete_delta_0000209_0000214/bucket_00001, 9223372036854775807)], old [key={originalWriteId: 143, bucket: 536870912(1.0.0), row: 3386, currentWriteId 210}, nextRecord={2, 143, 536870912, 3386, 210, null}, reader=Hive ORC Reader(hdfs://HdfsNameService/tbl/delete_delta_0000209_0000214/bucket_00000, 9223372036854775807)]
    at org.apache.hadoop.hive.ql.io.orc.OrcRawRecordMerger.ensurePutReader(OrcRawRecordMerger.java:1171)
    at org.apache.hadoop.hive.ql.io.orc.OrcRawRecordMerger.<init>(OrcRawRecordMerger.java:1126)
    at org.apache.hadoop.hive.ql.io.orc.OrcInputFormat.getRawReader(OrcInputFormat.java:2402)
    at org.apache.hadoop.hive.ql.txn.compactor.CompactorMR$CompactorMap.map(CompactorMR.java:964)
    at org.apache.hadoop.hive.ql.txn.compactor.CompactorMR$CompactorMap.map(CompactorMR.java:941)
    at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:54)
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:465)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:349)
    at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:174)
    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:1730)
    at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:168)

这个表是通过merge将avro文件创建和更新到一个orc表中的,因此产生了一组delta,delete_deltadelta

我有很多其他这样的表格,它们没有这个问题。这个表没有什么特别之处,实际上非常小(<100k行,磁盘上有2.5M),并且在上个月更新了100次(更新了20k行,更新了5M数据)。DDL为:

CREATE TABLE `contact_group`(
  `id` bigint,
  `license_name` string,
  `campaign_id` bigint,
  `name` string,
  `is_system` boolean,
  `is_test` boolean,
  `is_active` boolean,
  `remarks` string,
  `updated_on_utc` timestamp,
  `created_on_utc` timestamp,
  `deleted_on_utc` timestamp,
  `sys_schema_version` int,
  `sys_server_ipv4` bigint,
  `sys_server_name` string,
  `load_ts` timestamp)
ROW FORMAT SERDE
  'org.apache.hadoop.hive.ql.io.orc.OrcSerde'
STORED AS INPUTFORMAT
  'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'
OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'
LOCATION
  'hdfs://HdfsNameService/dwh/vault/contact_group'
TBLPROPERTIES (
  'bucketing_version'='2',
  'last_modified_by'='hive',
  'last_modified_time'='1553512639',
  'transactional'='true',
  'transactional_properties'='default',
  'transient_lastDdlTime'='1559522011')

这每隔几个月就会发生一次。由于其他所有操作(select,merge)都起作用,修复方法通常是创建第二个表(create table t As select*from contact_group)并切换表,但我希望找到真正的潜在原因。

我找到的关于我的错误的唯一引用是在代码本身,这对我没有太大帮助。

这是在HDP3.1上,配置单元3。

共有1个答案

曾实
2023-03-14

我也遇到过这个问题,通过orc-tools我扫描了delete_delta下的所有文件,可以发现这些文件中的所有行都是一样的(例如,在bucket_00000中有7行,而在另一个文件bucket_00001中也有同样的7行),所以在迭代下一个bucket文件时,密钥(originalTransacion-bucket-rowId-currentWriteId)也是一样的。

另一个解决方法是将表创建为bucket,也许可以避免这个问题。

 类似资料:
  • 我已经从Map R集群复制了所有orc文件,并遵循了相同的文件夹结构 创建了位置为#1的orc格式表 然后执行此命令“msck REPAIR TABLE<>” 上面的步骤通过时没有出错,但当我查询分区时,作业失败,出现以下错误 有人能告诉我,我们可以直接从ORC文件创建配置单元ORC分区表吗? 我的存储是蔚蓝数据湖。

  • 我在Hive有一个分区的兽人表。加载所有可能的分区后,我在HDFS上得到多个ORC文件,即HDFS上的每个分区目录中都有一个ORC文件。我需要将每个分区下的所有这些ORC文件组合成一个大的ORC文件,用于某些用例。 有人能给我建议一个方法,把这些多个ORC文件(属于每个分区)组合成一个单一的大ORC文件。 我试着从分区表创建一个新的非分区ORC表。它确实减少了文件的数量,但不会减少到单个文件。 p

  • 我有一些困难,以确保我利用已排序的数据在一个配置单元表。(使用ORC文件格式) 我知道我们可以通过在create DDL中声明子句来影响数据从配置单元表中读取的方式。 这意味着每次查询该表时,数据将通过在各个映射器之间分发,然后对其进行排序。 我的问题是: 我不希望数据被拆分为文件(桶),因为卷不是那么多,我会保留小文件。 但是,我确实想利用排序插入。 我真的需要在create DLL语句中使用吗

  • 我正在尝试在ORC文件上创建外部配置单元表。 但当我试图在创建的表上执行select操作时,会出现以下错误: 有什么建议吗??

  • 我有一个配置单元表保存在ORC文件中,这是“create”命令中的定义: 我想从末尾删除一个列,所以我尝试了“alter table-replace columns”命令,在这里我没有写列名--但是得到了这个错误: