《Hadoop实战手册》一1.8 从MongoDB导入数据到HDFS

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介:

本节书摘来异步社区《Hadoop实战手册》一书中的第1章,第1.8节,作者: 【美】Jonathan R. Owens , Jon Lentz , Brian Femiano 译者: 傅杰 , 赵磊 , 卢学裕 责编: 杨海玲,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.8 从MongoDB导入数据到HDFS

本节将使用MongoInputFormat类加载MongoDB中的数据导入HDFS中。

准备工作
使用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下载。

操作步骤
完成下面步骤实现将MongoDB中的数据复制到HDFS中。

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和MongoDB Java驱动包到Hadoop集群每个节点的$HADOOP_HOME/lib:

cp mongo-hadoop-core_cdh3u3-1.0.0.jar mongo-2.8.0.jar $HADOOP_HOME/lib

7.编写MapReduce读取MongoDB数据库中的数据并写入HDFS中:

import java.io.*; 
import org.apache.commons.logging.*; 
import org.apache.hadoop.conf.*; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.io.*; 
import org.apache.hadoop.mapreduce.lib.output.*; 
import org.apache.hadoop.mapreduce.*; 
import org.bson.*; 

import com.mongodb.hadoop.*; 
import com.mongodb.hadoop.util.*; 

public class ImportWeblogsFromMongo { 

   private static final Log log = LogFactory. 
getLog(ImportWeblogsFrom Mongo.class);

   public static class ReadWeblogsFromMongo extends Mapper<Object,   
BSONObject, Text, Text>{

      public void map(Object key, BSONObject value, Context context) throws   
IOException, InterruptedException{ 
         System.out.println("Key: " + key); 
         System.out.println("Value: " + value); 

         String md5 = value.get("md5").toString(); 
         String url = value.get("url").toString(); 
         String date = value.get("date").toString(); 
         String time = value.get("time").toString(); 
         String ip = value.get("ip").toString(); 
         String output = "\t" + url + "\t" + date + "\t" + 
                          time + "\t" + ip; 
         context.write( new Text(md5), new Text(output)); 
    } 
}
public static void main(String[] args) throws Exception{ 
   final Configuration conf = new Configuration(); 
   MongoConfigUtil.setInputURI(conf, "mongodb://<HOST>:<PORT>/test.weblogs"); 
   MongoConfigUtil.setCreateInputSplits(conf, false); 
   System.out.println("Configuration: " + conf); 
   final Job job = new Job(conf, "Mongo Import"); 
   Path out = new Path("/data/weblogs/mongo_import"); 
   FileOutputFormat.setOutputPath(job, out); 
   job.setJarByClass(ImportWeblogsFromMongo.class); 
   job.setMapperClass(ReadWeblogsFromMongo.class); 
   job.setOutputKeyClass(Text.class); 
   job.setOutputValueClass(Text.class); 
   job.setInputFormatClass(MongoInputFormat.class); 
   job.setOutputFormatClass(TextOutputFormat.class); 
   job.setNumReduceTasks(0); 
   System.exit(job.waitForCompletion(true) ? 0 : 1 ); 
   } 
}

这个只有map的作业用到了Mongo Hadoop适配器提供的几个类。从HDFS读入的数据会被转换成一个BSONObject对象。该类描述的是一个二进制的JSON值。MongoDB使用这些BSONObject对象来有效地序列化、传输和存储数据。

Mongo Hadoop适配器还提供了一个方便的工具类MongoConfigUtil,使得可以把MongoDB当成是一个文件系统来访问。

8.导出为一个可运行的JAR文件,并运行该作业:

hadoop jar ImportWeblogsFromMongo.jar

9.验证weblogs数据是否已经导入HDFS中:

hadoop fs -ls /data/weblogs/mongo_import

工作原理
Mongo Hadoop适配器提供了一种新的兼容Hadoop的文件系统实现,包括MongoInputFormat和MongoOutputFormat。这些抽象实现使得访问MongoDB和访问任何兼容Hadoop的文件系统一样。

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
4月前
|
存储 分布式计算 Hadoop
Hadoop系列HDFS详解
Hadoop系列HDFS详解
40 0
|
5天前
|
分布式计算 Hadoop 测试技术
Hadoop【基础知识 05】【HDFS的JavaAPI】(集成及测试)
【4月更文挑战第5天】Hadoop【基础知识 05】【HDFS的JavaAPI】(集成及测试)
28 8
|
5天前
|
分布式计算 资源调度 Hadoop
Hadoop【基础知识 03+04】【Hadoop集群资源管理器yarn】(图片来源于网络)(hadoop fs + hadoop dfs + hdfs dfs 使用举例)
【4月更文挑战第5天】Hadoop【基础知识 03】【Hadoop集群资源管理器yarn】(图片来源于网络)Hadoop【基础知识 04】【HDFS常用shell命令】(hadoop fs + hadoop dfs + hdfs dfs 使用举例)
31 9
|
6天前
|
分布式计算 Hadoop Shell
Hadoop【基础知识 04】【HDFS常用shell命令】(hadoop fs + hadoop dfs + hdfs dfs 使用举例)
【4月更文挑战第4天】Hadoop【基础知识 04】【HDFS常用shell命令】(hadoop fs + hadoop dfs + hdfs dfs 使用举例)
18 5
|
9天前
|
存储 分布式计算 Hadoop
【Hadoop】HDFS 读写流程
【4月更文挑战第9天】【Hadoop】HDFS 读写流程
|
3月前
|
存储 分布式计算 Hadoop
Hadoop的Secondary NameNode在HDFS中的作用是什么?
Hadoop的Secondary NameNode在HDFS中的作用是什么?
36 0
|
4月前
|
存储 分布式计算 资源调度
[hadoop3.x]HDFS中的内存存储支持(七)概述
[hadoop3.x]HDFS中的内存存储支持(七)概述
50 0
|
4月前
|
SQL 分布式计算 Hadoop
[AIGC ~大数据] 深入理解Hadoop、HDFS、Hive和Spark:Java大师的大数据研究之旅
[AIGC ~大数据] 深入理解Hadoop、HDFS、Hive和Spark:Java大师的大数据研究之旅
|
4月前
|
存储 SQL 分布式计算
Hadoop(HDFS+MapReduce+Hive+数仓基础概念)学习笔记(自用)
Hadoop(HDFS+MapReduce+Hive+数仓基础概念)学习笔记(自用)
254 0
|
4月前
|
分布式计算 Hadoop 大数据
大数据成长之路-- hadoop集群的部署(3)HDFS新增节点
大数据成长之路-- hadoop集群的部署(3)HDFS新增节点
66 0