Datax 面试篇 《一》_hadoop

一、datax概述

1.1、什么使datax

DataX 是阿里巴巴开源的一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。

1.2、datax的设计

为了解决异构数据源同步问题,DataX将复杂的网状的同步链路变成了星型数据链路,DataX作为中间传输载体负责连接各种数据源。当需要接入一个新的数据源的时候,只需要将此数据源对接到DataX,便能跟已有的数据源做到无缝数据同步。

Datax 面试篇 《一》_hdfs_02

1.3、框架设计

Datax 面试篇 《一》_mysql_03

1.4、运行原理

Datax 面试篇 《一》_mysql_04

二、快速入门

2.1、官方地址

下载地址:http://datax-opensource.oss-cn-hangzhou.aliyuncs.com/datax.tar.gz

源码地址:https://github.com/alibaba/DataX

2.2、前置要求

- Linux

- JDK(1.8以上,推荐1.8)

- Python(推荐Python2.6.X)

2.3、安装

1)将下载好的datax.tar.gz上传到hadoop102的/opt/softwarez

[atguigu@hadoop102 software]$ ls
datax.tar.gz

2)解压datax.tar.gz到/opt/module

[atguigu@hadoop102 software]$ tar -zxvf datax.tar.gz -C /opt/module/

3)运行自检脚本

[atguigu@hadoop102 bin]$ cd /opt/module/datax/bin/
[atguigu@hadoop102 bin]$ python datax.py /opt/module/datax/job/job.json

Datax 面试篇 《一》_mysql_05

三、使用案例

3.1 从stream流读取数据并打印到控制台

1)查看配置模板

[atguigu@hadoop102 bin]$ python datax.py -r streamreader -w streamwriter

DataX (DATAX-OPENSOURCE-3.0), From Alibaba !
Copyright (C) 2010-2017, Alibaba Group. All Rights Reserved.
Please refer to the streamreader document:
     https://github.com/alibaba/DataX/blob/master/streamreader/doc/streamreader.md 

Please refer to the streamwriter document:
     https://github.com/alibaba/DataX/blob/master/streamwriter/doc/streamwriter.md 
 
Please save the following configuration as a json file and  use
     python {DATAX_HOME}/bin/datax.py {JSON_FILE_NAME}.json 
to run the job.

{
    "job": {
        "content": [
            {
                "reader": {
                    "name": "streamreader", 
                    "parameter": {
                        "column": [], 
                        "sliceRecordCount": ""
                    }
                }, 
                "writer": {
                    "name": "streamwriter", 
                    "parameter": {
                        "encoding": "", 
                        "print": true
                    }
                }
            }
        ], 
        "setting": {
            "speed": {
                "channel": ""
            }
        }
    }
}

2)根据模板编写配置文件

[atguigu@hadoop102 job]$ vim stream2stream.json

填写以下内容:

{
  "job": {
    "content": [
      {
        "reader": {
          "name": "streamreader",
          "parameter": {
            "sliceRecordCount": 10,
            "column": [
              {
                "type": "long",
                "value": "10"
              },
              {
                "type": "string",
                "value": "hello,DataX"
              }
            ]
          }
        },
        "writer": {
          "name": "streamwriter",
          "parameter": {
            "encoding": "UTF-8",
            "print": true
          }
        }
      }
    ],
    "setting": {
      "speed": {
        "channel": 1
       }
    }
   }
}

3)运行

[atguigu@hadoop102 job]$ 
/opt/module/datax/bin/datax.py /opt/module/datax/job/stream2stream.json

3.2 读取MySQL中的数据存放到HDFS

3.2.1 查看官方模板

[atguigu@hadoop102 ~]$ python /opt/module/datax/bin/datax.py -r mysqlreader -w hdfswriter

{
    "job": {
        "content": [
            {
                "reader": {
                    "name": "mysqlreader", 
                    "parameter": {
                        "column": [], 
                        "connection": [
                            {
                                "jdbcUrl": [], 
                                "table": []
                            }
                        ], 
                        "password": "", 
                        "username": "", 
                        "where": ""
                    }
                }, 
                "writer": {
                    "name": "hdfswriter", 
                    "parameter": {
                        "column": [], 
                        "compress": "", 
                        "defaultFS": "", 
                        "fieldDelimiter": "", 
                        "fileName": "", 
                        "fileType": "", 
                        "path": "", 
                        "writeMode": ""
                    }
                }
            }
        ], 
        "setting": {
            "speed": {
                "channel": ""
            }
        }
    }
}

