Hive 添加 JAR 不起作用

问题描述 投票:0回答:4

我正在尝试导入包含引用字段的文件。我发现了 csv-serde JAR 并尝试使用它但取得了最小的成功。

我从以下位置下载了 JAR: https://github.com/ogrodnek/csv-serde

我将其添加到 HDFS 系统的 /tmp 目录中。

当我尝试从 Ambari 中使用 View to HIVE 时,我设置了以下内容:

ADD JAR /tmp/csv-serde-1.1.2-0.11.0-all.jar;

这会引发文件不存在的错误:

H110 无法提交声明。处理语句时出错: /tmp/csv-serde-1.1.2-0.11.0-all.jar 不存在 [ERROR_STATUS]

然后我尝试从终端调用配置单元:

hive> 添加 JAR /tmp/csv-serde-1.1.2-0.11.0-all.jar;

这就成功了。然后,我创建外部表,然后选择一些字段,以确保它在 CLI hive 环境中正常运行并且一切正常。

然后,我从 Ambari 内返回到 Hive 视图,当我在表上运行任何类型的操作时,我会得到:

H110 无法提交声明。编译语句时出错: 失败:运行时异常 MetaException(消息:java.lang.ClassNotFoundException 类 com.bizo.hive.serde.csv.CSVSerde 未找到)[ERROR_STATUS]

当我尝试通过 ODBC 驱动器从 MS SQL 查询此内容时,我也收到相同的错误。

我在这个论坛上查看了多篇关于添加某某 .jar 以及这个和那个的帖子:

/usr/lib/hive

该目录在我的集群上无论是在基本操作系统级别还是在 HDFS 文件系统中都不存在。我应该将 .jar 文件放在哪里以及如何放置,以便可以在 hive CLI 之外查询我的表?

hive
4个回答
0
投票

您需要将 jar 放在 HDFS 中的某个位置。许多人在 HDFS 中使用 /tmp,就像使用本地 FS 一样。例如:

hdfs dfs -put /tmp/csv-serde-1.1.2-0.11.0-all.jar /tmp

然后当您处于 Hive 视图中时,您会

ADD JAR hdfs://$HOSTNAME:$PORTNUM/tmp/csv-serde-1.1.2-0.11.0-all.jar;

这应该可以工作并允许您查询数据。


0
投票

尝试完整路径,例如:

ADD JAR hdfs://<host>/<port>/tmp/csv-serde-1.1.2-0.11.0-all.jar;

如果由于某种原因,Ambari 查看器中运行的配置不同并且未定义默认 FS,那么这可以工作。

您提到的另一个选项 - 我相信将 jar 放在哪个目录中并不重要,只要它位于 hive 服务器运行的同一主机上,并且 hive-site.xml 指向它即可。选择文件系统上的任意位置(例如 /home/myname/jars) 在 hive 服务器计算机上编辑 hive-site.xml

<property>
  <name>hive.aux.jars.path</name>
  <value>/home/myname/jars</value>
</property>

并将 csv-serde-1.1.2-0.11.0-all.jar 复制到 /home/myname/jars (在本地 fs 上,而不是在 hdfs 上)。重新启动配置单元并尝试。在这种方法中,您根本不需要使用 ADD JAR - jar 将自动包含在 hive 服务器类路径中。

我读过但从未尝试过的另一个选项是将 jar 放在 hive lib 目录中。您也可以尝试一下,但请确保先重新启动 hive。

关于ADD JAR的注意事项:ADD JAR命令和稍后使用它的查询必须在同一会话中执行。 Hive CLI 中的命令位于单个会话中,因此它可以工作。我不知道Ambari Hive视图如何管理会话。


0
投票

如果 HDFS 中存在 jar 则示例:

hive>add jar hdfs:///tmp/csv-serde-1.1.2-0.11.0-all.jar;

回来了

converting to local hdfs:///tmp/csv-serde-1.1.2-0.11.0-all.jar
Added [/tmp/d6528831-4f3c-41e4-a4cf-121a63796a0f_resources/csv-serde-1.1.2-0.11.0-all.jar] to class path
Added resources: [hdfs:///tmp/csv-serde-1.1.2-0.11.0-all.jar]

本地文件系统中是否存在 jar 的示例

hive>add jar file:///tmp/csv-serde-1.1.2-0.11.0-all.jar;

...


0
投票

对于那些面临类似问题的人,我今天成功解决了。

我的问题: 当尝试在 Hive 中使用以下语法时:

ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
  "separatoeChar" = ",",
  "quoteChar" = "\""
)

Hive 无法识别 org.apache.hadoop.hive.serde2.OpenCSVSerde。

解决方案:

我从此存储库下载了 JAR 文件:https://github.com/adatao/mvnrepos/blob/master/releases/com/bizo/csv-serde/1.1.2-0.11.0/csv-serde-1.1 .2-0.11.0-all.jar

注意:将JAR文件下载到任意位置,并记住其路径。

在 Hive 终端中,运行以下命令:

hive> ADD JAR "path_to_your_downloaded_jar/csv-serde-1.1.2-0.11.0-all.jar";

将“path_to_your_downloaded_jar”替换为保存 JAR 文件的实际路径。

将之前的 Hive 代码替换为以下内容:

ROW FORMAT SERDE 'com.bizo.hive.serde.csv.CSVSerde'
WITH SERDEPROPERTIES (
  "separatoeChar" = ",",
  "quoteChar" = "\""
)

这应该可以解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.