DataX和MongoDB之间的数据导入导出案例
DataX和MongoDB之间的数据导入导出案例
0. 写在前面
- 版本信息说明:
MySQL数据库和DataX安装在一台机器node01上,而MongoDB是安装在node02这一台机器上
DataX版本:DataX3.0(开源版)
MongoDB版本:MongoDB-5.0.2(Linux环境下安装)
Linux版本:CentOS7.5
1. MongoDB前置知识
1.1 基础概念详解
1.1.1 数据库
一个 mongodb 中可以建立多个数据库。MongoDB 的默认数据库为"db",该数据库存储在 data 目录中。MongoDB 的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。
常见操作如下
1)显示所有数据库
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
解析如下:
-
admin:从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
-
local:这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
-
config:当 Mongo 用于分片设置时,config 数据库在内部使用,用于保存分片的相关信息。
2)显示当前使用的数据库
> db
test
3)切换数据库
> use local
switched to db local
> db
local
1.1.2 集合
集合就是 MongoDB 文档组,类似于 MySQL 中的 table。
集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。
MongoDB 中使用 createCollection() 方法来创建集合。下面我们来看看如何创建集合:
语法格式:
db.createCollection(name, options)
参数说明:
-
name: 要创建的集合名称
-
options: 可选参数, 指定有关内存大小及索引的选项,有以下参数:
字段 | 类型 | 描述 |
---|---|---|
capped | 布尔 | (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。 当该值为 true 时,必须指定 size 参数。 |
autoIndexId | 布尔 | (可选)如为 true,自动在 _id 字段创建索引。默认为 false。 |
size | 数值 | (可选)为固定集合指定一个最大值(以字节计)。 如果 capped 为 true,也需要指定该字段。 |
max | 数值 | (可选)指定固定集合中包含文档的最大数量。 |
案例 1:在 test 库中创建一个 whybigdata 的集合
> use test switched to db test
> db.createCollection("whybigdata")
{ "ok" : 1 }
> show collections
Whybigdata
// 插入数据
> db.whybigdata.insert({"name":"whybigdata","url":"www.whybigdata.com"}) WriteResult({ "nInserted" : 1 })
// 查看数据
> db.whybigdata.find()
{ "_id" : ObjectId("5d0314ceecb77ee2fb2d7566"), "name" : "whybigdata", "url" : "www.whybigdata.com" }
解析说明:
ObjectId 类似唯一主键,可以很快的去生成和排序,包含 12 bytes(默认),由 24 个 16 进制数字组成的字符串(每个字节可以存储两个 16 进制数字),含义是:
-
前 4 个字节表示创建 unix 时间戳
-
接下来的 3 个字节是机器标识码
-
紧接的两个字节由进程 id 组成 PID
-
最后三个字节是随机数
案例 2:创建一个固定集合 mycol
> db.createCollection("mycol",{ capped : true,autoIndexId : true,size : 6142800, max : 1000})
> show tables;
whybigdata
mycol
案例 3:自动创建集合
在 MongoDB 中,你不需要创建集合。当你插入一些文档时,MongoDB 会自动创建集合。
> db.mycol2.insert({"name":"whybigdata"}) WriteResult({ "nInserted" : 1 })
> show collections
whybigdata
mycol
mycol2
案例 4:删除集合
> db.mycol2.drop()
True
> show tables;
whybigdata
mycol
1.1.3 文档(Document)
文档是一组键值(key-value)对组成。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。
一个简单的例子:
{"name":"whybigdata"}
注意:
-
文档中的键/值对是有序的。
-
MongoDB 区分类型和大小写。
-
MongoDB 的文档不能有重复的键。
-
文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8 字符。
2. DataX 导入导出案例
2.1 读取 MongoDB 的数据导入到 HDFS
2.1.1 编写配置文件
[whybigdata@node01 datax]$ vim job/mongdb2hdfs.json
{
"job": {
"content": [
{
"reader": {
"name": "mongodbreader",
"parameter": {
"address": ["node02:27017"],
"collectionName": "whybigdata",
"column": [
{
"name":"name",
"type":"string"
},
{
"name":"url",
"type":"string"
}
],
"dbName": "test",
}
},
"writer": {
"name": "hdfswriter",
"parameter": {
"column": [
{
"name":"name",
"type":"string"
},
{
"name":"url",
"type":"string"
}
],
"defaultFS": "hdfs://node01:8020",
"fieldDelimiter": "\t",
"fileName": "mongo.txt",
"fileType": "text",
"path": "/datax-out",
"writeMode": "append"
}
}
}
],
"setting": {
"speed": {
"channel": "1"
}
}
}
}
mongodbreader 参数解析
-
address: MongoDB 的数据地址信息,因为 MonogDB 可能是个集群,则 ip 端口信息需要以 Json 数组的形式给出。【必填】
-
userName:MongoDB 的用户名。【选填】
-
userPassword: MongoDB 的密码。【选填】
-
collectionName: MonogoDB 的集合名。【必填】
-
column:MongoDB 的文档列名。【必填】
-
name:Column 的名字。【必填】
-
type:Column 的类型。【选填】
-
splitter:因为 MongoDB 支持数组类型,但是 Datax 框架本身不支持数组类型,所以mongoDB 读出来的数组类型要通过这个分隔符合并成字符串。【选填】
2.1.2 执行
[whybigdata@node01 datax]$ bin/datax.py job/mongdb2hdfs.json
2.1.3 查看结果
2.2 读取 MongoDB 的数据导入 MySQL
2.2.1 在 MySQL 中创建表
mysql> create table whybigdata(name varchar(20),url varchar(20));
2.2.2 编写DataX 配置文件
[whybigdata@node01 datax]$ vim job/mongodb2mysql.json
{
"job": {
"content": [
{
"reader": {
"name": "mongodbreader",
"parameter": {
"address": ["node02:27017"],
"collectionName": "whybigdata",
"column": [
{
"name":"name",
"type":"string"
},
{
"name":"url",
"type":"string"
}
],
"dbName": "test",
}
},
"writer": {
"name": "mysqlwriter",
"parameter": {
"column": ["*"],
"connection": [
{
"jdbcUrl": "jdbc:mysql://node01:3306/datax",
"table": ["mongo"]
}
],
"password": "123456",
"username": "root",
"writeMode": "insert"
}
}
}
],
"setting": {
"speed": {
"channel": "1"
}
}
}
}
2.2.3 执行
[whybigdata@node01 datax]$ bin/datax.py job/mongodb2mysql.json
2.2.4 查看结果
mysql> select * from whybigdata;
+ + +
| name | url |
+ + +
| whybigdata | www.whybigdata.com |
+ + +
全文结束!
- 点赞
- 收藏
- 关注作者
评论(0)