Hadoop+Hive 操作mongodb数据
1、版本概述
hadoop-2.7.3、hive-2.2
下载响应的jar包:http://mvnrepository.com/,直接搜索想要的jar包,例如本次安装需要的:
mongo-hadoop-core-2.0.2.jar、mongo-hadoop-hive-2.0.2.jar、mongo-java-driver-3.2.1.jar
下载自己需要的版本,版本要统一。
2、配置
将下载好的jar包分别上传到hadoop和hive的lib目录下:
3、启动hive,加载jar包
进入到hive的家目录下的bin目录,./hive
hive>add jar /data/hadoop-2.7.3/hive-2.2/lib/mongo-hadoop-core-2.0.2.jar;
hive>add jar /data/hadoop-2.7.3/hive-2.2/lib/mongo-hadoop-hive-2.0.2.jar;
hive>add jar /data/hadoop-2.7.3/hive-2.2/lib/mongo-java-driver-3.2.1.jar;
4、hive操作mongodb方式有两种:
1)MongoDB-based 直接连接hidden节点,使用 com.mongodb.hadoop.hive.MongoStorageHandler做数据Serde
2)BSON-based 将数据dump成bson文件,上传到HDFS系统,使用 com.mongodb.hadoop.hive.BSONSerDe
5、mongodb-based:
在命令行直接运行hive:
# hive
hive> CREATE TABLE eventlog (
> id string,
> userid string,
> type string,
> objid string,
> time string,
> source string)
> STORED BY 'com.mongodb.hadoop.hive.MongoStorageHandler'
> WITH SERDEPROPERTIES('mongo.columns.mapping'='{"id":"_id"}')
> TBLPROPERTIES('mongo.uri'='mongodb://user:password@ip:port /saturn.users');-
有两种方式来指定所需连接的Mongo Collection。
1. 在上述示例里面,通过mongo.uri
这个表属性来指定,属性的值填入的是MongoDB connection string,通过它来指向具体的collection。这种方式会将这个URI存入表的metadata里面,如果需要填写连接的一些认证信息(如username:password
等),该方式不太适合。
2. 第二种方式是把connection string填入一个properties文件,如:# HiveTable.properties mongo.input.uri=mongodb://
user:password@ip:port /saturn.users'
-
然后提供这个文件的路径给
mongo.properties.path
这个表参数,如hive> CREATE EXTERNAL TABLE eventlog (
TBLPROPERTIES('mongo.properties.path'='HiveTable.properties');
> id string,
> userid string,
> type string,
> objid string,
> time string,
> source string)
> STORED BY 'com.mongodb.hadoop.hive.MongoStorageHandler'
> WITH SERDEPROPERTIES('mongo.columns.mapping'='{"id":"_id"}')
> hive> select * from eventlog limit 10;
OK
5694b8807aff70d36f526a19 NULL NULL NULL NULL NULL
56960a27f95a32ad7e2b9719 NULL NULL NULL NULL NULL
56961da0f95a32ad7e2b971c NULL NULL NULL NULL NULL
56961eeaf95a32ad7e2b9721 NULL NULL NULL NULL NULL
569735e4837bb8e43e0260b1 NULL NULL NULL NULL NULL
56973672837bb8e43e0260b3 NULL NULL NULL NULL NULL
56974a73837bb8e43e0260ba NULL NULL NULL NULL NULL
5697578ff5531e4d74c05db8 NULL NULL NULL NULL NULL
5697894294e366e131643ac5 NULL NULL NULL NULL NULL
56978a5b94e366e131643ac7 NULL NULL NULL NULL NULL
Time taken: 1.905 seconds, Fetched: 10 row(s)
它是直接处理mongo里最新的数据.
4)create
EXTERNAL
table
IF
NOT
EXISTS
outer_table (userid string)
partitioned by
(ptDate
string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY
' '
;
如果创建的表是EXTERNAL
的,那么在Hive里删除这张表时,不会影响MongoDB里面的数据,只会删除这张表的metadata。如果没有指定EXTERNAL
,那么删除表的时候会连带MongoDB里的数据一并删除,因此最好是指定创建的表为EXTERNAL
。
5)
如果你想存到HDFS里也可以,用如下语句就可以。
hive> create table
qsstest as select * from eventlog limit 10;
6、 BSON-based方式
参考: