本节书摘来异步社区《Hadoop实战手册》一书中的第1章,第1.9节,作者: 【美】Jonathan R. Owens , Jon Lentz , Brian Femiano 译者: 傅杰 , 赵磊 , 卢学裕 责编: 杨海玲,更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.9 使用Pig从HDFS导出数据到MongoDB
MongoDB是一种NoSQL数据库,用于存储和检索海量数据。MongoDB通常用于存储面向用户的数据,这些数据必须经过清洗、格式化之后才可以被使用。Apache Pig从某种程度上讲就是用来处理这种任务的。Mongostorage类使得使用Pig可以非常方便地批量处理HDFS上的数据,再直接将这些数据导入MongoDB中。本节将使用Mongostorage类将HDFS上的数据导出到MongoDB数据库中。
准备工作
使用Mongo Hadoop适配器最简单的方法是从GitHub上克隆Mongo-Hadoop工程,并且将该工程编译到一个特定的Hadoop版本。克隆该工程需要安装一个Git客户端。
本节假定你使用的Hadoop版本是CDH3。
Git客户端官方的下载地址是:http://git-scm.com/downloads。
在Windows操作系统上可以通过http://windows.github.com/访问GitHub。
在Mac操作系统上可以通过http://mac.github.com/访问GitHub。
可以通过https://github.com/mongodb/mongo-hadoop获取到Mongo Hadoop适配器。该工程需要编译在特定的Hadoop版本上。编译完的JAR文件需要复制到Hadoop集群每个节点的$HADOOP_HOME/lib目录下。
Mongo Java的驱动包也需要安装到Hadoop集群每个节点的$HADOOP_HOME/lib目录下。该驱动包可从https://github.com/mongodb/mongo-java-driver/downloads下载。
操作步骤
完成下面的步骤,将数据从HDFS复制到MongoDB。
1.通过下面的命令实现克隆mongo-hadoop工程:
git clone https://github.com/mongodb/mongo-hadoop.git
2.切换到稳定发布的1.0分支版本:
git checkout release-1.0
3.必须保持mongo-hadoop与Hadoop的版本一致。使用文本编辑器打开mongo-hadoop克隆目录下的build.sbt文件,修改下面这行:
hadoopRelease in ThisBuild := "default"
修改为:
hadoopRelease in ThisBuild := "cdh3"
4.编译mongo-hadoop:
./sbt package.
这将会在core/target文件夹下生成一个名为mongo-hadoop-core_cdh3u3-1.0.0.jar的JAR文件。
5.从https://github.com/mongodb/mongo-java-driver/downloads下载MongoDB 2.8.0版本的Java驱动包。
6.复制mongo-hadoop-core、mongo-hadoop-pig和MongoDB Java驱动包到Hadoop集群每个节点的$HADOOP_HOME/lib:
cp mongo-hadoop-core_cdh3u3-1.0.0.jar mongo-2.8.0.jar $HADOOP_HOME/lib
7.创建一个Pig脚本读取HDFS上的weblogs数据并将其存储到MongoDB数据库:
register /path/to/mongo-hadoop/mongo-2.8.0.jar
register /path/to/mongo-hadoop/core/target/mongo-hadoop-core- 1.0.0.jar
register /path/to/mongo-hadoop/pig/target/mongo-hadoop-pig- 1.0.0.jar
define MongoStorage com.mongodb.hadoop.pig.MongoStorage();
weblogs = load '/data/weblogs/weblog_entries.txt' as
(md5:chararray, url:chararry, date:chararray, time:chararray,
ip:chararray);
store weblogs into 'mongodb://<HOST>:<PORT>/test.weblogs_from_pig' using
MongoStorage();
工作原理
Mongo Hadoop适配器提供了一种新的兼容Hadoop的文件系统实现,包括MongoInputFormat和MongoOutputFormat。这些抽象实现使得访问MongoDB和访问任何兼容Hadoop的文件系统一样。MongoStorage将Pig类型转化为MongoDB可以直接访问的BasicDBObjectBuilder类型。