Sqoop安装部署及使用

一、sqoop概述

sqoop是mysql/oracle/DB2等RDBMS体系与hdfs/hive/hbase等hadoop生态体系之间传输数据的一种工具;

sqoop的工作机制是将导入导出命令翻译成MapReduce程序实现

sqoop可以理解为: SQL-->hadoop   and  hadoop-->SQL

数据导入导出:

数据导入:  RDBMS-->hadoop

数据导出: hadoop-->RDBMS

 

二、sqoop安装部署

1.解压sqoop的tar包

tar -zxvf sqoop-1.4.6.tar.gz -C 安装目录

2.修改sqoop-env.sh文件

#Set path to where bin/hadoop is available

export HADOOP_COMMON_HOME=/export/server/hadoop-3.3.0

#Set path to where hadoop-*-core.jar is available

export HADOOP_MAPRED_HOME=/export/server/hadoop-3.3.0

#Set the path to where bin/hive is available

export HIVE_HOME=/export/server/hive-3.1.2

3.上传jar

jarmysql-connector-java-5.1.32.jar到sqoop的lib目录下

hive-common-jar-* 到sqoop的lib目录下

4.配置sqoop环境变量

vim /etc/profile

export SQOOP_HOME=/export/server/sqoop-1.4.6

export PATH=$PATH:$SQOOP_HOME/bin

执行:wq , 退出/etc/profile

刷新环境变量配置  source /etc/profile

4.验证启动sqoop

查看mysql数据库

sqoop-list-databases --connect jdbc:mysql://node1:3306/ --username root --password 123456

二、数据导入

1、mysql -> hdfs

(1)全量导入

 sqoop-import --connect jdbc:mysql://node1:3306/sqoop_data --username root --password hadoop --table user --delete-target-dir --target-dir /sqoop/qldr  --fields-terminated-by '|' --split-by id -m 1

注释:--fields-terminated-by:指定分隔符

--num-mappers (或-m):配置map任务个数

--target-dir:hdfs目录

--delete-target-dir:如果指定的hdfs的已存在,可以删除文件夹

--split-by :如果mysql表没有主键,当设置多个map并行(m>1),需要用该参数指定一个字段来划分每个MapTask处理的数据;  有主键时,可以省略该参数

(2)全量导入(指定字段) 

sqoop-import --connect jdbc:mysql://node1:3306/sqoop_data --username root --password hadoop --table user --delete-target-dir --target-dir  /sqoop/qldr1 --fields-terminated-by '|' --columns id,name  -m 1

注释:--columns:指定导入到hdfs的字段个数(也可以指定字段的顺序)

(3)全量导入(指定字段 - where) 

sqoop-import --connect jdbc:mysql://node1:3306/sqoop_data --username root --password hadoop --table user --target-dir /sqoop/qldr2 --fields-terminated-by '|' -m 1 --where 'id<3'

注释:--where:与mysql的where一样 

(4)全量导入(指定字段 - query) 

sqoop-import --connect jdbc:mysql://node1:3306/sqoop_data --username root --password hadoop --target-dir /sqoop/qldr3 --fields-terminated-by '|' -m 1 --query 'select  name,age from user where id<3 and $CONDITIONS' ;

注释:--query在该参数后可以加一个完整的sql语句(--e具有同样功能),  使用该参数时,--table参数省略, `and $CONDITIONS` 该字段是固定格式

(5)增量导入(不含更新的数据)

sqoop-import --connect jdbc:mysql://node1:3306/sqoop_data --username root --password hadoop --table user --target-dir /sqoop/qldr5 --fields-terminated-by '|' -m 1 --check-column id --incremental append --last-value 5;

注释:--check-column :指定用哪一列来作为增量的依据

--incremental :增量采集方式(append , lastmodified)

--last-value  指定(check-column)上一次的最后一个值是什么

(6)增量导入(含更新的数据)

