sqoop操作:从0到1

sqoop:
apache提供,现在已经停止更新了;
同类型的工具:kettle,datax...

基于hadoop的MapReduce中的map阶段,来实现的;


作用:
Sqoop是一个用于Hadoop和结构化数据存储(如关系型数据库)之间进行高效传输大批量数据的工具
   1.传统数据库(oracle,mysql...)的数据 导入  到hdfs,hive,hbase...
   2.hdfs,hive,hbase...中的数据  导出  到传统数据库(mysql.oracle..)


问题:
1.如何连接到传统数据库
2.如何找到指定的库或者表
3.如何获取我们需要传递的数据
4.如何把数据存入hdfs/hive


连接到mysql/oracle
sqoop命令所在目录:/opt/module/sqoop/bin
我们的环境,是在hadoop用户下安装的,所以访问之前,建议切换到hadoop用户;
可以配置到环境变量中(/etc/profile)

连接到mysql数据库

需要先拷贝mysql的驱动包到sqoop的lib目录下;

查看指定的数据库有哪些库
sqoop list-databases \
--connect jdbc:mysql://192.168.72.129:3306 \
--username root \
--password 123456

如果要连接到oracle呢?
依然需要先拷贝oracle的驱动包到sqoop的lib目录下
oracle的驱动包的位置:D:\app\Administrator\product\11.2.0\dbhome_1\jdbc\lib
在这个目录下,拷贝ojdbc6.jar到sqoop的lib目录下

sqoop list-tables \
--connect jdbc:oracle:thin:@192.168.50.3:1521:orcl \
--username scott \
--password 123456

oracle中通过sql来导入数据到hdfs中
sqoop import \
--connect jdbc:oracle:thin:@192.168.50.3:1521:orcl \
--username scott \
--password 123456 \
--query 'select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp where sal>1500 and $CONDITIONS' \
--target-dir hdfs://node100:9000/1020/orcl/emp \
-m 1


连接参数可以放在一个配置文件里面,然后调用sqoop命令的时候,可以通过访问配置文件的形式加载参数
任意目录下,创建一个文件:
vi sqoop.cfg

文件内容:
list-databases
--connect
jdbc:mysql://192.168.72.129:3306
--username
root
--password
123456

保存文件内容,然后通过sqoop命令访问:
sqoop --options-file sqoop.cfg


也可以访问库,查看某个指定的库里面,有哪些表
这里只需要在连接的url后面加上指定的库名(同时参数修改为list-tables)就可以了:

sqoop list-tables \
--connect jdbc:mysql://192.168.72.129:3306/data \
--username root \
--password 123456


导入:
从mysql导入数据到hdfs:
导入指定的表到hdfs:
sqoop import \
--connect jdbc:mysql://192.168.72.129:3306/data \
--username root \
--password 123456 \
--table emp \
--target-dir hdfs://node100:9000/1020 \
-m 1

导指定的列到hdfs
sqoop import \
--connect jdbc:mysql://192.168.72.129:3306/data \
--username root \
--password 123456 \
--table emp \
--columns 'sex' \
--target-dir hdfs://node100:9000/1020/mycolumns \
-m 1

限定条件导入
sqoop import \
--connect jdbc:mysql://192.168.72.129:3306/data \
--username root \
--password 123456 \
--table dept \
--columns 'deptno,dname' \
--where 'loc=1700' \
--target-dir hdfs://node100:9000/1020/where \
-m 1

自行写sql来过滤数据
sqoop import \
--connect jdbc:mysql://192.168.72.129:3306/data \
--username root \
--password 123456 \
--query 'select id,dt from sqoop where id>1 and $CONDITIONS order by id asc' \
--target-dir hdfs://node100:9000/1020/sql \
-m 1


query后面可以写双引号,也可以写单引号:
写双引号的时候,注意:$CONDITIONS前面应该加上转义符\


对于password参数,也可以不在这里写,而在执行命令的时候,由用户来输入:
sqoop list-tables \
--connect jdbc:mysql://192.168.72.129:3306/data \
--username root \
-P
这里,通过P参数,由用户在执行的时候再输入密码

从数据库导入数据到hive表中

从数据库查询数据,然后直接导入到hive表所在的目录下
sqoop import \
--connect jdbc:oracle:thin:@192.168.50.3:1521:orcl \
--username scott \
--password 123456 \
--query 'select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp where $CONDITIONS' \
--target-dir hdfs://node100:9000/user/hive/warehouse/testhive.db/emp \
--delete-target-dir \
-m 1