mysqlreader参数解析:

Datax 面试篇 《一》_hdfs_06

hdfswriter参数解析:

Datax 面试篇 《一》_hdfs_07

3.2.2 准备数据

1)创建student表

mysql> create database datax;
mysql> use datax;
mysql> create table student(id int,name varchar(20));

2)插入数据

mysql> insert into student values(1001,'zhangsan'),(1002,'lisi'),(1003,'wangwu');

3.2.3 编写配置文件

[atguigu@hadoop102 datax]$ vim /opt/module/datax/job/mysql2hdfs.json

{
    "job": {
        "content": [
            {
                "reader": {
                    "name": "mysqlreader", 
                    "parameter": {
                        "column": [
                            "id",
                            "name"
                        ], 
                        "connection": [
                            {
                                "jdbcUrl": [
                                    "jdbc:mysql://hadoop102:3306/datax"
                                ], 
                                "table": [
                                    "student"
                                ]
                            }
                        ], 
                        "username": "root", 
                        "password": "000000"
                    }
                }, 
                "writer": {
                    "name": "hdfswriter", 
                    "parameter": {
                        "column": [
                            {
                                "name": "id",
                                "type": "int"
                            },
                            {
                                "name": "name",
                                "type": "string"
                            }
                        ],  
                        "defaultFS": "hdfs://hadoop102:9000", 
                        "fieldDelimiter": "\t", 
                        "fileName": "student.txt", 
                        "fileType": "text", 
                        "path": "/", 
                        "writeMode": "append"
                    }
                }
            }
        ], 
        "setting": {
            "speed": {
                "channel": "1"
            }
        }
    }
}

3.2.4 执行任务

[atguigu@hadoop102 datax]$ bin/datax.py job/mysql2hdfs.json

2019-05-17 16:02:16.581 [job-0] INFO  JobContainer - 
任务启动时刻                    : 2019-05-17 16:02:04
任务结束时刻                    : 2019-05-17 16:02:16
任务总计耗时                    :                 12s
任务平均流量                    :                3B/s
记录写入速度                    :              0rec/s
读出记录总数                    :                   3
读写失败总数                    :                   0

3.2.5 查看hdfs

Datax 面试篇 《一》_hadoop_08

注意:HdfsWriter实际执行时会在该文件名后添加随机的后缀作为每个线程写入实际文件名。

3.3 读取HDFS数据写入MySQL

1)将上个案例上传的文件改名

[atguigu@hadoop102 datax]$ hadoop fs -mv /student.txt* /student.txt

2)查看官方模板

[atguigu@hadoop102 datax]$ python bin/datax.py -r hdfsreader -w mysqlwriter

{
    "job": {
        "content": [
            {
                "reader": {
                    "name": "hdfsreader", 
                    "parameter": {
                        "column": [], 
                        "defaultFS": "", 
                        "encoding": "UTF-8", 
                        "fieldDelimiter": ",", 
                        "fileType": "orc", 
                        "path": ""
                    }
                }, 
                "writer": {
                    "name": "mysqlwriter", 
                    "parameter": {
                        "column": [], 
                        "connection": [
                            {
                                "jdbcUrl": "", 
                                "table": []
                            }
                        ], 
                        "password": "", 
                        "preSql": [], 
                        "session": [], 
                        "username": "", 
                        "writeMode": ""
                    }
                }
            }
        ], 
        "setting": {
            "speed": {
                "channel": ""
            }
        }
    }
}

3)创建配置文件

[atguigu@hadoop102 datax]$ vim job/hdfs2mysql.json

