sqoop2
*sqoop就是可以高效的让关系型数据库和大数据平台存储系统进行数据迁移的框架
其底层原理是把用户的操作转换成map任务然后发布到yarn上进行分布式的执行,从而完成对大数据的迁移。
*sqoop2包含客户端和服务端
客户端:1.cli
2.java api
服务端:1.元数据存储,用户执行数据迁移操作时需事先配置的各种组件的信息
2.提供rpc调用服务(http协议)
3.解析编译用户的操作指令,转换成map任务,然后发送到yarn上运行
4.在map任务在yarn上运行的时候,它还可以对map任务进行监控和操作,依赖jobhistory服务
sqoop依赖:hdfs,yarn,jobhistory
*sqoop2的组件
1.connector连接器,它记录着sqoop2连接各种存储系统的连接方式和对应的驱动等程序。
2.link,连接,一个link是某个connector的类型的实例,一个link代表着一个具体的和存储系统之间的连接。
3.job,作业,一个作业由一个 from 的 link 和一个 to 的 link构成。job启动就会把这个etl过程转换成mapreduce任务,发送到yarn上去执行。
*sqoop2的启动
sqoop2在启动的时候需要注意启动的目录,因为普通的配置会让sqoop2在启动的时候就在当前目录下会生成两个文件夹@LOGDIR@(sqoop2服务的运行日志) 和@BASEDIR@(元数据库derby)
*sqoop2的指令
show 查看组件配置信息
create 创建组件
delete 删除组件
update 更新组件
clone 复制组件,当组件配置复杂时可以把另一个类似的组件配置复制一下然后修改局部即可
start 启动 job
stop 停止job
status 查看job的运行状态
set option --name verbose --value true
set server --url http://sqoop2.company.net:80/sqoop
-- 使用把mysql上某张表的数据导入到hdfs上
1.创建一个link连接mysql,类型:generic-jdbc-connector
create link -c generic-jdbc-connector
2.创建一个link连接hdfs
create link -c hdfs-connector
URI: hdfs://centos1:9000/
Conf directory: /usr/hadoop/hadoop-2.6.4/etc/hadoop
3.创建一个job from mysql link to hdfs link
create job -f my-windows-mysql -t my-hdfs
4.启动job
start job -n student_mth
update link -n my-windows-mysql
查看提交的任务命令
show submission
查看job的执行状态命令
status job -n student_mth
-- 取出每个学生和其各科考试成绩,导入到hdfs上
select *
from table1 a
join table2 b
on a.xx=b.xx
where ${CONDITIONS} and ll
使用sql从关系型数据抽取数据到hdfs上需要注意的问题:
1.Schema name、Table name、Table column names三个配置项要为空,不然会和sql冲突
2.sql上必须要包含“${CONDITIONS}”这个字符串,它需要加在where的后面
3.partition column 必须得填写,而且partition column的名称必须出现在select的后面
如果sql代码在满足上面两个条件比较麻烦是,可以使用子查询,然后把${CONDITIONS}加在子查询外面,如:
select * from(
SELECT
a.s AS s,
a.sname sname,
a.sage sage,
a.ssex ssex,
b.score score,
c.Cname NAME
FROM
student a
INNER JOIN sc b
ON a.s = b.s
INNER JOIN course c
ON b.C = c.c
)d
where ${condition}
*sqoop的java api操作步骤
1.首先确定sqoop服务端的url,http://centos1:12000/sqoop/
2.使用url来构建client对象,SqoopClient
3.调用clinet的各种方法来进行创建、修改、删除link,创建、修改、删除、启动job
假设mysql上有一张订单表,大数据平台上要对订单进行分析,订单表的数据每天都要抽取到大数据平台下
使用sqoop来完成这个过程
对这张表的导入,就需要使用增量导入的方式
order 表有
orderid customerid orderdate
select * from order where orderdate='20180320'
job
from link中的sql,添加日期限定条件,从而完成增量导入
需要开发:
1.java类,接受参数date,样式20180320
在这个类里面的执行方法,根据接受到的参数,来创建新的job,并启动job,实现自动化导入过程
sqoop1
数据分成两类:
1.维度数据:描述事物的 可以增量也可以全量甚至可以不导
2.事实数据:描述事件的 一定是要增量导入
incremental import增量导入
check column:检查增量标识字段,一般为id(唯一标识),而这个id一般是顺序递增的
last modify:最后一次导入的id的最大值
user
*sqoop1的使用
主要应用指令:
sqoop-import
sqoop-export
sqoop tool-name [tool-arguments]
tool-name description
export Export an HDFS directory to a database table
import Import a table from a database to HDFS
import-all-tables Import tables from a database to HDFS
-- 把linux的mysql里面hive数据库里面的COLUMNS_V2的数据导入到hdfs上
import
-- 使用表的指令写法来进行导入数据
sqoop import -Dorg.apache.sqoop.splitter.allow_text_splitter=true \
--connect jdbc:mysql://master:3306/hive \
--driver com.mysql.jdbc.Driver \
--password sa \
--username root \
--as-textfile \
--table COLUMNS_V2 \
--split-by CD_ID \
--target-dir /sqoop1test/columns_v2 \
--append
-m 2
--compress
-- 使用sql的形式来进行表数据的导入
-- 导入hive的表(tbls)和其字段(columns_v2)的名称类型
tbl_id tbl_name tbl_type column_name type_name
sqoop import \
--connect jdbc:mysql://centos1:3306/hive \
--driver com.mysql.jdbc.Driver \
--password sa \
--username root \
--as-textfile \
--query 'SELECT * FROM ( SELECT a.TBL_ID ,a.TBL_NAME ,a.TBL_TYPE ,c.COLUMN_NAME ,c.TYPE_NAME FROM TBLS a INNER JOIN SDS b ON a.SD_ID=b.SD_ID INNER JOIN COLUMNS_V2 c ON b.CD_ID=c.CD_ID )a WHERE $CONDITIONS' \
--split-by TBL_ID \
--target-dir /sqoop1test/tablecolumns
--query后面的sql可以使用单引号来括中,如上例,但是有可能sql中就包含单引号,这种情况下再用单引号括中sql的话就会有错误发生
这时可以使用双引号来括中sql,但是使用双引号括中sql的时候$CONDITIONS的$前面需要加一个转义字符:\$CONDITIONS
--query "
SELECT *
FROM (
SELECT a.TBL_ID
,a.TBL_NAME
,a.TBL_TYPE
,c.COLUMN_NAME
,c.TYPE_NAME
FROM TBLS a
INNER JOIN SDS b
ON a.SD_ID=b.SD_ID
INNER JOIN COLUMNS_V2 c
ON b.CD_ID=c.CD_ID
WHERE a.TBL_TYPE='EXTERNAL_TABLE'
)a
WHERE \$CONDITIONS
"
*sqoop1也支持增量导入:Incremental Imports
增量导入的参数配置:
--incremental (mode):append lastmodified
如果我们导入的数据表的唯一标识(id)是序列递增的值的时候可以使用append
append模式需要配合:--check-column --last-value
这样在进行新导入的时候就会在sql上加上 check-column>last-value来限定导入的数据(数值型)
如果使用lastmodified的模式的话,需要指定一个最后更新时间的字段,然后--last-value参数指定上次导入数据的时间戳,那么新导入数据时,就会给sql加上 check-column>last-value来限定导入的数据(时间戳)
--作业,使用append模式来实现增量导入的案例
--把mysql中的数据导入到hive数据仓库里面
--把mysql中的COLUMNS_V2导入到hive库里面
sqoop import \
--connect jdbc:mysql://centos1:3306/hive \
--driver com.mysql.jdbc.Driver \
--password sa \
--username root \
--table COLUMNS_V2 \
--split-by CD_ID \
--as-textfile \
--hive-import \
--hive-table from_mysql_column_v2 \
--hive-overwrite \
--hive-home /usr/hadoop/apache-hive-2.1.0-bin
-- 作业,把columes_v2导入到hbase表:column_v2中
*sqoop-export导出
*把/eshopdata/20170817/text/categories文件夹下的数据导出到mysql中
CREATE TABLE category(
cate_id VARCHAR(20),
dep_id VARCHAR(20),
cate_name VARCHAR(50)
)
sqoop export --connect jdbc:mysql://master:3306/test --driver com.mysql.jdbc.Driver --password 123456 --username root --table category --export-dir /order-dataresource/category --input-fields-terminated-by '|'
下载kafka 0.10.1.x
下载kettle
https://community.hds.com/docs/DOC-1009855
下载网址:
https://sourceforge.net/projects/pentaho/files/Data%20Integration/
pdi-ce-7.0.0.0-25.zip