Hadoop Map Reduce 作业:Class org.apache.hive.hcatalog.mapreduce.HCatInputFormat 未找到

Hadoop Map Reduce job: Class org.apache.hive.hcatalog.mapreduce.HCatInputFormat not found

我正在使用 kylin。它是一个数据仓库工具,它使用 hadoop、hive 和 hbase。它附带示例数据,以便我们可以测试系统。我正在构建这个样本。这是一个多步骤过程,其中许多步骤都是 map-reduce 作业。第二步是 Extract Fact Table Distinct Columns,这是一个 MR 作业。如果没有在 hadoop 日志中写入任何内容,这项工作就会失败。深入挖掘后,我在 logs/userlogs/application_1450941430146_0002/container_1450941430146_0002_01_000004/syslog

中发现了一个异常
2015-12-24 07:31:03,034 WARN [main] org.apache.hadoop.mapred.YarnChild:
Exception running child : java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.hive.hcatalog.mapreduce.HCatInputFormat not found
    at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2195)
    at org.apache.hadoop.mapreduce.task.JobContextImpl.getInputFormatClass(JobContextImpl.java:174)
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:749)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341)
    at org.apache.hadoop.mapred.YarnChild.run(YarnChild.java:164)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:415)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1657)
    at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)
Caused by: java.lang.ClassNotFoundException: Class org.apache.hive.hcatalog.mapreduce.HCatInputFormat not found
    at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:2101)
    at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2193)
    ... 8 more

2015-12-24 07:31:03,037 INFO [main] org.apache.hadoop.mapred.Task: Runnning cleanup for the task

我的问题是我是否应该将 mapper class 的所有依赖项 jar 复制到所有 hadoop 节点?如果我重新启动 kylin 服务器并恢复多维数据集构建工作,这项工作就会成功。清理所有内容后重新启动时再次观察到此行为。

我用的是5节点集群,每个节点8核30GB。 NameNode 在一个节点上 运行。 DataNode 在所有 5 个节点上都是 运行。对于 Hbase; HMaster 和 HQuorumPeer 在与 NameNode 相同的节点上 运行,HRegionServer 在所有节点上 运行。 Hive和Kylin部署在Master Node上。

版本信息:

Ubuntu 12.04 (64 bit)
Hadoop 2.7.1
Hbase  0.98.16
Hive   0.14.0
Kylin  1.1.1

这里的问题是 Kylin 假定所有 Hadoop 节点上都有相同的 Hive jar。当某些节点缺少 Hive 罐子(甚至在不同的位置)时,您会在 HCatInputFormat 上得到 ClassNotFoundException。

顺便说一句,您应该能够从 Yarn 作业控制台获得明确的错误消息。这是一个遇到的问题。

将Hive部署到所有集群节点肯定可以解决这个问题,就像你试过的那样。

或者另一个(更干净的)解决方法是手动配置 Kylin 以提交 Hive jar 作为额外的作业依赖项。参见 https://issues.apache.org/jira/browse/KYLIN-1021

最后还有一个开放的JIRA建议Kylin应该默认提交Hive jars。参见 https://issues.apache.org/jira/browse/KYLIN-1082

李阳建议的是正确的。这是我的实验顺序。 Kylin 附带了一个 jar 文件,由 kylin.job.jar 属性 在 kylin.properties 中指定。所以首先我制作了一个缺少依赖项的胖 jar 文件,在 kylin.job.jar 中设置此文件的路径,然后再次 运行 作业。缺少的 class 现在随 MR 作业一起提供。新添加的依赖项有一些依赖项并非在所有节点上都可用,因此作业再次失败。在下一次迭代中,我添加了那些缺失的依赖项并再次尝试。同样的结果:新添加的依赖项有更多的依赖项,这些依赖项并非在所有节点上都可用。最后,我提取了 $HIVE_HOME/lib/hive-*.jar 中可用的所有 classes 并创建了一个新的 jar。这次成功了。 jar 文件的大小超过 20MB。由于每次我 运行 多维数据集作业时都会使用这些 jar 文件,因此我将所有这些 jar 文件复制到 $HADOOP_HOME/share/hadoop/common/hive-metastore-0.14.0.jar.

下的所有节点

我认为应该创建 kylin-job-1.1.1-incubating.jar 以包含其所有依赖项。