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

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值