OceanBase 4.4.2 读取 Hive 外表(S3A Parquet 目录型 LOCATION)时报 ERROR 9120: cannot find object on object storage

【使用环境】
生产环境

【OB or 其他组件】

  • OceanBase 4.4.2
  • Hive Metastore / Hive 外表
  • S3 对象存储(endpoint:s3.ap-northeast-1.amazonaws.com,region:ap-northeast-1

【使用版本】
OceanBase 4.4.2

【问题描述】
OceanBase 查询 Hive 外表时报错:

select * from trades_last7d010_parquet0000_part_00 limit 10;

报错信息如下:

ERROR 9120 (HY000): cannot find object on object storage

另有一组测试中,创建 LOCATION 使用 s3:// 路径时,查询会报:

ERROR 9026 (HY000): backup destination is not valid

当前怀疑 OceanBase 4.4.2 在读取 Hive 外表时,对于 s3a:// 目录型 Parquet LOCATION 处理存在问题:
Hive/Hue 可以正常查询,但 OceanBase 访问时似乎没有正确展开目录下的 parquet 文件,而是直接将目录路径当作对象访问,导致 S3 返回 404,最终报错 9120

【复现路径】

  1. Hive 中存在如下外表,Hue 中可正常查询:
CREATE EXTERNAL TABLE `test_db.trades_last7d010_parquet0000_part_00`(
  `id` bigint COMMENT 'id',
  `contract` string COMMENT 'contract',
  `create_time` double COMMENT 'create_time',
  `size` int COMMENT 'size',
  `close_size` int COMMENT 'close_size',
  `price` double COMMENT 'price',
  `order_id` string COMMENT 'order_id',
  `fee` double COMMENT 'fee',
  `point_fee` double COMMENT 'point_fee',
  `role` string COMMENT 'role',
  `text` string COMMENT 'text',
  `biz_info` string COMMENT 'biz_info',
  `amend_text` string COMMENT 'amend_text',
  `account` string COMMENT 'account',
  `market` string COMMENT 'market',
  `settle` string COMMENT 'settle',
  `create_time_str` string COMMENT 'create_time_str',
  `kafka_timestamp` timestamp COMMENT 'kafka_timestamp')
COMMENT 'test data'
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://your-bucket/your-prefix/test_db/trades_last7d010_parquet0000_part_00'
TBLPROPERTIES (
  'parquet.compression'='SNAPPY',
  'transient_lastDdlTime'='1770954969');
  1. 该表在 Hive/Hue 中可以正常查询数据。

  2. S3 上验证目录及文件存在:

aws s3 ls s3://your-bucket/your-prefix/test_db/trades_last7d010_parquet0000_part_00/ --recursive

返回:

2026-02-13 11:55:59 1186256318 your-prefix/test_db/trades_last7d010_parquet0000_part_00/parquet0000_part_00.parquet

说明:

  • S3 目录存在
  • 目录下真实 parquet 文件存在
  • Hive 可以正常读取该目录型 location
  1. 在 OceanBase 中查询该表:
select * from trades_last7d010_parquet0000_part_00 limit 10;

报错:

ERROR 9120 (HY000): cannot find object on object storage
  1. 查看 OceanBase 日志,发现其实际访问的是目录路径本身,而不是目录下具体 parquet 文件,例如:
cannot get file stat for not exist file(ret=-9120, uri=s3://your-bucket/your-prefix/test_db/trades_last7d010_parquet0000_part_00)

以及:

S3 info(request_id="...", code=404, exception="", err_msg="No response body.")
  1. 另外测试 CREATE LOCATION

使用 s3://

CREATE LOCATION hive_dw_s3_test_dir
URL = 's3://your-bucket/your-prefix/test_db/trades_last7d010_parquet0000_part_00'
CREDENTIAL = (
  ACCESSID = '***',
  ACCESSKEY = '***',
  HOST = 's3.ap-northeast-1.amazonaws.com',
  S3_REGION = 'ap-northeast-1'
);

查询时报:

ERROR 9026 (HY000): backup destination is not valid

使用 s3a://

CREATE LOCATION hive_dw_s3_test_dir
URL = 's3a://your-bucket/your-prefix/test_db/trades_last7d010_parquet0000_part_00'
CREDENTIAL = (
  ACCESSID = '***',
  ACCESSKEY = '***',
  HOST = 's3.ap-northeast-1.amazonaws.com',
  S3_REGION = 'ap-northeast-1'
);

查询时报:

ERROR 9120 (HY000): cannot find object on object storage
  1. SHOW CREATE LOCATION 中还观察到一个异常现象:ACCESSKEY 回显被拼接进 ACCESSID,类似:
ACCESSID = '***''access_key=***'

【附件及日志】
可提供以下材料:

  • Hive 表 DDL
  • OceanBase 查询报错截图
  • OceanBase 相关错误日志
  • S3 路径验证命令及结果
  • SHOW CREATE LOCATION 输出结果

目前日志关键信息包括:

  • ERROR 9120: cannot find object on object storage
  • ERROR 9026: backup destination is not valid
  • S3 返回 404
  • OceanBase 访问的是目录路径本身,而不是目录下的 parquet 文件

如有需要,我这边可以再使用 obdiag 补充采集诊断信息。

【备注】
当前判断问题不在 Hive 和 S3 数据本身,依据如下:

  1. Hive/Hue 可正常查询该表
  2. S3 上 parquet 文件实际存在
  3. OceanBase 访问时命中的路径是目录,而不是目录下的具体 parquet 文件
  4. 怀疑 OceanBase 4.4.2 对 Hive + s3a:// 目录型 Parquet 外表的处理存在兼容性或缺陷

想确认以下几点:

  1. OceanBase 4.4.2 是否支持通过 Hive 外表读取 s3a:// 目录型 Parquet LOCATION
  2. 对 Hive 外表是否会自动枚举目录下 parquet 文件
  3. CREATE LOCATIONs3:// / s3a:// 的支持边界
  4. SHOW CREATE LOCATIONACCESSKEY 回显异常是否为已知问题
  5. 是否有补丁版本或规避方案
3 个赞


指定下文件试试
https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004476100

1 个赞

同样的创建catalog和location语句在4.5正常读取hive外表数据,4.4.2不行

创建外表语句发一下看看,指定type = 'parquet’了么

我是想访问hive外表,数据都是parquet格式存储在s3上的。先创建catalog,再创建location,只有4.4.2的ob集群读取不到s3上的文件,日志有get_file_list failed,且我使用的aksk权限足够大。

4.4.1 4.5.0这两个版本都没问题,4.4.2版本异常

1.第二点那里用s3 client 然后用自己的 aksk去查,这样判断下aksk是正确的么
ERROR 9120 (HY000): cannot find object on object storage和 ERROR 9026 (HY000): backup destination is not valid 看着都在说明这个 aksk 似乎是不对的。

2.location创建也校验下?应该整个流程当中的 url 配置是表的根路径,也就是按照他这个写法?不是分区表的情况下写了 s3a://your-bucket/your-prefix/test_db/trades_last7d010_parquet0000_part_00,应该是 s3a://your-bucket/your-prefix/test_db/ 才对

3.可以通过 快速的 show files in location语法快速验证下他这个locaiton 是否创建是OK
show FILES IN LOCATION @location_name[’/path’] [PATTERN = ‘regex_pattern’]};



一个4.4.1 一个4.4.2版本的,catalog和location语句一致

442相对于441和450没做特别改动参考这里测试下看看如果show files in locaton能正常显示,那说明location对象是没问题的

语法都一样的,就442不行,其次这个show create loaction 希望可以把aksk加密一下,不然直接暴露了

左右是441,右边是442

442执行下这几个show看下
SHOW FILES IN LOCATION @hive_dw_s3_test_dir;

SHOW FILES IN LOCATION @hive_dw_s3_test_dir PATTERN = ‘.*.parquet’;

select * from oceanbase.__all_virtual_tenant_location;
在sys租户下执行这条sql来确认location


show不出来看着还是location问题根据下面方法提供一下日志看看
1)设置trace信息
SET ob_enable_show_trace=‘ON’;

2)执行sql。

3)获取上个命令的trace
select last_trace_id();

4)获取trace对应的节点
select query_sql,svr_ip from gv$ob_sql_audit where trace_id=‘第三步获取的trace信息’;

5)取对应的svr_ip节点 过滤日志
grep “第三步获取的trace信息” observer.log*
grep “第三步获取的trace信息” rootservice.log*


这是441的两个location一样

可否提供一下show location报错的日志

  1. SHOW CREATE LOCATION 中显示把access key和access id拼在了一起异常原因是社区版OB没有加密模块导致。

来学习