使用MongoDB Hadoop驱动程序创建Hive表

时间:2016-04-14 17:04:25

标签: mongodb hadoop hive mongodb-hadoop

我正在尝试使用维基站点上提供的驱动程序(jars)从Hive数据库连接到MongoDB中的集合。以下是我所做的步骤: -

我在MongoDB中创建了一个名为“Diamond”的集合,名为“Moe”,它有20个文档:

我想通过Hadoop MongoDB驱动程序从Hive连接,并通过Hive查看这些文档。

我将MongoDB和Hive安装在同一台服务器上并进行了配置。但是我没有看到任何称为HIVE_CLASPATH的变量我想知道它在哪里。

So I installed 3 divers on the server: -
mongo-hadoop-core-1.5.2.jar;
mongo-hadoop-hive-1.5.2.jar;
mongo-java-driver-3.0.0.jar;

现在,我连接到Hive,然后通过以下命令将这2个jar添加到我的类路径中: - (它们成功添加)

add jar /hadoopgdc/hadoop-2.6.0/share/hadoop/common/lib/mongo-hadoop-hive-1.5.2.jar;
add jar /hadoopgdc/hadoop-2.6.0/share/hadoop/common/lib/mongo-hadoop-core-1.5.2.jar;
add jar /hadoopgdc/hadoop-2.6.0/share/hadoop/common/lib/mongo-java-driver-3.0.0.jar;

现在我在HIVE中创建一个表: -

CREATE TABLE Diamond
(
carat    DOUBLE,
cut      STRING,
color    STRING,
clarity  STRING,
depth    DOUBLE,
table    DOUBLE,
price    DOUBLE,
xcord    DOUBLE,
ycord    DOUBLE,
zcord    DOUBLE
)
STORED BY 'com.mongodb.hadoop.hive.MongoStorageHandler'
WITH SERDEPROPERTIES('mongo.columns.mapping'='{"carat":"carat","cut":"cut",                 
"color":"color", "clarity":"clarity", "depth":"depth", "table":"table", 
"price":"price", "xcord":"x", "ycord":"y", "zcord":"z"}')
TBLPROPERTIES('mongo.uri'='mongodb://localhost:27017/Moe.Diamond');


However when I execute the above command in Hive I get the error below: -

java.lang.NoClassDefFoundError: com/mongodb/util/JSON
    at com.mongodb.hadoop.hive.BSONSerDe.initialize(BSONSerDe.java:110)
    at     org.apache.hadoop.hive.metastore.MetaStoreUtils.getDeserializer(MetaStoreUtils.java:210)
    at org.apache.hadoop.hive.ql.metadata.Table.getDeserializerFromMetaStore(Table.java:268)
    at org.apache.hadoop.hive.ql.metadata.Table.getDeserializer(Table.java:261)
    at org.apache.hadoop.hive.ql.metadata.Table.getCols(Table.java:587)
    at org.apache.hadoop.hive.ql.metadata.Hive.createTable(Hive.java:573)
    at org.apache.hadoop.hive.ql.exec.DDLTask.createTable(DDLTask.java:3784)
    at org.apache.hadoop.hive.ql.exec.DDLTask.execute(DDLTask.java:256)
    at org.apache.hadoop.hive.ql.exec.Task.executeTask(Task.java:155)
    at org.apache.hadoop.hive.ql.exec.TaskRunner.runSequential(TaskRunner.java:57)
    at org.apache.hadoop.hive.ql.Driver.launchTask(Driver.java:1355)
    at org.apache.hadoop.hive.ql.Driver.execute(Driver.java:1139)
    at org.apache.hadoop.hive.ql.Driver.run(Driver.java:945)
    at org.apache.hadoop.hive.cli.CliDriver.processLocalCmd(CliDriver.java:259)
    at org.apache.hadoop.hive.cli.CliDriver.processCmd(CliDriver.java:216)
    at org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:413)
    at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:756)
    at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:614)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at  sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:212)
    Caused by: java.lang.ClassNotFoundException: com.mongodb.util.JSON
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    ... 23 more
    FAILED: Execution Error, return code -101 from 
   org.apache.hadoop.hive.ql.exec.DDLTask

我尝试过以下方法: - - 将罐放在每个可能的目录中,没有任何效果 - 应该丢失的类几乎存在于jar文件中。 - 哦,是的,MongoStorageHandler类非常适合jar。

我这完全打破了我的头!如果有人能说清楚我能做些什么来减轻我的焦虑,那就太好了。

再次感谢。 马里奥

1 个答案:

答案 0 :(得分:-1)

我确定了问题所在。要从HIVE连接到MongoDB,MongoDb驱动程序使用在hive jar库中调用java类 **

  

抛出java.lang.ClassNotFoundException:   org.apache.hadoop.hive.ql.hooks.PreExecutePrinter

** 现在这个类应该在jar文件中找到 - hive-exec-0.11.0.1.3.2.0-111.jar。但是,它仅适用于最新版本的HIVE,而不适用于较旧的版本。

在0.11.0.1.3.2.0-111中不可用,但在0.13.0.2.1.7.0-784中可见。

此处的解决方案是连接到驱动程序支持的HIVE版本。 MongoDB确实声明其驱动程序支持某个版本的Hadoop,但没有深入到单个应用程序(HIVE / SQOOP)。