SerDe 上的 Oozie Hive 操作失败

Posted

技术标签:

【中文标题】SerDe 上的 Oozie Hive 操作失败【英文标题】:Oozie Hive Action Failed on SerDe 【发布时间】:2013-04-04 19:10:44 【问题描述】:

我从 oozie hive 操作工作流中得到一个错误:

Failing Oozie Launcher, Main class [org.apache.oozie.action.hadoop.HiveMain], 
      main() threw exception, org/apache/hadoop/hive/serde2/SerDe
      java.lang.NoClassDefFoundError: org/apache/hadoop/hive/serde2/SerDe

我的 hive 表 SerDe 使用 CDH4.2、HUE 2.2 和 JSON-SerDe (rcongiu-hive-json-serde)。

Hive 查询脚本没问题,我已经在 hive 控制台中成功运行了它。我已经设置了 oozie 共享库。让我非常困惑的是,在使用默认表(不使用特殊的 SerDe)提交配置单元工作流时我没有收到任何错误,但是当我更改为我的 JSON-SerDe 表时它总是失败。 ADD JAR /path-to/serde.jar 也不起作用。

【问题讨论】:

serde.jar 必须在 HDFS 的某个地方,Oozie 才有希望找到它。也许你已经这样做了,但我不能从你的问题中确定。当我需要一个带有 Hive 操作的 Oozie 工作流的 jar 时,将 jar 复制到 Oozie 共享库中的 HDFS 对我有用/user/oozie/share/lib/hive/serde.jar。执行此操作或将 <file>other/path/to/jar/on/HDFS/serde.jar</file> 添加到 Hive 操作应该使 jar 可用于 Oozie。或者,可能是 Oozie 确实看到了 serde.jar,但 Hive 看不到。不幸的是,我没有在 Oozie 启动的 Hive 脚本中使用 ADD JAR 的经验。 @DanielKoverman 是的,先生,我确实将serde.jar 放在了 HDFS(sharelib 和 serde.jar)上,但我仍然遇到错误。当我错过mysql-connector.jar 时,我觉得很奇怪,我只是将 JAR 文件放到了 sharelib (HDFS) 中,它就可以工作了。 @mr-bagio 哦,好吧,我希望我能为您提供一个简单的解决方案。希望其他人会来。 找到这个启动器的 MR 作业,并查看 job.xml - 类路径配置属性的值是什么(我不记得它们叫什么了,但是寻找罐子) 可能与此 other question about SerDe problems 有关,即使异常似乎提到了未找到的不同类? 【参考方案1】:

我通过将我的 Serde JAR 文件放在应用程序的 lib 路径中解决了这个错误。

下面是我的HDFS目录结构:

/user/manoj/app/workflow.xml
/user/manoj/app/lib/json-serde-1.3-jar-with-dependencies.jar

PS:您可能有任何版本的 serDe JAR,我特别使用了json-serde-1.3-jar-with-dependencies.jar,因为我在其他答案中发现该版本也支持反序列化并且它对我有用。我遇到了 hive-serde.jar 的“无法反序列化”错误。

【讨论】:

以上是关于SerDe 上的 Oozie Hive 操作失败的主要内容,如果未能解决你的问题,请参考以下文章

oozie sqoop 操作导入失败

无法从 Oozie 工作流作业的第二次运行启动 Hive 操作

在hue 使用oozie sqoop 从mysql 导入hive 失败

Hive 如何存储数据,啥是 SerDe?

为啥 hive 在 Join 操作期间不选择 SerDe JAR?

Amazon Hive 中的多分隔符 SerDe 设置