`

[置顶] Hadoop与MongoDB整合(Hive篇)

阅读更多

 

 

 

 

1.背景

公司希望使用MongoDB作为后端业务数据库,使用Hadoop平台作为数据平台。最开始是先把数据从MongoDB导出来,然后传到HDFS,然后用Hive/MR处理。我感觉这也太麻烦了,现在不可能没有人想到这个问题,于是就搜了一下,结果真找到一个MongoDB Connector for Hadoop

2.MongoDB简介–摘自邹贵金的《mongodb》一书

NoSQL数据库与传统的关系型数据库相比,它具有操作简单、完全免费、源码公开、随时下载等特点,并可以用于各种商业目的。这使NoSQL产品广泛应用于各种大型门户网站和专业网站,大大降低了运营成本。 
2010年,随着互联网Web2.0网站的兴起,NoSQL在国内掀起一阵热潮,其中风头最劲的莫过于MongoDB了。越来越多的业界公司已经将MongoDB投入实际的生产环境,很多创业团队也将MongoDB作为自己的首选数据库,创造出非常之多的移动互联网应用。 
MongoDB的文档模型自由灵活,可以让你在开发过程中畅顺无比。对于大数据量、高并发、弱事务的互联网应用,MongoDB可以应对自如。MongoDB内置的水平扩展机制提供了从百万到十亿级别的数据量处理能力,完全可以满足Web2.0和移动互联网的数据存储需求,其开箱即用的特性也大大降低了中小型网站的运维成本。

3.Hadoop HA集群搭建与Hive安装

Hadoop HA高可用集群搭建(2.7.2) 
Hive安装及使用演示

4.正式开始

Installation

Obtain the MongoDB Hadoop Connector. You can either build it or download the jars. For Hive, you'll need the "core" jar and the "hive" jar.
Get a JAR for the MongoDB Java Driver. The connector requires at least version 3.0.0 of the driver "uber" jar (called "mongo-java-driver.jar").
In your Hive script, use ADD JAR commands to include these JARs (core, hive, and the Java driver), e.g., ADD JAR /path-to/mongo-hadoop-hive-<version>.jar;.

Requirements 
Supported Hadoop and Hive versions

As of August 2013, only Hive versions <= 0.10 are stable. Mongo-Hadoop currently supports Hive versions >= 0.9. Some classes and functions are deprecated in Hive 0.11, but they’re still functional.

Hadoop versions greater than 0.20.x are supported. CDH4 is supported, but CDH3 with its native Hive 0.7 is not. However, CDH3 is compatible with newer versions of Hive. Installing a non-native version with CDH3 can be used with Mongo-Hadoop. 
1.版本一定要按它要求的来,jar包去http://mvnrepository.com/下载就可以了,使用Hive只需要三个: 
mongo-hadoop-core-1.5.1.jar 
mongo-hadoop-hive-1.5.1.jar 
mongo-Java-driver-3.2.1.jar 
2.将jar包拷到 HADOOPHOME/lib{HIVE_HOME}/lib下,然后启动Hive,加入jar包

[hadoop@DEV21 ~]$ hive

Logging initialized using configuration in jar:file:/home/hadoop/opt/apache-hive-1.2.1-bin/lib/hive-common-1.2.1.jar!/hive-log4j.properties
hive> add jar /home/hadoop/opt/hive/lib/mongo-hadoop-core-1.5.1.jar;#三个都加,我这就不写了。
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

3.Hive Usage有两种连接方式:

其一MongoDB-based 直接连接hidden节点,使用 com.mongodb.hadoop.hive.MongoStorageHandler做数据Serde
其二BSON-based 将数据dump成bson文件,上传到HDFS系统,使用 com.mongodb.hadoop.hive.BSONSerDe

MongoDB-based方式

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://username:password@ip:port/xxx.xxxxxx');
hive> select * from eventlog limit 10;
OK
5757c2783d6b243330ec6b25    NULL    shb NULL    2016-06-08 15:00:07 NULL
5757c27a3d6b243330ec6b26    NULL    shb NULL    2016-06-08 15:00:10 NULL
5757c27e3d6b243330ec6b27    NULL    shb NULL    2016-06-08 15:00:14 NULL
5757c2813d6b243330ec6b28    NULL    shb NULL    2016-06-08 15:00:17 NULL
5757ee443d6b242900aead78    NULL    shb NULL    2016-06-08 18:06:59 NULL
5757ee543d6b242900aead79    NULL    smb NULL    2016-06-08 18:07:16 NULL
5757ee553d6b242900aead7a    NULL    cmcs    NULL    2016-06-08 18:07:17 NULL
5757ee593d6b242900aead7b    NULL    vspd    NULL    2016-06-08 18:07:21 NULL
575b73b2de64cc26942c965c    NULL    shb NULL    2016-06-11 10:13:06 NULL
575b73b5de64cc26942c965d    NULL    shb NULL    2016-06-11 10:13:09 NULL
Time taken: 0.101 seconds, Fetched: 10 row(s)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

这时HDFS里是没有存任何数据的,只有与表名一样的文件夹 
这里写图片描述 
当你处理的时候,它是直接处理mongo里最新的数据。当然,如果你想存到HDFS里也可以,用CTAS语句就可以。 
hive> create table qsstest as select * from eventlog limit 10; 
这里写图片描述 
还可以下载下来呢 
PS:mongo的用户要有读写权限,jar包别忘了拷进去! 
另一种方式我感觉有点没必要,没试,但我找到一篇博客详细写了。 
下面转自:MongoDB与Hadoop技术栈的整合应用 
BSON-based方式

BSON-based需要先将数据dump出来,但这个时候的dump与export不一样,不需要关心具体的数据内容,不需要指定fields list.

mongodump --host=datatask01:29017 --db=test --collection=ldc_test --out=/tmp
hdfs dfs -mkdir /dev_test/dli/bson_demo/
hdfs dfs -put /tmp/test/ldc_test.bson /dev_test/dli/bson_demo/
- 创建映射表
create external table temp.ldc_test_bson
(
  id string,
  fav_id array<int>,
  info struct<github:string, location:string>
)
ROW FORMAT SERDE "com.mongodb.hadoop.hive.BSONSerDe"
WITH SERDEPROPERTIES('mongo.columns.mapping'='{"id":"id","fav_id":"fav_id","info.github":"info.github","info.location":"info.location"}')
STORED AS INPUTFORMAT "com.mongodb.hadoop.mapred.BSONFileInputFormat"
OUTPUTFORMAT "com.mongodb.hadoop.hive.output.HiveBSONFileOutputFormat"
location '/dev_test/dli/bson_demo/';
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

OK,我们先来看下query的结果

0: jdbc:hive2://hd-cosmos-01:10000/default> select * from temp.ldc_test_mongo;
+--------------------+------------------------+-----------------------------------------------------------------+--+
| ldc_test_mongo.id  | ldc_test_mongo.fav_id  |                       ldc_test_mongo.info                       |
+--------------------+------------------------+-----------------------------------------------------------------+--+
| @Tony_老七           | [3,33,333,3333,33333]  | {"github":"https://github.com/tonylee0329","location":"SH/CN"}  |
+--------------------+------------------------+-----------------------------------------------------------------+--+
1 row selected (0.345 seconds)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

这样数据就存储在一个table,使用中如果需要打开数组,可以这样

SELECT id, fid
FROM temp.ldc_test_mongo LATERAL VIEW explode(fav_id) favids AS fid;
-- 访问struct结构数据 
select id, info.github from temp.ldc_test_mongo
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4
//根据不同的数据类型进行反序列操作,复杂类型在内容做element的循环,最终调用的都是对原子类型的操作.
 public Object deserializeField(final Object value, final TypeInfo valueTypeInfo, final String ext) {
        if (value != null) {
            switch (valueTypeInfo.getCategory()) {
                case LIST:
                    return deserializeList(value, (ListTypeInfo) valueTypeInfo, ext);
                case MAP:
                    return deserializeMap(value, (MapTypeInfo) valueTypeInfo, ext);
                case PRIMITIVE:
                    return deserializePrimitive(value, (PrimitiveTypeInfo) valueTypeInfo);
                case STRUCT:
                    // Supports both struct and map, but should use struct 
                    return deserializeStruct(value, (StructTypeInfo) valueTypeInfo, ext);
                case UNION:
                    // Mongo also has no union
                    LOG.warn("BSONSerDe does not support unions.");
                    return null;
                default:
                    // Must be an unknown (a Mongo specific type)
                    return deserializeMongoType(value);
            }
        }
        return null;
    }

// 转为java的原子类型存储.
 private Object deserializePrimitive(final Object value, final PrimitiveTypeInfo valueTypeInfo) {
        switch (valueTypeInfo.getPrimitiveCategory()) {
            case BINARY:
                return value;
            case BOOLEAN:
                return value;
            case DOUBLE:
                return ((Number) value).doubleValue();
            case FLOAT:
                return ((Number) value).floatValue();
            case INT:
                return ((Number) value).intValue();
            case LONG:
                return ((Number) value).longValue();
            case SHORT:
                return ((Number) value).shortValue();
            case STRING:
                return value.toString();
            case TIMESTAMP:
                if (value instanceof Date) {
                    return new Timestamp(((Date) value).getTime());
                } else if (value instanceof BSONTimestamp) {
                    return new Timestamp(((BSONTimestamp) value).getTime() * 1000L);
                } else if (value instanceof String) {
                    return Timestamp.valueOf((String) value);
                } else {
                    return value;
                }
            default:
                return deserializeMongoType(value);
        }
    }
分享到:
评论

相关推荐

    基于Hadoop与MongoDB整合技术的大数据处理分析.pdf

    为了更好地处理日益增长的数据量,Hadoop与MongoDB之间的整合技术变得越来越重要。 Hadoop是一个由Apache基金会开发的开源框架,它允许使用简单的编程模型在分布式系统中存储和处理大数据。Hadoop的核心是HDFS...

    面向大数据处理的Hadoop与MongoDB整合技术研究.pdf

    因此,本文深入探讨了Hadoop与MongoDB整合技术,以期达到优势互补,提高数据处理效率。 在大数据处理的场景下,结合Hadoop和MongoDB各自的优点,可以设计出多种整合方案。本文提出了四种不同的整合方案,每种方案都...

    hadoop,hbase,hive版本整合兼容性最全,最详细说明【适用于任何版本】

    本文将介绍Hadoop、HBase、Hive以及ZooKeeper的版本整合兼容性,以及如何根据版本找到兼容性信息。 首先,Hadoop是一个开源的分布式存储和计算框架,它由HDFS和MapReduce两部分组成。HDFS用于存储大数据,而...

    基于Hadoop的数据仓库Hive学习指南.doc

    【标题】:“基于Hadoop的数据仓库Hive学习指南” 【描述】:该文档是一份针对Hive的学习资料,旨在引导读者理解如何在Hadoop平台上利用Hive进行数据仓库操作和编程实践。它涵盖了Hive的基本概念、安装步骤、实验...

    hadoop,hbase,hive版本整合兼容性最全,最详细说明【适用于任何版本】 -

    不同版本的Hadoop可能会对HDFS的API或MapReduce的执行模型进行优化,因此,HBase和Hive需要与相应的Hadoop版本保持兼容。例如,Hadoop 2.x引入了YARN资源管理系统,这可能需要HBase和Hive的更新版本来适应。 对于...

    新手指导hadoop、hbase、hive版本对应关系查找表

    通常,Hadoop的版本发布会包括对HBase和Hive的兼容性测试报告,但这并不意味着所有早期版本的HBase和Hive都能与新版Hadoop完全兼容。相反,有时候新版本的Hadoop可能需要与特定版本的HBase和Hive一起使用才能正常...

    HADOOP+HBASE+HIVE整合工程和文档

    6. **监控与优化**:整合工程中需要监控Hadoop、HBase和Hive的性能,通过Ambari等工具进行资源调度、故障排查和性能调优。 在实际应用中,还会遇到如数据安全、容错机制、备份恢复、性能优化等挑战。对于开发者来说...

    hadoop+hbase+hive集群搭建

    构建Hadoop+HBase+Hive集群是一项复杂而细致的工作,涉及到时间同步、网络配置、用户管理、软件安装与配置等多个方面。每一环节都需精心设计和实施,才能确保集群的高效、稳定运行。上述步骤涵盖了从基础设施搭建到...

    Hadoop+Spark+Hive+HBase+Oozie+Kafka+Flume+Flink+ES+Redash等详细安装部署

    在大数据领域,构建一个完整的生态系统是至关重要的,其中包括多个组件,如Hadoop、Spark、Hive、HBase、Oozie、Kafka、Flume、Flink、Elasticsearch和Redash。这些组件协同工作,提供了数据存储、处理、调度、流...

    win10下搭建Hadoop环境(jdk+mysql+hadoop+scala+hive+spark) 3.docx

    在Windows 10环境下搭建Hadoop生态系统,包括JDK、MySQL、Hadoop、Scala、Hive和Spark等组件,是一项繁琐但重要的任务,这将为你提供一个基础的大数据处理平台。下面将详细介绍每个组件的安装与配置过程。 **1. JDK...

    大数据笔记,包含Hadoop、Spark、Flink、Hive、Kafka、Flume、ZK......

    大数据笔记,包含Hadoop、Spark、Flink、Hive、Kafka、Flume、ZK...... 大数据笔记,包含Hadoop、Spark、Flink、Hive、Kafka、Flume、ZK...... 大数据笔记,包含Hadoop、Spark、Flink、Hive、Kafka、Flume、ZK.......

    hadoop,hbase,hive版本兼容性说明.zip

    例如,Hive可能需要与Hadoop的特定版本匹配以确保数据读写的正确性,同时与HBase的集成可能要求特定版本的Hive才能正确地访问和操作HBase中的表。 **版本兼容性**: 版本兼容性问题通常涉及到API的改变、依赖库的...

    eclipse集成hadoop+spark+hive开发源码实例

    在Windows操作系统中,Eclipse是一款广泛使用的Java集成开发环境(IDE),它对于开发分布式计算框架如Hadoop、Spark以及数据仓库工具Hive来说,是非常有用的。本教程将深入讲解如何在Eclipse中集成这些组件,以创建...

    大数据hadoop分布式集群搭建(Hadoop、hbase、hive、mysql、zookeeper、Kafka、flume)

    自己整理的Hadoop环境的一些安装,和一些简单的使用,其中包括Hadoop、hbase、hive、mysql、zookeeper、Kafka、flume。都是一些简单的安装步骤和使用,只在自己的虚拟机(Linux centOS7)上使用测试过。按照步骤一步...

    清华大学精品大数据实战课程(Hadoop、Hbase、Hive、Spark)全套PPT课件含习题 共7个章节.rar

    清华大学精品大数据实战课程(Hadoop、Hbase、Hive、Spark)PPT课件含习题 第1章 大数据概述(13页).pptx 清华大学精品大数据实战课程(Hadoop、Hbase、Hive、Spark)PPT课件含习题 第2章 Hadoop基础(32页).pptx ...

    HADOOP 系统之hadoop pig hive 整合版

    通过整合Hadoop、Hive和Pig,可以构建一个强大的大数据处理生态系统。Hadoop负责数据的存储和计算,Hive提供SQL-like接口使得数据查询更加便捷,而Pig则为复杂的数据分析提供了更高效的解决方案。这三者协同工作,...

    hadoop2.2 hbase0.96.2 hive 0.13.1整合部署

    与Hadoop和HBase的整合,使得用户可以在Hadoop集群上进行更复杂的分析任务,同时也能利用HBase的实时查询能力。 【整合部署】 整合部署Hadoop、HBase和Hive涉及到多个步骤: 1. **环境准备**:首先确保所有服务器上...

    Hadoop+Hive集群搭建步骤

    VM虚拟机上,安装ubantu搭建hadoop+Hive集群,步骤详细。

    Hadoop集群监控与Hive高可用.pdf

    Hadoop集群监控与Hive高可用 本文档主要介绍了Hadoop集群监控和Hive高可用的解决方案,涵盖了Cacti和Ganglia两种监控工具的优缺点、Hive高可用集群的实现方案、HAProxy的应用和优化。 一、Hadoop集群监控 1. ...

Global site tag (gtag.js) - Google Analytics