Apache Hive 在 S3 存储桶错误中创建表

Posted

技术标签:

【中文标题】Apache Hive 在 S3 存储桶错误中创建表【英文标题】:Apache Hive Create Table in S3 Bucket Error 【发布时间】:2021-10-15 07:06:19 【问题描述】:

我已经在 J​​ava 版本 [openjdk 版本“1.8.0_292”] 之上的 Linux 本地计算机上设置了 Hive(版本 3.1.2)和 Hadoop(版本 3.3.1)。我还设置了一个 AWS S3 存储桶。

我可以连接到 s3 存储桶并从以下命令获得响应。我收到了包含我存储桶中文件列表的正确响应,因此我知道我可以连接。

hadoop fs -ls s3a://my-bucket-name/
aws s3 ls my-bucket-name

我遇到的问题是当我尝试使用 Hive 在 S3 存储桶中创建表时。我的 Hive 查询如下。顺便说一下,我使用 Postgres 作为我的 Metastore 数据库。本地安装在我的机器上。

CREATE EXTERNAL TABLE IF NOT EXISTS user_orders(id int, user_id int, guid string, url_domain string, price int, city string, latitude decimal(10,5), longitude decimal(10,5), zip int, is_delivered boolean, note string)
COMMENT 'user orders details'
STORED AS PARQUET
LOCATION 's3a://my-bucket-name/';

我收到以下错误:

FAILED: SemanticException java.lang.RuntimeException: java.lang.reflect.InvocationTargetException

当我查看配置单元日志时,它更加冗长。这会很长,但我们开始吧。

Compiling command(queryId=ubuntu_20210811205002_86cab28f-ef5a-4e39-ae7b-30bb25d2ba1c): CREATE SCHEMA IF NOT EXISTS hive_parquet
location 's3a://my-bucket-name/'
2021-08-11T20:50:02,888  INFO [e3cbda42-bb24-46f0-ace6-6183d92a2c36 main] ql.Driver: Concurrency mode is disabled, not creating a lock manager
2021-08-11T20:50:02,915 ERROR [e3cbda42-bb24-46f0-ace6-6183d92a2c36 main] ql.Driver: FAILED: SemanticException java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
org.apache.hadoop.hive.ql.parse.SemanticException: java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
        at org.apache.hadoop.hive.ql.parse.BaseSemanticAnalyzer.toWriteEntity(BaseSemanticAnalyzer.java:2126)
        at org.apache.hadoop.hive.ql.parse.BaseSemanticAnalyzer.toWriteEntity(BaseSemanticAnalyzer.java:2118)
        at org.apache.hadoop.hive.ql.parse.BaseSemanticAnalyzer.toWriteEntity(BaseSemanticAnalyzer.java:2114)
        at org.apache.hadoop.hive.ql.parse.DDLSemanticAnalyzer.addLocationToOutputs(DDLSemanticAnalyzer.java:4267)
        at org.apache.hadoop.hive.ql.parse.DDLSemanticAnalyzer.analyzeCreateDatabase(DDLSemanticAnalyzer.java:1346)
        at org.apache.hadoop.hive.ql.parse.DDLSemanticAnalyzer.analyzeInternal(DDLSemanticAnalyzer.java:510)
        at org.apache.hadoop.hive.ql.parse.BaseSemanticAnalyzer.analyze(BaseSemanticAnalyzer.java:285)
        at org.apache.hadoop.hive.ql.Driver.compile(Driver.java:659)
        at org.apache.hadoop.hive.ql.Driver.compileInternal(Driver.java:1826)
        at org.apache.hadoop.hive.ql.Driver.compileAndRespond(Driver.java:1773)
        at org.apache.hadoop.hive.ql.Driver.compileAndRespond(Driver.java:1768)
        at org.apache.hadoop.hive.ql.reexec.ReExecDriver.compileAndRespond(ReExecDriver.java:126)
        at org.apache.hadoop.hive.ql.reexec.ReExecDriver.run(ReExecDriver.java:214)
        at org.apache.hadoop.hive.cli.CliDriver.processLocalCmd(CliDriver.java:239)
        at org.apache.hadoop.hive.cli.CliDriver.processCmd(CliDriver.java:188)
        at org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:402)
        at org.apache.hadoop.hive.cli.CliDriver.executeDriver(CliDriver.java:821)
        at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:759)
        at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:683)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.hadoop.util.RunJar.run(RunJar.java:323)
        at org.apache.hadoop.util.RunJar.main(RunJar.java:236)
