Hive 无法将文件加载到表中,因为它在 hive 仓库中找不到它

Posted

技术标签:

【中文标题】Hive 无法将文件加载到表中,因为它在 hive 仓库中找不到它【英文标题】:Hive can't load file to table because it can't find it in hive warehouse 【发布时间】:2019-05-21 15:02:09 【问题描述】:

我无法将数据加载到 hive 表并且日志显示此问题

我要加载的文件:

> [hdfs@vmi200937 root]$ hdfs dfs -ls /suppression-files Found 1 items
> -rw-rw-rw-   3 hdfs hdfs  694218562 2018-12-21 05:06 /suppression-files/md5.txt

Hive 目录:

> [hdfs@vmi200937 root]$ hdfs dfs -ls
> /apps/hive/warehouse/suppression.db Found 1 items drwxrwxrwx   - hive
> hadoop          0 2018-12-21 06:30
> /apps/hive/warehouse/suppression.db/md5supp

这是 Hive 查询:

> hive (suppression)> LOAD DATA INPATH '/suppression-files/md5.txt' INTO
> TABLE md5supp;

日志:

将数据加载到表 suppress.md5supp 失败并出现异常 java.io.FileNotFoundException:目录/文件不存在 /apps/hive/warehouse/suppression.db/md5supp/md5.txt 在 org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkOwner(FSDirectory.java:1901) 在 org.apache.hadoop.hdfs.server.namenode.FSDirAttrOp.setOwner(FSDirAttrOp.java:82) 在 org.apache.hadoop.hdfs.server.namenode.FSNamesystem.setOwner(FSNamesystem.java:1877) 在 org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.setOwner(NameNodeRpcServer.java:828) 在 org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.setOwner(ClientNamenodeProtocolServerSideTranslatorPB.java:476) 在 org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java) 在 org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:640) 在 org.apache.hadoop.ipc.RPC$Server.call(RPC.java:982) 在 org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2351) 在 org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2347) 在 java.security.AccessController.doPrivileged(Native Method) 在 javax.security.auth.Subject.doAs(Subject.java:422) 在 org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1869) 在 org.apache.hadoop.ipc.Server$Handler.run(Server.java:2347)

FAILED:执行错误,返回代码 40000 从 org.apache.hadoop.hive.ql.exec.MoveTask。 java.io.FileNotFoundException:目录/文件不存在 /apps/hive/warehouse/suppression.db/md5supp/md5.txt 在 org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkOwner(FSDirectory.java:1901) 在 org.apache.hadoop.hdfs.server.namenode.FSDirAttrOp.setOwner(FSDirAttrOp.java:82) 在 org.apache.hadoop.hdfs.server.namenode.FSNamesystem.setOwner(FSNamesystem.java:1877) 在 org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.setOwner(NameNodeRpcServer.java:828) 在 org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.setOwner(ClientNamenodeProtocolServerSideTranslatorPB.java:476) 在 org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java) 在 org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:640) 在 org.apache.hadoop.ipc.RPC$Server.call(RPC.java:982) 在 org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2351) 在 org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2347) 在 java.security.AccessController.doPrivileged(Native Method) 在 javax.security.auth.Subject.doAs(Subject.java:422) 在 org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1869) 在 org.apache.hadoop.ipc.Server$Handler.run(Server.java:2347)

【问题讨论】:

【参考方案1】:

我找到了解决方案! 我应该将目录 /suppression-file 的所有者设置为 hive:hdfs by hdfs dfs chown -R hive:hdfs /suppression-file

【讨论】:

以上是关于Hive 无法将文件加载到表中,因为它在 hive 仓库中找不到它的主要内容,如果未能解决你的问题,请参考以下文章

Hive:将hdfs中的gziped CSV作为只读加载到表中

如何使用 Spark 将镶木地板文件加载到 Hive 表中?

数据未从csv文件正确加载到hive表

hive 表的常用操作

无法在hive分区表中查看数据

无法查看 hive 分区表中的数据