sqoop-import --connect jdbc:mysql://node1:3306/sqoopTest --username root --password hadoop -e "select * from user where substr(create_time,1,10) = '昨天的日期' or substr(update_time,1,10) = '昨天的日期'  and \$CONDITIONS" --target-dir /sqoop/import/'昨天的日期' --fields-terminated-by '\t' -m 1

注释:自带的Lastmodified参数在工作中不适用

2、mysql->hive

(1)全量导入

sqoop-import --connect jdbc:mysql://node1:3306/sqoop_data --username root --password hadoop --table user --hcatalog-database sqoop_data --hcatalog-table info --fields-terminated-by '|' -m 1 ;

或者

sqoop-import --connect jdbc:mysql://node1:3306/sqoop_data --username root --password hadoop --table user --hive-import --hive-database sqoop_data --hive-table user_info --fields-terminated-by ',' -m 1 ;

注释:--hcatalog-database/--hive-database  hive的数据库名

--hcatalog-table/--hive-table  hive的表名

(2)增量导入(含更新的数据)

yesterday='2023-10-26'

sqoop-import --connect jdbc:mysql://node1:3306/sqoop_data --username root --password hadoop -e "select *,'${yesterday}' from user where substr(create_time,1,10) = '${yesterday}' or substr(update_time,1,10) = '${yesterday}'  and \$CONDITIONS" --hive-import --hive-database sqoop_data --hive-table user_info --target-dir /user/hive/warehouse/sqoop_data.db/user_info/temp/${yesterday} --delete-target-dir --fields-terminated-by ',' -m 1

注意:--target-dir  需要指定中间文件的目录

(3)hive其他导入操作参见hdfs

三、数据导出

1、hdfs -> mysql

(1)全量导出

sqoop-export --connect jdbc:mysql://node1:3306/sqoop_data --username root --password hadoop --table user --export-dir /sqoop --input-fields-terminated-by '|' ;

注释:--export-dir :  hdfs被导出文件的路径

(2)增量导出(只有更新数据)

sqoop-export --connect jdbc:mysql://node1:3306/sqoop_data--username root --password hadoop --table hive_info --export-dir /user/hive/warehouse/sqoop_data.db/info --update-key id --update-mode updateonly --input-fields-terminated-by '|' -m 1;

 2、hive -> mysql

(1)全量导出

sqoop-export --connect jdbc:mysql://node1:3306/sqoop_data --username root --password 123456 --table hive_info --hcatalog-database sqoop_data --hcatalog-table info  --input-fields-terminated-by '|' -m 1;

或者

sqoop-export --connect jdbc:mysql://node1:3306/sqoop_data --username root --password hadoop --table user --export-dir /user/hive/warehouse/sqoop_data.db/user_info/dt=2023-10-27  --input-fields-terminated-by ',' -m 1

(2)增量导出(含更新+新增数据)

sqoop-export --connect jdbc:mysql://node1:3306/sqoop_data --username root --password hadoop --table user --export-dir /user/hive/warehouse/sqoop_data.db/user_info --update-key id --update-mode allowinsert --input-fields-terminated-by '|' -m 1;

注释:--update-key:用于指定用作更新标识符的列名,以确定哪些记录需要进行更新

--update-mode

  1. allowinsert(默认值):这种模式允许 Sqoop 同时插入新记录并更新现有记录。如果数据行不存在,则插入新记录;如果数据行已存在,则更新记录。
  2. updateonly:这种模式仅允许更新现有记录,不允许插入新记录。如果数据行不存在,则不执行任何操作。只有当数据行已存在时,才会执行更新操作。
(3)增量导出(只有更新数据)

sqoop-export --connect jdbc:mysql://node1:3306/sqoop_data --username root --password hadoop --table hive_info --hcatalog-database sqoop_data --hcatalog-table info --update-key id --update-mode updateonly --input-fields-terminated-by '|' -m 1;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值