Hive:无法为 HDFS 中的现有数据创建外部表

Posted

技术标签:

【中文标题】Hive:无法为 HDFS 中的现有数据创建外部表【英文标题】:Hive: Unable to create external tables for existed data in HDFS 【发布时间】:2019-08-05 02:58:23 【问题描述】:

更新 1: 将hadoop的版本修改为2.x,但错误依旧。

原创

我使用hive-testbenchtpcds 测试数据生成到Ceph 中。

目前,数据位于存储系统根目录,文件夹tpcds

例如hdfs dfs -ls /的结果是

drwxrwxrwx   - root root          0 2019-08-05 10:44 /hive
drwxrwxrwx   - root root          0 2019-08-05 10:44 /tmp
drwxrwxrwx   - root root          0 2019-08-05 10:44 /tpcds
drwxrwxrwx   - root root          0 2019-08-05 10:44 /user
drwxrwxrwx   - root root          0 2019-08-05 10:44 /warehouse

s3cmd ls s3://tpcds 的结果是:

                   DIR   s3://tpcds/hive/
                   DIR   s3://tpcds/tmp/
                   DIR   s3://tpcds/tpcds/
                   DIR   s3://tpcds/user/
                   DIR   s3://tpcds/warehouse/

对于s3cmd ls s3://tpcds,存储桶名称为tpcds

当数据准备好后,接下来的设置是在Hive 中创建外部表以访问这些数据。我展示存储布局的原因是为了让你们确保我遇到的问题与路径无关。

使用的命令是hive -i settings/load-flat.sql -f ddl-tpcds/text/alltables.sql -d DB=tpcds_text_7 -d LOCATION=tpcds/7,但是我遇到了以下问题:

 exec.DDLTask: org.apache.hadoop.hive.ql.metadata.HiveException: MetaException(message:Exception thrown flushing changes to datastore)
        at org.apache.hadoop.hive.ql.metadata.Hive.createDatabase(Hive.java:433)
        at org.apache.hadoop.hive.ql.exec.DDLTask.createDatabase(DDLTask.java:4243)

对于堆栈版本:Hive 2.3.2Hadoop 3.1.2。 目前,我这边最可能的原因是hadoop版本,我将把它降级到hadoop 2.7,看看是否会出现同样的错误。

同时,欢迎任何评论。提前感谢您的帮助。

【问题讨论】:

【参考方案1】:

由于问题已解决,我想在此处发布解决方案,以供可能遇到相同问题的其他访问者使用。

我用来初始化mysql metastore的架构的hive3.1.1。之后,我只是将 hive 文件夹替换为hive 2.3.2。这种降级并不优雅,之前创建的元存储与hive 2.3.2 不一致,这就是我遇到问题的原因。

我将 hive 文件夹恢复为3.1.1,一切都变好了。

【讨论】:

以上是关于Hive:无法为 HDFS 中的现有数据创建外部表的主要内容,如果未能解决你的问题,请参考以下文章

hive外部表

将数据从 HDFS 复制到 Hive 中的外部表时出错

如何制作一个自动更新 Hive 的表

删除与分区相关的hdfs文件后无法联系hive表分区

hive中创建外部分区表使用location是指定数据存放位置还是指数据来源

无法找到创建的 Hive 表,也无法从表中检索数据