{
    "job": {
        "content": [
            {
                "reader": {
                    "name": "hdfsreader", 
                    "parameter": {
                        "column": ["*"], 
                        "defaultFS": "hdfs://hadoop102:9000", 
                        "encoding": "UTF-8", 
                        "fieldDelimiter": "\t", 
                        "fileType": "text", 
                        "path": "/student.txt"
                    }
                }, 
                "writer": {
                    "name": "mysqlwriter", 
                    "parameter": {
                        "column": [
                            "id",
                            "name"
                        ], 
                        "connection": [
                            {
                                "jdbcUrl": "jdbc:mysql://hadoop102:3306/datax", 
                                "table": ["student2"]
                            }
                        ], 
                        "password": "000000", 
                        "username": "root", 
                        "writeMode": "insert"
                    }
                }
            }
        ], 
        "setting": {
            "speed": {
                "channel": "1"
            }
        }
    }
}

4)在MySQL的datax数据库中创建student2

mysql> use datax;
mysql> create table student2(id int,name varchar(20));

5)执行任务

[atguigu@hadoop102 datax]$ bin/datax.py job/hdfs2mysql.json

2019-05-17 16:21:53.616 [job-0] INFO  JobContainer - 
任务启动时刻                    : 2019-05-17 16:21:41
任务结束时刻                    : 2019-05-17 16:21:53
任务总计耗时                    :                 11s
任务平均流量                    :                3B/s
记录写入速度                    :              0rec/s
读出记录总数                    :                   3
读写失败总数                    :                   0

6)查看student2表

mysql> select * from student2;
+------+----------+
| id   | name     |
+------+----------+
| 1001 | zhangsan |
| 1002 | lisi     |
| 1003 | wangwu   |
+------+----------+
3 rows in set (0.00 sec)

四、oracle数据库

以下操作使用root账号

4.1 oracle数据库简介

Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的、适应高吞吐量的数据库解决方案。

4.2 安装前的准备

4.2.1 检查依赖

[root@hadoop102 ~]# rpm -q binutils compat-libstdc++-33 elfutils-libelf elfutils-libelf-devel gcc gcc-c++ glibc glibc-common glibc-devel glibc-headers kernel-headers ksh libaio  libaio-devel libgcc libgomp libstdc++ libstdc++-devel make numactl-devel sysstat unixODBC unixODBC-devel

4.2.2 安装依赖

哪个没有安装哪个,如:

[root@hadoop102 ~]# yum -y install elfutils-libelf-devel gcc gcc-c++ libaio-devel libstdc++-devel numactl-devel unixODBC unixODBC-devel

4.2.3 上传安装包并解压

[root@hadoop102 software]# ls
Oracle_Database_12c_Release2_linuxx64.zip
[root@hadoop102 software]# unzip Oracle_Database_12c_Release2_linuxx64.zip -d /opt/module/

4.2.4 配置用户组

Oracle安装文件不允许通过root用户启动,需要为oracle配置一个专门的用户。

1)创建sql 用户组

[root@hadoop102 software]#groupadd sql

2)创建oracle 用户并放入sql组中

[root@hadoop102 software]#useradd oracle -g sql

3)修改oracle用户登录密码,输入密码后即可使用oracle用户登录系统

[root@hadoop102 software]#passwd oracle

4)修改所属用户和组

[root@hadoop102 module]# chown -R oracle:sql /opt/module/database/

4.2.5 修改配置文件sysctl.conf

[root@hadoop102 module]# vim /etc/sysctl.conf
删除里面的内容,添加如下内容
net.ipv4.ip_local_port_range = 9000 65500 
fs.file-max = 6815744 
kernel.shmall = 10523004 
kernel.shmmax = 6465333657 
kernel.shmmni = 4096 
kernel.sem = 250 32000 100 128 
net.core.rmem_default=262144 
net.core.wmem_default=262144 
net.core.rmem_max=4194304 
net.core.wmem_max=1048576 
fs.aio-max-nr = 1048576

参数解析:

net.ipv4.ip_local_port_range :可使用的IPv4端口范围

fs.file-max :该参数表示文件句柄的最大数量。文件句柄设置表示在linux系统中可以打开的文件数量。

kernel.shmall :该参数表示系统一次可以使用的共享内存总量(以页为单位)

kernel.shmmax :该参数定义了共享内存段的最大尺寸(以字节为单位)

