• sqoop的使用之import导入到HDFS


    原文链接:

    https://www.toutiao.com/i6772128429614563843/

    首先我们已经安装好sqoop了,如果没有安装好参考文档《快速搭建CDH-Hadoop-Hive-Zoopkeeper-Sqoop环境进入Sqoop学习环境》

    准备一些基本的认识

    1、sqoop分为了sqoop1和sqoop2

    2、sqoop2拆分server和client,类似于hiveserver2和beeline

    3、sqoop早期是一些封装MR程序,以jar文件的形式,最后才演变成了框架

    4、用于在hadoop和结构化数据库之间的高效传输批量数据的工具

    下面我们开始做一些简单是使用,熟悉sqoop的使用方式

    查看帮助信息:bin/sqoop help

    连接mysql

    bin/sqoop list-databases --connect jdbc:mysql://mastercdh:3306/ --username root --password password

    可以将数据库罗列出来,显示mysql数据库说明安装成功

    从关系型数据库中导入到HDFS(rdbms -> hdfs)

    在mysql中创建一个库和表,方便我们练习

    create table importhdfs(

    id int primary key not null,

    name varchar(20) not null

    );

    插入数据

    insert into importhdfs values(1,'x1');

    insert into importhdfs values(2,'x2');

    insert into importhdfs values(3,'x3');

    insert into importhdfs values(4,'x4');

    insert into importhdfs values(5,'x5');

    使用命令导入数据(注意反斜杠,反斜杠后面不能有空格等)

    bin/sqoop import

    --connect jdbc:mysql://mastercdh:3306/sqoop_test

    --username root

    --password password

    --table importhdfs

    我们可以看reduce数量,sqoop不运行reduce

    或者

    那么我们的数据在哪里?

    搜索outputdir,就可以看到目录

    hdfs://mastercdh:8020/user/root/importhdfs

    我们就可以看到数据了

    我们查看下数据

    bin/hdfs dfs -text /user/root/importhdfs/part-m-00001

    我们也可以

    控制map任务的个数 -m,--num-mappers

    输出目录路径如果存在则删除--delete-target-dir

    指定输出目录 --target-dir

    运行下

    bin/sqoop import

    --connect jdbc:mysql://mastercdh:3306/sqoop_test

    --username root

    --password password

    --delete-target-dir

    --target-dir /sqoop_test

    --table importhdfs

    -m 1

    我们查看数据

    bin/hdfs dfs -text /sqoop_test/part-m-00000

    这个数据分隔符是逗号

    1,x1

    2,x2

    3,x3

    4,x4

    5,x5

    我们可以指定数据输出分隔符(mysql默认是 ',')

    分隔符参数fields-terminated-by

    命令

    bin/sqoop import

    --connect jdbc:mysql://mastercdh:3306/sqoop_test

    --username root

    --password password

    --delete-target-dir

    --target-dir /sqoop_test

    --table importhdfs

    -m 1

    --fields-terminated-by " "

    查看下数据

    bin/hdfs dfs -text /sqoop_test/part-m-00000

    其中有个日志信息

    指定快速模式 --direct

    命令

    bin/sqoop import

    --connect jdbc:mysql://mastercdh:3306/sqoop_test

    --username root

    --password password

    --direct

    --delete-target-dir

    --target-dir /sqoop_test

    --table importhdfs

    -m 1

    --fields-terminated-by " "

    bin/hdfs dfs -text /sqoop_test/part-m-00000

    增量导入,从原有的数据上进行追加数据。比如mysql中表数据变化了,那么我重新执行sqoop,会把HDFS上的数据删除,这不符合我们的要求,我们只希望在原来的基础上添加数据。

    首先了解三个参数

    --check-column (col):指定要导入时检查的列,行的检测列,一般都是拿主键作为检测列。注意:char、varchar类型不可以使用

    --incremental (mode):有两种模式:append 和 lastmodifuied

    append :追加 lastmodifuied:时间戳

    --last-value (value):指定上次导入检测列最后字段的最大值,也就是最后一个值

    在append模式下

    增加几条数据

    insert into importhdfs values(5,'x5');

    insert into importhdfs values(6,'x6');

    insert into importhdfs values(7,'x7');

    insert into importhdfs values(8,'x8');

    insert into importhdfs values(9,'x9');

    注意:append和--delete-target-dir不能同时使用

    bin/sqoop import

    --connect jdbc:mysql://mastercdh:3306/sqoop_test

    --username root

    --password password

    --direct

    --target-dir /sqoop_test

    --table importhdfs

    -m 1

    --fields-terminated-by " "

    --check-column id

    --incremental append

    --last-value 5

    会有很多信息

    查看

    查看

    bin/hdfs dfs -text /sqoop_test/part-m-00000

    bin/hdfs dfs -text /sqoop_test/part-m-00001

    在lastmodifuied模式下

    如果check-column是时间列time的话

    --check-column time time列下面的数据,指定的就是你添加数据时最后的时间戳

    --last-value"2019-12-19 19:04:07" 最后一行的时间戳

    创建表

    create table inc_tab(

    id int,

    name varchar(20),

    last_mod timestamp default current_timestamp on update current_timestamp

    );

    添加数据

    insert into inc_tab(id,name) values(1,'inc1');

    insert into inc_tab(id,name) values(2,'inc2');

    insert into inc_tab(id,name) values(3,'inc3');

    insert into inc_tab(id,name) values(4,'inc4');

    insert into inc_tab(id,name) values(5,'inc5');

    执行sqoop命令

    bin/sqoop import

    --connect jdbc:mysql://mastercdh:3306/sqoop_test

    --username root

    --password password

    --table inc_tab

    --target-dir /sqoop_test_inc

    --fields-terminated-by ' '

    --num-mappers 1

    查看数据

    bin/hdfs dfs -text /sqoop_test_inc/part-m-00000

    再添加几条数据

    insert into inc_tab(id,name) values(6,'inc6');

    insert into inc_tab(id,name) values(7,'inc7');

    insert into inc_tab(id,name) values(8,'inc8');

    使用lastmodifuied模式进行增量导入指定增量数据是以--append(附加)还是 --merge-key(合并)模式进行添加

    bin/sqoop import

    --connect jdbc:mysql://mastercdh:3306/sqoop_test

    --username root

    --password password

    --table inc_tab

    --target-dir /sqoop_test_inc

    --check-column last_mod

    --fields-terminated-by ' '

    --incremental lastmodified

    --last-value "2019-12-20 03:13:51"

    --num-mappers 1

    --merge-key id

    bin/hdfs dfs -text /sqoop_test_inc/part-r-00000

    这个地方是有reduce的

    这些命令我们可以使用job执行:sqoop job

    bin/sqoop job --create job01 创建

    bin/sqoop job --delete 删除任务

    bin/sqoop job --exec 执行job

    bin/sqoop job --show 显示job的详细信息

    bin/sqoop job --list 显示可执行的job

    示例语句:

    sqoop job --create myjob -- import --connect jdbc:mysql://example.com/db

    --table mytable

    我们做个练习

    先导入数据

    insert into importhdfs values(11,'x11');

    insert into importhdfs values(12,'x12');

    insert into importhdfs values(13,'x13');

    insert into importhdfs values(14,'x14');

    insert into importhdfs values(15,'x15');

    执行命令

    bin/sqoop job

    --create job_importhdfs

    --

    import

    --connect jdbc:mysql://mastercdh:3306/sqoop_test

    --username root

    --password password

    --direct

    --target-dir /sqoop_test

    --table importhdfs

    -m 1

    --fields-terminated-by " "

    --check-column id

    --incremental append

    --last-value 10

    我们查看是否成功

    我们执行一下

    bin/sqoop job --exec job_importhdfs

    执行job的时候会确认密码,指定成mysql的登录密码

    我们查看数据

    可以选择行列

    导出某几列数据或者几行数据

    bin/sqoop import

    --connect jdbc:mysql://mastercdh:3306/sqoop_test

    --username root

    --password password

    --direct

    --delete-target-dir

    --target-dir /where_test_importhdfs

    --table importhdfs

    -m 1

    --fields-terminated-by " "

    --where 'id<6'

    查看数据

    bin/hdfs dfs -text /where_test_importhdfs/part-m-00000

    导出某几列

    --query使用要点:

    不能使用--table

    如果--query的sql语句带着where字句,

    必须要加上标识符$CONDITIONS

    查看数据

    bin/hdfs dfs -text /where_test_importhdfs_sql/part-m-00000

    mysql导入数据到hive中该如何做呢?

    先登录hive

    在hive中操作,创建数据库:

    create database frommysql;

    创建表

    创建表

    create table importhive_info(

    num int,

    name string

    )row format delimited fields terminated by " ";

    数据也有了

    执行语句

    bin/sqoop import

    --connect jdbc:mysql://mastercdh:3306/sqoop_test

    --username root

    --password password

    --direct

    --table importhdfs

    --delete-target-dir

    --hive-import

    --hive-database frommysql

    --hive-table importhive_info

    --fields-terminated-by " "

    -m 1

    执行报错

    但是我们数据库明明有

    查看mysql元数据信息发现新建的库表都没有

    难道没有使用mysql的元数据库?初始化出问题了吗?于是重新初始化

    bin/schematool -dbType mysql –initSchema

    出现derby信息,还是旧信息

    我的配置没有起作用?

    为什么会有元数据库呢?说明之前是对的,仔细核对了一遍,发现是配置文件被我改动的问题。

    这个地方写错路径了(截图已改对)

    重新启动

    Mysql中元数据库有了

    重新创建上面的库表

    元数据有信息了

    在执行之前的sqoop语句

    查看下hive中的数据已经有了

    这个地方注意:运行mr任务时,结果将会保存在默认的输出目录上。还在/user/hive/warehouse。

    从hdfs导入到mysql(export)

    常规模式导入数据到mysql

    我们创建一个表

    create table tomysql(

    id int primary key not null,

    name varchar(20) not null

    );

    导出语句

    bin/sqoop export

    --connect jdbc:mysql://mastercdh:3306/sqoop_test

    --username root

    --password password

    --table tomysql

    --export-dir /user/hive/warehouse/frommysql.db/importhive_info

    -m 1

    --input-fields-terminated-by ' '

    查看下数据

    sqoop运行一个file文件

    在mysql重新建表file_to_mysql

    创建文本

    export

    --connect

    jdbc:mysql://mastercdh:3306/sqoop_test

    --username

    root

    --password

    password

    --table

    file_to_mysql

    --export-dir

    /user/hive/warehouse/frommysql.db/importhive_info

    -m

    1

    --input-fields-terminated-by

    ' '

    执行命令

    bin/sqoop --options-file /data/test/filetomysql

    查看数据已经有了

  • 相关阅读:
    互联网测试开发面试题集锦【转】
    python excel读写数据
    基于python实现Oracle数据库连接查询操作
    基于python实现GET和POST请求及token相关调用
    Notepad++配置替换快捷配置
    GET和POST两种基本请求方法的区别
    HTTP请求的常用方法有哪些
    常见HTTP状态码的含义
    在浏览器中输入URL后,执行的全部过程。(一次完整的http请求过程)
    TCP和UDP的优缺点及区别
  • 原文地址:https://www.cnblogs.com/bqwzy/p/12535759.html
Copyright © 2020-2023  润新知