Caused by: java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
        at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:137)
        at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:3467)
        at org.apache.hadoop.fs.FileSystem.access$300(FileSystem.java:174)
        at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:3574)
        at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:3521)
        at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:540)
        at org.apache.hadoop.fs.Path.getFileSystem(Path.java:365)
        at org.apache.hadoop.hive.ql.parse.BaseSemanticAnalyzer.tryQualifyPath(BaseSemanticAnalyzer.java:2153)
        at org.apache.hadoop.hive.ql.parse.BaseSemanticAnalyzer.toWriteEntity(BaseSemanticAnalyzer.java:2123)
        ... 24 more
Caused by: java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:135)
        ... 32 more
Caused by: java.lang.VerifyError: Bad type on operand stack
Exception Details:
  Location:
    org/apache/hadoop/fs/s3a/Invoker.once(Ljava/lang/String;Ljava/lang/String;Lorg/apache/hadoop/util/functional/CallableRaisingIOE;)Ljava/lang/Object; @118: invokestatic
  Reason:
    Type 'com/amazonaws/AmazonClientException' (current frame, stack[2]) is not assignable to 'com/amazonaws/SdkBaseException'
  Current Frame:
    bci: @118
    flags:  
    locals:  'java/lang/String', 'java/lang/String', 'org/apache/hadoop/util/functional/CallableRaisingIOE', 'com/amazonaws/AmazonClientException' 
    stack:  'java/lang/String', 'java/lang/String', 'com/amazonaws/AmazonClientException' 
  Bytecode:
    0x0000000: bb00 0559 b200 0103 1206 04bd 0007 5903
    0x0000010: 2a53 b700 084e 013a 042c b900 0901 003a
    0x0000020: 052d c600 1f19 04c6 0016 2db6 000a a700
    0x0000030: 133a 0619 0419 06b6 000c a700 072d b600
    0x0000040: 0a19 05b0 3a05 1905 3a04 1905 bf3a 072d
    0x0000050: c600 1f19 04c6 0016 2db6 000a a700 133a
    0x0000060: 0819 0419 08b6 000c a700 072d b600 0a19
    0x0000070: 07bf 4e2a 2b2d b800 0ebf
  Exception Handler Table:
    bci [42, 46] => handler: 49
    bci [25, 33] => handler: 68
    bci [25, 33] => handler: 77
    bci [88, 92] => handler: 95
    bci [68, 79] => handler: 77
    bci [0, 65] => handler: 114
    bci [68, 114] => handler: 114
  Stackmap Table:
    full_frame(@49,Object[#116],Object[#116],Object[#117],Object[#118],Object[#119],Object[#120],Object[#119])
    same_frame(@61)
    same_frame(@65)
    full_frame(@68,Object[#116],Object[#116],Object[#117],Object[#118],Object[#119],Object[#119])
    same_locals_1_stack_item_frame(@77,Object[#119])
    full_frame(@95,Object[#116],Object[#116],Object[#117],Object[#118],Object[#119],Top,Top,Object[#119],Object[#119])
    same_frame(@107)
    same_frame(@111)

尽管我在搜索引擎上花了几天时间,但我无法弄清楚这一点。我注意到的一件事是我的属性hive.metastore.warehouse.dir 当前设置为/user/hive/warehouse。我不确定它是否也应该指向 s3 存储桶。

任何帮助将不胜感激。

【问题讨论】:

你使用的是什么版本的 hadoop-aws? 为什么要在整个存储桶上创建表?通常它应该是bucket之后的table_name,因为bucket是一个更大的单元。像这样:LOCATION 's3a://my-bucket-name/user_orders',不需要最后一个斜线 我使用的是 Hadoop 版本 3.3.1。我现在试试 LOCATION 's3a://my-bucket-name/user_orders' 我正在使用 hadoop-aws-3.3.1.jar。 【参考方案1】:

我已经解决了我的问题。看起来 Hadoop 3.3.1 与 Hive 3.1.2 一起运行可能存在问题。我根据Hortonworks HDP 3.1.5 Release Notes 降级了我的版本,一切正常!所以要考虑的一件事是 Hadoop 和 Hive 之间的版本兼容性。

【讨论】:

以上是关于Apache Hive 在 S3 存储桶错误中创建表的主要内容,如果未能解决你的问题,请参考以下文章

在 Terraform 中创建 S3 存储桶通知时出错

无法在特定区域中创建s3存储桶

为啥 terraform 会在 s3 存储桶中创建一个空目录?

使用 CloudFormation 在 S3 存储桶中创建 Lambda 通知

无法在 cloudformation 中创建带有事件的 s3 存储桶,以连接到它

查找谁在联合 AWS 账户中创建了 s3 存储桶