kernel.shmmni :这个内核参数用于设置系统范围内共享内存段的最大数量

kernel.sem : 该参数表示设置的信号量。

net.core.rmem_default:默认的TCP数据接收窗口大小(字节)。

net.core.wmem_default:默认的TCP数据发送窗口大小(字节)。

net.core.rmem_max:最大的TCP数据接收窗口(字节)。

net.core.wmem_max:最大的TCP数据发送窗口(字节)。

fs.aio-max-nr :同时可以拥有的的异步IO请求数目。

4.2.6 修改配置文件limits.conf

[root@hadoop102 module]# vim /etc/security/limits.conf
在文件末尾添加:
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536

重启机器生效。


4.3 安装Oracle数据库

4.3.1 进入虚拟机图像化页面操作

[oracle@hadoop102 ~]# cd /opt/module/database
 [oracle@hadoop102 database]# ./runInstaller

4.3.2 安装数据库

1)去掉红框位置对勾

Datax 面试篇 《一》_hdfs_09

2)选择仅安装数据库软件

Datax 面试篇 《一》_hdfs_10

3)选择单实例数据库安装

Datax 面试篇 《一》_hadoop_11

4)默认下一步

Datax 面试篇 《一》_hdfs_12

5)设置安装位置

Datax 面试篇 《一》_hadoop_13

6)创建产品清单

Datax 面试篇 《一》_hadoop_14

7)操作系统组设置

Datax 面试篇 《一》_hdfs_15

8)等待安装

Datax 面试篇 《一》_hdfs_16

9)查看验证,按提示修改,如果不能修改再点击忽略

Datax 面试篇 《一》_hadoop_17

Datax 面试篇 《一》_mysql_18

10)概要,直接点击安装

Datax 面试篇 《一》_hdfs_19

11)按提示操作

Datax 面试篇 《一》_hadoop_20

12)安装完成

Datax 面试篇 《一》_hdfs_21

4.4 设置环境变量

[oracle@hadoop102 dbhome_1]# vim /home/oracle/.bash_profile
添加:
#ORACLE_HOME
export ORACLE_HOME=/home/oracle/app/oracle/product/12.2.0/dbhome_1
export PATH=$PATH:$ORACLE_HOME/bin
export ORACLE_SID=orcl
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

[oracle@hadoop102 ~]$ source /home/oracle/.bash_profile

4.5 设置Oracle监听

4.5.1 命令行输入以下命令

[oracle@hadoop102 ~]$ netca

Datax 面试篇 《一》_hadoop_22

4.5.2 选择添加

Datax 面试篇 《一》_mysql_23

4.5.3 设置监听名,默认即可

Datax 面试篇 《一》_mysql_24

4.5.4 选择协议,默认即可

Datax 面试篇 《一》_hdfs_25

4.5.5 设置端口号,默认即可

Datax 面试篇 《一》_hadoop_26

4.5.6 配置更多监听,默认

Datax 面试篇 《一》_hdfs_27

4.5.7 完成

Datax 面试篇 《一》_hdfs_28

4.6 创建数据库

4.6.1 进入创建页面

[oracle@hadoop102 ~]$ dbca

4.6.2 选择创建数据库

Datax 面试篇 《一》_hdfs_29

4.6.3 选择高级配置

Datax 面试篇 《一》_hadoop_30

4.6.4 选择数据仓库

Datax 面试篇 《一》_hdfs_31

4.6.5 将图中所示对勾去掉

Datax 面试篇 《一》_mysql_32

4.6.6 存储选项

Datax 面试篇 《一》_hadoop_33

4.6.7 快速恢复选项

Datax 面试篇 《一》_hadoop_34

4.6.8 选择监听程序

Datax 面试篇 《一》_hdfs_35

4.6.9 如图设置

Datax 面试篇 《一》_mysql_36

4.6.10 使用自动内存管理

Datax 面试篇 《一》_hadoop_37

4.6.11 管理选项,默认

Datax 面试篇 《一》_hadoop_38

4.6.12 设置统一密码

Datax 面试篇 《一》_hadoop_39

4.6.13 创建选项,选择创建数据库