建表:
create table emp1(
   empno int,
   ename string,
   job   string,
   mgr   int,
   hiredate  string,
   sal   int,
   comm  int,
   deptno int
)
row format delimited fields terminated by ',';


往hive的分区表中导数据
--先在hive中建分区表
create table emp02(
   empno int,
   ename string,
   job   string,
   mgr   int,
   hiredate  string,
   sal   int,
   comm  int,
   deptno int
)
partitioned by (create_time string)
row format delimited fields terminated by ','

从oracle中导入数据(--table后面的表名要大写)
sqoop import \
--connect jdbc:oracle:thin:@192.168.50.3:1521:orcl \
--username scott \
--password 123456 \
--table EMP \
--where 'sal<=2000' \
-m 1 \
--fields-terminated-by ',' \
--hive-import \
--hive-database hive \
--hive-table emp02 \
--hive-partition-key create_time \
--hive-partition-value 2022-03-04

mysql导入hive分区表
建分区表
create table stu(
  stuid int,
  stuname string
)
partitioned by (create_date string)
row format delimited fields terminated by ','

导入
sqoop import \
--connect jdbc:mysql://192.168.72.129:3306/data \
--username root \
--password 123456 \
--table stu \
-m 1 \
--fields-terminated-by ',' \
--hive-import \
--hive-database hive \
--hive-table stu \
--hive-partition-key create_date \
--hive-partition-value 2022-03-05


增量导入
sqoop import \
--connect jdbc:mysql://192.168.50.206:3306/testsqoop \
--username root \
--password 123456 \
--table student \
-m 1 \
--fields-terminated-by ',' \
--hive-import \
--hive-database testhive \
--hive-table stu \
--hive-partition-key create_date \
--hive-partition-value 2022-03-05 \
--incremental append \
--check-column stuid \
--last-value 4


mysql/oracle  -->  hdfs/hive   ===导入
hdfs/hive   -->   mysql/oracle  =====导出

导出
需要先准备好导出目标数据库的库和表
sqoop export --connect jdbc:mysql://192.168.72.129:3306/data \
--username root \
--password 123456 \
--table emp \
--export-dir hdfs://node100:9000//user/hive/warehouse/testhive.db/emp \
-m 1


增量导出

sqoop export --connect jdbc:mysql://192.168.72.129:3306/data \
--username root \
--password 123456 \
--table emp \
--export-dir hdfs://node100:9000//user/hive/warehouse/testhive.db/emp \
-m 1
--update-mode allowinsert \
--update-key empno


使用job来处理增量导入时,last-value需要手工修改的问题:

mysql-->Hive

job的使用:
job需要先创建,再执行
job的创建,执行的部分参数等,作为job的元数据,需要保存下来;
元数据默认的保存位置:/root/.sqoop下,也可以把元数据保存在第三方的关系型数据库中,比如mysql
要想保存在第三方数据库,需要在sqoop的安装目录的conf/sqoop-site.xml文件中配置数据库连接信息


创建job:
创建之前,需要先完成一些配置:
1.下载java-json.jar包,下载后,把该jar包上传到linux下,sqoop的安装目录的lib目录下;
2.配置环境变量(现有的环境下,不加也能运行)
    vi /etc/profile
        在profile文件内,class_path中,添加sqoop的lib路径
            class_path=xxxxxxxxxx:/opt/module/sqoop/lib

    修改了profile之后,需要更新修改
    source /etc/profile

3.进入sqoop安装目录下的lib目录,找到hive-exec-3.0.0.jar文件,修改文件名(修改其他任意名字)
    mv ./hive-exec-3.0.0.jar ./hive-exec-3.0.0.txt


下面就可以开始创建job了

创建job:
语法:sqoop job --create 名字 -- 要完成的操作
注意:job名字之后--后面,必须有空格

sqoop job --create addDatajob -- import \
--connect jdbc:mysql://192.168.72.129:3306/data \
--username root \
--password 123456 \
--table emp \
-m 1 \
--fields-terminated-by ',' \
--hive-import \
--hive-database testhive \
--hive-table emp \
--hive-partition-key create_date \
--hive-partition-value 2022-03-05 \
--incremental append \
--check-column empno \
--last-value 0

创建成功之后,可以查看job;
sqoop job --list

创建成功之后,可以去调用(执行)新创建的job
(执行之前,需要先把hive-exec...txt改回原来的名字)
sqoop job --exec addDatajob

删除job;
sqoop job --delete addDatajob

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

好好羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值