Hadoop生态圈---azkaban--sqoop
一、azkaban sqoop基本介绍
azkaban的介绍
azkaban web server : 提供一个web的UI管理界面: 创建项目, 执行任务, 监控任务流程,,
azkaban executor server: 执行器, 用来执行web ui提交的工作流的任务
mysql数据库: 存储元数据信息
产生背景:存在依赖关系,周期性执行
oozie和azkaban之间区别:
1)azkaban采用kv键值对,oozie采用xml配置
2)azkaban提供了非常友好的管理界面
3)azkaban功能非常强大,只要能使用shell命令执行的任务,都可以交给azkaban
4)azkanban开源性
Apache Sqoop是在Hadoop生态体系和RDBMS体系之间传送数据的一种工具。
站在Apache立场看待数据流转问题,可以分为数据的导入导出:
Import:数据导入。RDBMS----->Hadoop
Export:数据导出。Hadoop---->RDBMS
二、sqoop的全量导入
导入工具 导入单个表从RDBMS到HDFS
导入的语法 :bin/sqoop import (generic-args) (import-args)
2.1 全量导入mysql表数据到HDFS
bin/sqoop import \
--connect jdbc:mysql://node-1:3306/userdb \
--username root \
--password 123456 \
--delete-target-dir \
--target-dir /sqoopresult \
--table emp --m 1
属性说明:
import : 执行导入
--connect : 连接数据库地址
--username : 用户名
--password : 密码
--delete-target-dir : 如果--target-dir指定目录存在, 则先进行删除
--target-dir : 指定导出路径(hdfs)
--table : 指定要导出的数据库的表名
--m : 指定要执行几个map, 如果指定为 多个, 需要配合 --split-by 使用
--split-by : 用于指定根据那个字段进行划分
--fields-terminated-by : 指定导出后字段与字段之间的分隔号, 默认为 逗号
2.2 全量导入mysql表数据到hive
将mysql的数据导入到hive,主要分为两种方式
1)先复制表结构,然后导出其数据
2)直接将表结构和数据一起导出
2.2.1 先复制表结构后导入
1) 将关系型数据的表结构复制到hive中
bin/sqoop create-hive-table \
--connect jdbc:mysql://hadoop01:3306/userdb \
--table emp_add \
--username root \
--password 123456 \
--hive-table test.emp_add_sp
属性说明 :
create-hive-table : 指定操作 : 创建hive的表
--hive-table : 导入到hive的那个表中(注意: 建议 库名.表名, 否则会将表放置到默认的数据库中)
注意: 在导入的时候, 需要先将hive的对应的数据库先创建好, 否则也是不允许导入的
2)数据的导入工作
bin/sqoop import \
--connect jdbc:mysql://hadoop:3306/userdb \ 数据库中的数据库名
--username root \
--password hadoop \
--table emp_add \ 数据库中的表名
--hive-table test.emp_add_sp \ 要加入到hive中的那个表
--hive-import \
--m 1
--hive-import : 标识为是hive的导入
2.2.2 直接将表结构和数据一起导出
bin/sqoop import \
--connect jdbc:mysql://hadop01:3306/userdb \
--username root \
--password hadoop \
--table emp_conn \
--hive-import \
--m 1 \
--hive-database test;
此种导入方案, 导入到hive中, 默认的表名和关系型数据库的表名一致
2.3 导入表数据子集(query查询)
注意事项:
1)使用query sql语句来进行查找不能加参数--table ;
2)并且必须要添加where条件;
3)并且where条件后面必须带一个$CONDITIONS 这个字符串;
4)并且这个sql语句必须用单引号,不能用双引号;
bin/sqoop import \
--connect jdbc:mysql://hadoop01:3306/userdb \
--username root \
--password 123456 \
--target-dir /wherequery12 \
--query 'select id,name,deg from emp WHERE id>1203 and $CONDITIONS' \
--split-by id \
--fields-terminated-by '\t' \
--m 2
属性:
--query : 编写SQL语句的地方
--split-by : 要使用那个字段进行切割 一般是配合 --m 来使用 , 当--m为1的时候, 不需要指定
注意:
1) 一旦使用 --query, 就不能使用--table
2) 一旦使用 --query, SQL中必须包含where条件
3) where条件的后面 $CONDITIONS
4) --query后面SQL必须使用单引号引起
2.4 导入表数据子集(where过滤)
bin/sqoop import \
--connect jdbc:mysql://hadoop01:3306/userdb \
--username root \
--password 123456 \
--where "city ='sec-bad'" \
--target-dir /wherequery \ -- 在hdfs中的路径
--table emp_add \
--m 1
三、sqoop的增量导入
在实际工作当中,数据的导入,很多时候都是只需要导入增量数据即可,并不需要将表中的数据每次都全部导入到hive或者hdfs当中去,这样会造成数据重复的问题。因此一般都是选用一些字段进行增量的导入, sqoop支持增量的导入数据。
增量导入是仅导入新添加的表中的行的技术。
增量导入涉及的参数 :
--check-column (col)
用来指定一些列,这些列在增量导入时用来检查这些数据是否作为增量数据进行导入,和关系型数据库中的自增字段及时间戳类似。
注意:这些被指定的列的类型不能使任意字符类型,如char、varchar等类型都是不可以的,同时-- check-column可以去指定多个列。
--incremental (mode)
append:追加,比如对大于last-value指定的值之后的记录进行追加导入。lastmodified:最后的修改时间,追加last-value指定的日期之后的记录
--last-value (value)
指定自从上次导入后列的最大值(大于该指定的值),也可以自己设定某一
3.1 append模式
1)先执行以下指令将我们之前的数据全量导入:
bin/sqoop import \
--connect jdbc:mysql://node-1:3306/userdb \
--username root \
--password hadoop \
--target-dir /appendresult \
--table emp --m 1
2)然后在MySQL的emp汇总插入2条增量数据
3)执行如下的指令, 实现增量的导入:
bin/sqoop import \
--connect jdbc:mysql://hadoop01:3306/userdb \
--username root --password hadoop \
--table emp --m 1 \
--target-dir /appendresult \
--incremental append \
--check-column id \
--last-value 1205
--incremental : 按照那种方式进行增量, 可选择为 append 和 lastmodified
--check-column : 根据那个列名来检测数据是否更新
--last-value : 上一次的值、
特点: 将 大于 --last-value的值导入到hadoop中
4)最后验证导入数据目录 可以发现多了一个文件 里面就是增量数据
3.2 lastmodified模式
lastmodified增量导入:
bin/sqoop import \
--connect jdbc:mysql://ahdoop01:3306/userdb \
--username root \
--password 123456 \
--table customertest \
--target-dir /lastmodifiedresult \
--incremental lastmodified \
--check-column last_mod \
--last-value "2019-09-24 16:18:25" \
--m 1 \
--append
属性:
--append : 可选值: append| merge-key
append :将大于等于last-value的数据进行导入操作(更新 和 新增),但是,不会将之前的旧数据进行合并操作
3.3 lastmodified模式:append和merge-key
使用 merge-key模式进行lastmodified导入
bin/sqoop import \
--connect jdbc:mysql://node01:3306/userdb \
--username root \
--password 123456 \
--table customertest \
--target-dir /lastmodifiedresult \
--check-column last_mod \
--incremental lastmodified \
--last-value "2019-09-24 16:05:13" \
--m 1 \
--merge-key id
--merge-key: 根据那个字段进行数据的合并操作
特点:
有更新就会将更新的数据也导入, 有新增将新增的数据进行导入, 最终将结果合并称为一个结果文件
四、sqoop导出
将数据从Hadoop生态体系导出到RDBMS数据库前,目标必须存在于数据库中。
export有三种模式:
默认操作是从将文件中的数据使用insert语句插入到表中
更新模式:Sqoop将生成update替换数据库中现有记录的语句
调用模式:Sqoop将为每条记录城建一个存储过程调用
以下是export命令语法:
$bin/sqoop export (generic-args) (export-args)
注意:使用sqoop的导出工作,关系型数据库中必须得先有表,才能导入,sqoop无法自己在关系型数据库建立表
4.1 默认导出
bin/sqoop export \
--connect jdbc:mysql://hadoop01:3306/userdb \
--username root \
--password 123456 \
--table employee \
--export-dir /emp
属性:
--export-dir : 指定将那个路径数据导出到关系型数据库中 hdfs的路径
--input-fields-terminated-by : 用来执行文件中字段之间的分隔符号, 如果不是逗号, 必须指定, 否则导入失败
--columns : 指定文件中字段的顺序, 如果字段顺序和表中字段顺序是一致的,可以省略
--input-null-string --input-null-non-string : 在进行导出的时候, 将null字符串变更为 null类型数据,
如果不使用, 在导出的时候, 变为 空字符串
4.2 更新导出
--update-key,
更新标识,即根据某个字段进行更新,例如id,可以指定多个更新标识的字段,多个字段之间用逗号分隔。
--updatemod,
指定updateonly(默认模式),仅仅更新已存在的数据记录,不会插入新纪录。
bin/sqoop export \
--connect jdbc:mysql://hadoop01:3306/userdb \
--username root --password 123456 \
--table updateonly \
--export-dir /updateonly_2/ \
--update-key id \
--update-mode updateonly
4.3 更新导出(allowinsert)
--update-key,更新标识,即根据某个字段进行更新,例如id,可以指定多个更新标识的字段,多个字段之间用逗号分隔。
--updatemod,指定allowinsert,更新已存在的数据记录,同时插入新纪录。实质上是一个insert & update的操作。
bin/sqoop export \
--connect jdbc:mysql://hadoop01:3306/userdb \
--username root --password hadoop \
--table allowinsert \
--export-dir /allowinsert_2/ \
--update-key id \
--update-mode allowinsert