Datax 面试篇 《一》_hdfs_40

4.6.14 概要,点击完成

Datax 面试篇 《一》_mysql_41

4.6.15 等待安装

Datax 面试篇 《一》_mysql_42

4.7 简单使用

4.7.1 开启,关闭监听服务

开启服务:

[oracle@hadoop102 ~]$ lsnrctl start关闭服务:

关闭服务:

[oracle@hadoop102 ~]$ lsnrctl stop

4.7.2 进入命令行

[oracle@hadoop102 ~]$ sqlplus 

SQL*Plus: Release 12.2.0.1.0 Production on Wed May 29 17:08:05 2019

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

Enter user-name: system
Enter password: (这里输入之前配置的统一密码)
Last Successful login time: Wed May 29 2019 13:03:39 +08:00

Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL>

4.7.3 创建用户并授权

SQL> create user atguigu identified by 000000;
User created.
SQL> grant create session,create table,create view,create sequence,unlimited tablespace to atguigu;
Grant succeeded.

4.7.4 进入atguigu账号,创建表

SQL>create TABLE student(id INTEGER,name VARCHAR2(20));
SQL>insert into student values (1,'zhangsan');
SQL>commit;
SQL> select * from student; 
        ID 	NAME
---------- ----------------------------------------
         1 	zhangsan

注意:安装完成后重启机器可能出现ORACLE not available错误,解决方法如下:
[oracle@hadoop102 ~]$ sqlplus / as sysdba
SQL>startup
SQL>conn atguigu
Enter password:

4.8 Oracle与MySQL的SQL区别

类型

Oracle

MySQL

整型

number(N)/integer

int/integer

浮点型

float

float/double

字符串类型

varchar2(N)

varchar(N)

NULL

''

null和''不一样

分页

rownum

limit

""

限制很多,一般不让用

与单引号一样

价格

闭源,收费

开源,免费

主键自动增长

×

if not exists

×

auto_increment

×

create database

×

select * from table as t

×

4.9 DataX案例

4.9.1 从Oracle中读取数据存到MySQL

1)MySQL中创建表

[oracle@hadoop102 ~]$ mysql -uroot -p000000
mysql> create database oracle;
mysql> use oracle;
mysql> create table student(id int,name varchar(20));

2)编写datax配置文件

[oracle@hadoop102 ~]$ vim /opt/module/datax/job/oracle2mysql.json

{
    "job": {
        "content": [
            {
                "reader": {
                    "name": "oraclereader",
                    "parameter": {
                        "column": ["*"],
                        "connection": [
                            {
                                "jdbcUrl": ["jdbc:oracle:thin:@hadoop102:1521:orcl"],
                                "table": ["student"]
                            }
                        ],
                        "password": "000000",
                        "username": "atguigu"
                    }
                },
                "writer": {
                    "name": "mysqlwriter",
                    "parameter": {
                        "column": ["*"],
                        "connection": [
                            {
                                "jdbcUrl": "jdbc:mysql://hadoop102:3306/oracle",
                                "table": ["student"]
                            }
                        ],
                        "password": "000000",
                        "username": "root",
                        "writeMode": "insert"
                    }
                }
            }
        ],
        "setting": {
            "speed": {
                "channel": "1"
            }
        }
    }
}

3)执行命令

[oracle@hadoop102 ~]$ 
/opt/module/datax/bin/datax.py /opt/module/datax/job/oracle2mysql.json

查看结果:
mysql> select * from student;
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
+------+----------+

4.9.2 读取Oracle的数据存入HDFS中

1)编写配置文件

[oracle@hadoop102 datax]$ vim job/oracle2hdfs.json
{
    "job": {
        "content": [
            {
                "reader": {
                    "name": "oraclereader", 
                    "parameter": {
                        "column": ["*"], 
                        "connection": [
                            {
                                "jdbcUrl": ["jdbc:oracle:thin:@hadoop102:1521:orcl"], 
                                "table": ["student"]
                            }
                        ], 
                        "password": "000000", 
                        "username": "atguigu"
                    }
                }, 
                "writer": {
                    "name": "hdfswriter", 
                    "parameter": {
                        "column": [
                            {
                                "name": "id",
                                "type": "int"
                            },
                            {
                                "name": "name",
                                "type": "string"
                            }

                        ], 
                        "defaultFS": "hdfs://hadoop102:9000", 
                        "fieldDelimiter": "\t", 
                        "fileName": "oracle.txt", 
                        "fileType": "text", 
                        "path": "/", 
                        "writeMode": "append"
                    }
                }
            }
        ], 
        "setting": {
            "speed": {
                "channel": "1"
            }
        }
    }
}

