Sqoop全量及增量的导入导出实现

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6


ETL的操作

  • E:抽取
1、抽取OLTP的数据
2、抽取日志数据
3、通过接口抽取第三方数据
  • T:转换
1、数据清洗
  丢弃一些异常数据
  处理一些脏数据
  处理一些重复数据
2、数据的格式转换
   日期:
        crate_time     year   month   day
       2022-12-23 -->  2022   12      23
       2022-1-1   -->  2022-01-01
   字符串转换: 
          "path/list"  -->  path/list
           json数据     -->  解析
  • L:加载
1、全量加载
  数据全部加载
2、增量加载
  每次只加载新增或者修改数据

ETL 采集工具

  • Kettle
特点:
 1:图形化操作
 2:底层是Java
 3: 支持集群
 4: 数据量大时,性能一般
  • Nify
特点:
 1:图形化操作
 2:采集数据时会造成大量的IO操作,性能一般
  • Datax
特点:
 1:单进程,多线程
 2:不能支撑海量数据的迁移操作
  • Flume
特点:
 1:主要用于实时操作
 2: 底层是MapReduce
  • Sqoop(项目使用)
特点:
 1:为Hadoop而生
 2:底层是MapReduce
 3:支撑大数据量的数据迁移工作

Sqoop框架

介绍

1、Sqoop的导入导出
 导入: RDBMS -----> Hadoop平台
 导出:  Hadoop平台 -----> RDBMS
 
2、Sqoop的重点是写导入导出的命令
3、Sqoop的底层是没有Reduce的MR
  Sqoop这是机械性将数据源的数据一条条进行搬移,不需要对数据做额外的聚合,所以不需要Reduce

测试

#测试你的sqoop是否能查看MySQL中所有的数据库
sqoop list-databases \
 --connect jdbc:mysql://hadoop0	1:3306/ \
 --username root \
 --password 123456

应用1-导入

数据导入到HDFS-全量

#split-by后边的字段是数字类型
sqoop import \
--connect jdbc:mysql://192.168.88.80:3306/userdb \
--table emp \
--username root \
--password 123456 \
--target-dir /sqoop/result3 \
--delete-target-dir \
--fields-terminated-by '\t' \
--split-by id \
--m 2

#如果你要指定多个maptask来完成数据的导入,也就是--m参数的值不是1,则必须添加一个参数--split-by
#该参数用来指定你原表的数据如何分配给多个线程来实现导入
#--split-by id  内部原理是获取id的最小值和id的最大值,进行平均划分
 SELECT MIN(`id`), MAX(`id`) FROM `emp`
 
 
 #如果split-by后边的字段是字符串类型,则需要添加以下内容
 -Dorg.apache.sqoop.splitter.allow_text_splitter=true \

数据导入到HDFS-增量

sqoop import \
--connect jdbc:mysql://192.168.88.80:3306/userdb \
--username root \
--password 123456 \
--target-dir /sqoop/result5 \
--query 'select id,name,deg from emp WHERE  id>1203 and $CONDITIONS' \
--delete-target-dir \
--fields-terminated-by '\t' \
--m 1

(重点)数据导入-全量-到Hive-全量

-- 手动在hive中建一张表
create table test.emp_hive
(
    id     int,
    name   string,
    deg    string,
    salary int,
    dept   string
)
row format delimited fields terminated by '\t'
stored as orc;


-- 导入数据
sqoop import \
--connect jdbc:mysql://hadoop01:3306/userdb \
--table emp \
--username root \
--password 123456 \
--fields-terminated-by '\t' \
--hive-database test \
--hive-table emp_hive \
-m 1

(重点)数据导入-全量-到Hive-增量

#!/bin/bash

yes_day=$(date -d "yesterday" +%Y-%m-%d)


/usr/bin/hive -f a.sql

wait

/usr/bin/sqoop import \
--connect jdbc:mysql://192.168.88.80:3306/userdb \
--username root \
--password 123456 \
--query "select * from userdb.customertest where last_mod  between '${yes_day} 00:00:00' and  '${yes_day} 23:59:59'   and  \$CONDITION
S" \
--fields-terminated-by '\t' \
--hcatalog-database test \
--hcatalog-table customertest \
-m 1

应用2-导出

数据从HDFS导出到MySQL

sqoop export \
--connect jdbc:mysql://192.168.88.80:3306/userdb \
--table employee \
--username root \
--password 123456 \
--export-dir /sqoop/result1/

(重点)数据从Hive导出到MySQL

sqoop export \
--connect "jdbc:mysql://192.168.88.80:3306/userdb? useUnicode=true&characterEncoding=utf-8" \
--table employee \
--username root \
--password 123456 \
--hcatalog-database test \
--hcatalog-table emp_hive \
--input-fields-terminated-by '\t' \
-m 1

OOzie

1、Oozie的底层是MapReduce

Sqoop全量及增量的导入导出实现_大数据


阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6