Apache Hive 在 S3 存储桶错误中创建表
Posted
技术标签:
【中文标题】Apache Hive 在 S3 存储桶错误中创建表【英文标题】:Apache Hive Create Table in S3 Bucket Error 【发布时间】:2021-10-15 07:06:19 【问题描述】:我已经在 Java 版本 [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 存储桶中创建一个空目录?
使用 CloudFormation 在 S3 存储桶中创建 Lambda 通知