2)执行

[oracle@hadoop102 datax]$ bin/datax.py job/oracle2hdfs.json

3)查看HDFS结果

Datax 面试篇 《一》_hadoop_43

五、MongoDB

5.1 什么是MongoDB

MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

Datax 面试篇 《一》_hdfs_44

5.2 MongoDB优缺点

Datax 面试篇 《一》_mysql_45

5.3 基础概念解析

SQL术语/概念

MongoDB术语/概念

解释/说明

database

database

数据库

table

collection

数据库表/集合

row

document

数据记录行/文档

column

field

数据字段/域

index

index

索引

table joins

 不支持

表连接,MongoDB不支持

primary key

primary key

主键,MongoDB自动将_id字段设置为主键

通过下图实例,我们也可以更直观的了解Mongo中的一些概念:

Datax 面试篇 《一》_hdfs_46

5.4 安装

5.4.1 下载地址

https://www.mongodb.com/download-center#community

5.4.2 安装

1)上传压缩包到虚拟机中

[atguigu@hadoop102 software]$ ls
mongodb-linux-x86_64-4.0.10.tgz

2)解压

[atguigu@hadoop102 software]$ tar -zxvf mongodb-linux-x86_64-4.0.10.tgz -C /opt/module/

3)重命名

[atguigu@hadoop102 module]$ mv mongodb-linux-x86_64-4.0.10/ mongodb

4)创建数据库目录

MongoDB的数据存储在data目录的db目录下,但是这个目录在安装过程不会自动创建,所以需要手动创建data目录,并在data目录中创建db目录。

[atguigu@hadoop102 module]$ sudo mkdir -p /data/db
[atguigu@hadoop102 mongodb]$ sudo chmod 777 -R /data/db/

5)启动MongoDB服务

[atguigu@hadoop102 mongodb]$ bin/mongod

6)进入shell页面

[atguigu@hadoop102 ~]$ cd /opt/module/mongodb/
[atguigu@hadoop102 mongodb]$ bin/mongo

MongoDB shell version v4.0.10
connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("66e2b331-e3c3-4b81-b676-1ee4bac87abf") }
MongoDB server version: 4.0.10
Welcome to the MongoDB shell.
…………..
>

5.5 基础概念详解

5.5.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

5.5.2 文档(Document)

文档是一组键值(key-value)对组成。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。

一个简单的例子:

{"name":"atguigu"}

注意:

1.文档中的键/值对是有序的。

2.MongoDB区分类型和大小写。

3.MongoDB的文档不能有重复的键。

4.文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。

5.5.3 集合

集合就是 MongoDB 文档组,类似于MySQL中的table。

集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。

下面我们来看看如何创建集合:

MongoDB 中使用 createCollection() 方法来创建集合。

语法格式:

db.createCollection(name, options)

参数说明:


name: 要创建的集合名称

options: 可选参数, 指定有关内存大小及索引的选项

options 可以是如下参数:

字段

类型

描述

capped

布尔

