本篇文章,参考了两位大佬的博客,稍微做了一些修改,仅仅供参考。
一、MongoDB部署
1.1 软件版本
CDH6.2.1
MongoDB3.4.24
CentOS7
1.2 下载
点击链接https://www.mongodb.com/try/download/community,进入官网下载rpm文件:
我们需要下载四个package:
1、server: mongoDB的服务端程序
2、utilities: 附加工具,如数据导入导出(可选)
3、mongos: 部署集群(可选)
4、shell: 用命令行连接mongoDB
1.3 安装
输入如下命令则可以安装上述4个package:
rpm -ivh mongodb-org-server-3.4.24-1.el7.x86_64.rpm
rpm -ivh mongodb-org-tools-3.4.24-1.el7.x86_64.rpm
rpm -ivh mongodb-org-mongos-3.4.24-1.el7.x86_64.rpm
rpm -ivh mongodb-org-shell-3.4.24-1.el7.x86_64.rpm
这里我将rpm包放在/opt/mongodb
目录下,rpm -qpl
rpm
包名 可以查看对应路径,
比如执行:
rpm -qpl mongodb-org-mongos-3.4.24-1.el7.x86_64.rpm
1.4 启动
systemctl start mongod
1.5 连接
mongo --port 27017
1.6 配置
经过以上步骤,会生成一个/etc/mongod.conf的配置文件,配置了mongoDB默认的配置。默认的配置文件如下:
# mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
# Where and how to store data.
storage:
dbPath: /var/lib/mongo
journal:
enabled: true
# engine:
# mmapv1:
# wiredTiger:
# how the process runs
processManagement:
fork: true # fork and run in background
pidFilePath: /var/run/mongodb/mongod.pid # location of pidfile
timeZoneInfo: /usr/share/zoneinfo
# network interfaces
net:
port: 27017
bindIp: 127.0.0.1 # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.
#security:
#operationProfiling:
#replication:
#sharding:
## Enterprise-Only Options
#auditLog:
#snmp:
这是一个yaml格式的配置文件,其中systemLog.path指明了mongoDB的系统运行日志的路径,storage.dbPath指定了mongoDB数据文件存放路径,processManagement.pidFilePath指明了mongoDB运行时进程文件存放路径,net.port指明了mongodDB服务的网络端口号,net.bindIp则制定了mongoDB网络服务绑定的ip地址。直接使用这些默认的配置,mongoDB就可以运行起来。但是,会存在以下问题:
1.上面这些路径都是散落在操作系统的各个目录中,在实际情况中我们想在一个存储空间比较大的路径下来存储mongoDB的数据,同时将相关的一些文件都放在同一目录下,例如这个路径是/data/mongodb/。/data/mongodb存储的是mongoDB存储的数据,日志文件目录使用默认目录;
2.默认配置的网络服务绑定地址为127.0.0.1,也就意味着默认情况下只能本机连接mongoDB。
3.采用的默认端口27017在一些情况下可能会遭到外部的攻击。需要改一个不太常用的端口。
所以,我们修改了这个默认的配置文件内容如下:
# mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
# Where and how to store data.
storage:
dbPath: /data/mongodb
journal:
enabled: true
# engine:
# mmapv1:
# wiredTiger:
# how the process runs
processManagement:
fork: true # fork and run in background
pidFilePath: /var/run/mongodb/mongod.pid # location of pidfile
# network interfaces
net:
port: 27017 #测试集群,不做修改
bindIp: 0.0.0.0 # Listen to local interface only, comment to listen on all interfaces.
#security:
#operationProfiling:
#replication:
#sharding:
## Enterprise-Only Options
#auditLog:
执行以下命令准备好环境
[root@Mysql_Master ~]# mkdir /data/mongodb
[root@Mysql_Master bin]# chown -R mongod:mongod /data/mongodb/
如果相应的日志文件也修改了目录,创建对应目录即可。
1.7 启动
如果没有使用mongoDB默认的文件目录和默认的端口,那么在启动之前,我们需要将selinux的状态设置为Permissive
setenforce 0
执行启动mongodb服务:
systemctl start mongod
1.8 设置账号密码(此步暂时省略)
第1步:开启认证
转到/bin路径下
./mongod --auth
第2步:创建管理员用户
> use admin
switched to db admin
> db.createUser({user:"admin",pwd:"password",roles:["root"]})
Successfully added user: { "user" : "admin", "roles" : [ "root" ] }
第3步:认证登陆
> db.auth("admin", "password")
二、 Hive对接MongoDB
2.1 配置
查看hive-env.sh路径:
我这里之前有配置用于其他服务,不做修改。
下载jar包,放入上述目录下:
https://mvnrepository.com/artifact/org.mongodb/mongo-java-driver/3.6.3
https://mvnrepository.com/artifact/org.mongodb.mongo-hadoop/mongo-hadoop-hive/2.0.2
https://mvnrepository.com/artifact/org.mongodb.mongo-hadoop/mongo-hadoop-core/2.0.2
注意:mongo-java-driver的jar包版本不能低于mongodb组件版本
其他版本软件下载地址:
https://repo1.maven.org/maven2/org/mongodb/
进入到上述网站后,点击对应红色框选的jar包下载到windows端后上传linux对应hive-env.sh的目录下即可:
修改文件权限:
chmod -R 777 /opt/cloudera/parcels/GPLEXTRAS/lib/hadoop/lib
2.2 简单测试
Mongodb服务器上执行:
[root@Mysql_Master bin]# mongo --port 27017
> use test;
> db.user.insert({name:'lisi',age:22})
进入到hive中测试:
hive> use text;
hive> CREATE TABLE user_tmp (
> name STRING,
> age INT
> ) STORED BY 'com.mongodb.hadoop.hive.MongoStorageHandler'
> WITH SERDEPROPERTIES('mongo.columns.mapping'='{"name":"name","age":"age"}')
> TBLPROPERTIES('mongo.uri'='mongodb://192.168.99.41:27017/test.user');
hive> select * from user_tmp;
Mongodb中再插入数据:
> db.user.insert({name:'zhangsan',age:11})
> db.user.insert({name:'liqiushi',age:33})
> db.user.insert({name:'jiuer',age:19})
> db.user.insert({name:'lanlan',age:24})
再进入hive中查询查看:
同时,可以尝试CRUD的其他操作,数据都是实时同步的。
解释:如果是内部表,在删除表时,也会删除mongodb里面的数据。
Mongo.columns.mapping:hive表与mongodb字段的映射,字段名完全相同,可以不写,
('mongo.columns.mapping'='{"id":"_id","adam":"Adam","create_time":"createTime"}')
mongo.uri'='mongodb://用户名:密码@IP:端口/库.表
注意:
本次测试没有加入用户名密码,因为之前没有配置,设置密码时建议不要导游@会与mongo.uri造成无法识别。
参考文档:
https://blog.csdn.net/shujuelin/article/details/106372341
https://blog.csdn.net/weixin_37569048/article/details/103110047
写的很棒!!!