(可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。
当该值为 true 时,必须指定 size 参数。

autoIndexId

布尔

(可选)如为 true,自动在 _id 字段创建索引。默认为 false。

size

数值

(可选)为固定集合指定一个最大值(以字节计)。
如果 capped 为 true,也需要指定该字段。

max

数值

(可选)指定固定集合中包含文档的最大数量。

案例1:在test库中创建一个atguigu的集合

> use test
switched to db test
> db.createCollection("atguigu")
{ "ok" : 1 }
> show collections
Atguigu

//插入数据
> db.atguigu.insert({"name":"atguigu","url":"www.atguigu.com"})
WriteResult({ "nInserted" : 1 })
//查看数据
> db.atguigu.find()
{ "_id" : ObjectId("5d0314ceecb77ee2fb2d7566"), "name" : "atguigu", "url" : "www.atguigu.com" }

说明:

ObjectId 类似唯一主键,可以很快的去生成和排序,包含 12 bytes,含义是:

前 4 个字节表示创建 unix 时间戳

接下来的 3 个字节是机器标识码

紧接的两个字节由进程 id 组成 PID

最后三个字节是随机数

案例2:创建一个固定集合mycol

> db.createCollection("mycol",{ capped : true,autoIndexId : true,size : 6142800, max : 1000})
> show tables;
atguigu
mycol

案例3:自动创建集合

在 MongoDB 中,你不需要创建集合。当你插入一些文档时,MongoDB 会自动创建集合。

> db.mycol2.insert({"name":"atguigu"})
WriteResult({ "nInserted" : 1 })
> show collections
atguigu
mycol
mycol2

案例4:删除集合

> db.mycol2.drop()
True
> show tables;
atguigu
mycol

5.6 DataX导入导出案例

5.6.1 读取MongoDB的数据导入到HDFS

1)编写配置文件

[atguigu@hadoop102 datax]$ vim job/mongdb2hdfs.json
{
    "job": {
        "content": [
            {
                "reader": {
                    "name": "mongodbreader", 
                    "parameter": {
                        "address": ["127.0.0.1:27017"], 
                        "collectionName": "atguigu", 
                        "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://hadoop102:9000", 
                        "fieldDelimiter": "\t", 
                        "fileName": "mongo.txt", 
                        "fileType": "text", 
                        "path": "/", 
                        "writeMode": "append"
                    }
                }
            }
        ], 
        "setting": {
            "speed": {
                "channel": "1"
            }
        }
    }
}

2)mongodbreader参数解析

address: MongoDB的数据地址信息,因为MonogDB可能是个集群,则ip端口信息需要以Json数组的形式给出。【必填】

userName:MongoDB的用户名。【选填】

userPassword: MongoDB的密码。【选填】

collectionName: MonogoDB的集合名。【必填】

column:MongoDB的文档列名。【必填】

name:Column的名字。【必填】

type:Column的类型。【选填】

splitter:因为MongoDB支持数组类型,但是Datax框架本身不支持数组类型,所以mongoDB读出来的数组类型要通过这个分隔符合并成字符串。【选填】

3)执行

[atguigu@hadoop102 datax]$ bin/datax.py job/mongdb2hdfs.json

4)查看结果

Datax 面试篇 《一》_mysql_47

5.6.2 读取MongoDB的数据导入MySQL

1)在MySQL中创建表

mysql> create table atguigu(name varchar(20),url varchar(20));

2)编写DataX配置文件

[atguigu@hadoop102 datax]$ vim job/mongodb2mysql.json
{
    "job": {
        "content": [
            {
                "reader": {
                    "name": "mongodbreader", 
                    "parameter": {
                        "address": ["127.0.0.1:27017"], 
                        "collectionName": "atguigu", 
                        "column": [
                        	{
                        		"name":"name",
                        		"type":"string"
                        	},
                        	{
                        		"name":"url",
                        		"type":"string"
                        	}
                        ], 
                        "dbName": "test", 
                    }
                }, 
                "writer": {
                    "name": "mysqlwriter", 
                    "parameter": {
                        "column": ["*"], 
                        "connection": [
                            {
                                "jdbcUrl": "jdbc:mysql://hadoop102:3306/test", 
                                "table": ["atguigu"]
                            }
                        ], 
                        "password": "000000", 
                        "username": "root", 
                        "writeMode": "insert"
                    }
                }
            }
        ], 
        "setting": {
            "speed": {
                "channel": "1"
            }
        }
    }
}

3)执行

[atguigu@hadoop102 datax]$ bin/datax.py job/mongodb2mysql.json

4)查看结果

mysql> select * from atguigu;
+---------+-----------------+
| name    | url             |
+---------+-----------------+
| atguigu | www.atguigu.com |
+---------+-----------------+
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6