数据迁移工具 - Sqoop_sqoop官网-程序员宅基地

技术标签: sqoop  hadoop  

一、Sqoop概述

        Sqoop是一款开源的工具,主要用于在hadoop(hive)与传统数据库(mysql、Oracle、postgresql)间进行数据的传递。可以将关系型数据库中的数据导入HDFS中,也可以将HDFS中的数据导入到关系型数据库中。
        
        将导入导出命令转换为MapReduce程序来实现。翻译出的MapReduce中主要是对inputformat和outputformat进行定制。

二、安装配置

        Sqoop 官网:http://sqoop.apache.org/
        Sqoop下载地址:http://www.apache.org/dyn/closer.lua/sqoop/

        1. 下载、上传并解压
        将下载的安装包 sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz 上传到虚拟机中;
        解压缩软件包;
        tar zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
        mv sqoop-1.4.7.bin__hadoop-2.6.0/ ../servers/sqoop-1.4.7/

        2. 增加环境变量、使之生效
        vi /etc/profile
        # 增加以下内容
        export SQOOP_HOME=/opt/lg/servers/sqoop-1.4.7
        export PATH=$PATH:$SQOOP_HOME/bin
        source /etc/profile

        3. 创建、修改配置文件
        # 配置文件位置 $SQOOP_HOME/conf;要修改的配置文件为 sqoop-env.sh
        cp sqoop-env-template.sh sqoop-env.sh
        vi sqoop-env.sh
        # 在文件最后增加以下内容
        export HADOOP_COMMON_HOME=/opt/lagou/servers/hadoop-2.9.2
        export HADOOP_MAPRED_HOME=/opt/lagou/servers/hadoop-2.9.2
        export HIVE_HOME=/opt/lagou/servers/hive-2.3.7

        4. 拷贝JDBC驱动
        # 拷贝jdbc驱动到sqoop的lib目录下(备注:建立软链接也可以)
        ln -s /opt/lagou/servers/hive-2.3.7/lib/mysql-connector-java-5.1.46.jar /opt/lagou/servers/sqoop-1.4.7/lib/

        5. 拷贝jar
        5.1 将 $HIVE_HOME/lib 下的 hive-common-2.3.7.jar,拷贝到 $SQOOP_HOME/lib目录下。如不拷贝在MySQL往Hive导数据的时候将会出现错误:ClassNotFoundException:org.apache.hadoop.hive.conf.HiveConf
        # 硬拷贝 和 建立软链接都可以,选择一个执行即可。下面是硬拷贝
        cp $HIVE_HOME/lib/hive-common-2.3.7.jar $SQOOP_HOME/lib/
        # 建立软链接
        ln -s /opt/lagou/servers/hive-2.3.7/lib/hive-common-2.3.7.jar /opt/lagou/servers/sqoop-1.4.7/lib/hive-common-2.3.7.jar
        5.2 将 $HADOOP_HOME/share/hadoop/tools/lib/json-20170516.jar 拷贝到
$SQOOP_HOME/lib/ 目录下;否则在创建sqoop job时会报:
java.lang.NoClassDefFoundError: org/json/JSONObject
        cp $HADOOP_HOME/share/hadoop/tools/lib/json-20170516.jar $SQOOP_HOME/lib/

        6. 安装验证
        sqoop version
        省略了警告 ... ...
        20/06/19 10:37:24 INFO sqoop.Sqoop: Running Sqoop version:1.4.7 Sqoop 1.4.7
        git commit id 2328971411f57f0cb683dfb79d19d4d19d185dd8 Compiled by maugli on Thu Dec 21 15:59:58 STD 2017
        # 测试Sqoop是否能够成功连接数据库
        sqoop list-databases --connect jdbc:mysql://linux123:3306/?useSSL=false --username hive --password 12345678
        ... ...
        information_schema
        hivemetadata
        mysql
        performance_schema
        sys

三、应用案例

        在Sqoop中
        导入:从关系型数据库向大数据集群(HDFS、HIVE、HBASE)传输数据;使用import关键字;
        导出:从大数据集群向关系型数据库传输数据;使用export关键字;

        测试数据脚本:
        -- 用于在 Mysql 中生成测试数据

-- 用于在 Mysql 中生成测试数据
CREATE DATABASE sqoop;

use sqoop;

CREATE TABLE sqoop.goodtbl(
gname varchar(50),
serialNumber int,
price int,
stock_number int,
create_time date);

DROP FUNCTION IF EXISTS `rand_string`;
DROP PROCEDURE IF EXISTS `batchInsertTestData`;

-- 替换语句默认的执行符号,将;替换成 //
DELIMITER //
CREATE FUNCTION `rand_string` (n INT) RETURNS VARCHAR(255)
CHARSET 'utf8'
BEGIN
 DECLARE char_str varchar(200) DEFAULT
'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
 DECLARE return_str varchar(255) DEFAULT '';
 DECLARE i INT DEFAULT 0;
 WHILE i < n DO
    SET return_str = concat(return_str,
substring(char_str, FLOOR(1 + RAND()*36), 1));
    SET i = i+1;
 END WHILE;
 RETURN return_str;
END
//

-- 第一个参数表示:序号从几开始;第二个参数表示:插入多少条记录
CREATE PROCEDURE `batchInsertTestData` (m INT, n INT)
BEGIN
 DECLARE i INT DEFAULT 0;
 WHILE i < n DO
  insert into goodtbl (gname, serialNumber, price,
stock_number, create_time)
  values (rand_string(6), i+m, ROUND(RAND()*100),
FLOOR(RAND()*100), now());
SET i = i+1;
 END WHILE;
END
//
delimiter ;

call batchInsertTestData(1, 100);

        以下案例需要启动:HDFS、YARN、MYSQL对应的服务。

3.1 导入数据

        MySQL到HDFS
        1. 导入全部数据

sqoop import \
--connect jdbc:mysql://linux123:3306/sqoop \
--username hive \
--password 12345678 \
--table goodtbl \
--target-dir /root/lg \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t"

        target-dir:将数据导入HDFS的路径。
        delete-target-dir:如果目标文件夹在HDFS上已经存在,那么再次运行就会报错。可以使用delete-target-dir来先删除目录,也可以使用append参数,表示追加数据。
        num-mappers:启动多少个map task;默认启动4个map task;也可以写成 -m 1。
        fields-terminated-by:HDFS文件中数据的分隔符。 

      2. 导入查询数据 

sqoop import \
--connect jdbc:mysql://linux123:3306/sqoop \
--username hive \
--password 12345678 \
--target-dir /root/lg \
--append \
-m 1 \
--fields-terminated-by "\t" \
--query 'select gname, serialNumber, price, stock_number,create_time from goodtbl where price>88 and $CONDITIONS;'

        备注:
        查询语句的where子句中必须包含‘$CONDITIONS’;
        如果query后面使用的是双引号,则$CONDITION前必须加转义符,防止shell识别为自己的变量。 

        3. 导入指定的列

sqoop import \
--connect jdbc:mysql://linux123:3306/sqoop \
--username hive \
--password 12345678 \
--target-dir /root/lagou \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--columns gname,serialNumber,price \
--table goodtbl

        备注:columns中如果涉及到多列,用逗号分隔,不能加空格。

        4. 导入查询数据(使用关键字)

sqoop import \
--connect jdbc:mysql://linux123:3306/sqoop \
--username hive \
--password 12345678 \
--target-dir /root/lagou \
--delete-target-dir \
-m 1 \
--fields-terminated-by "\t" \
--table goodtbl \
--where "price>=68"

         5. 启动多个map task导入数据

        在 goodtbl 中增加数据:call batchInsertTestData(1000000);

sqoop import \
--connect jdbc:mysql://linux123:3306/sqoop \
--username hive \
--password 12345678 \
--target-dir /root/lagou \
--delete-target-dir \
--fields-terminated-by "\t" \
--table goodtbl \
--split-by gname

# 给 goodtbl 表增加主键
alter table goodtbl add primary key(serialNumber);

        备注:
        1. 使用多个map task进行数据导入时,sqoop要对每个task的数据进行分区
                如果MYSQL中的表有主键,指定map task的数量就行。
                如果MYSQL中的表有主键,要使用split-by指定分区字段。
                如果分区字段时字符类,使用sqoop命令的时候要添加
                        -
                        Dorg.apache.sqoop.splitter.allow_text_splitter=true。 
                即:
                sqoop import -
                Dorg.apache.sqoop.splitter.allow_text_splitter=true \
                --connect jdbc:mysql://liunx:3306/sqoop \

        2. 查询语句where子句中的‘$CONDITIONS’,也是为了做数据分区使用的,即使只有1个map task。

        MYSQL到Hive
        在hive中创建表:

CREATE TABLE mydb.goodtbl(
gname string,
serialNumber int,
price int,
stock_number int,
create_time date);
sqoop import \
--connect jdbc:mysql://linux123:3306/sqoop \
--username hive \
--password 12345678 \
--table goodtbl \
--hive-import \
--create-hive-table \
--hive-overwrite \
--hive-table mydb.goodtbl \
-m 1

        参数说明:
        hive-import:必须参数,指定导入hive。
        hive-database:hive库名(缺省值default)。
        hive-table:hive表名。
        fields-terminated-by:hive字段分隔符。
        hive-overwrite:覆盖已存在数据。
        create-hive-table:创建好 hive 表,但是表可能存在错误。不建议使用这个参数,建议提前建好表。

3.2 导出数据

        Hive/HDFS到RDBMS
        备注:MYSQL表需要提前创建
        # 提前创建表
        CREATE TABLE sqoop.goodtbl2(
        gname varchar(50),
        serialNumber int,
        price int,
        stock_number int,
        create_time date);

sqoop export \
--connect jdbc:mysql://linux123:3306/sqoop \
--username hive \
--password 12345678 \
--table goodtbl2 \
--num-mappers 1 \
--export-dir /user/hive/warehouse/mydb.db/goodtbl \
--input-fields-terminated-by "\t"

3.3 增量数据导入

        变化数据捕获(CDC)
        前面都是执行的全量数据导入。如果数据量很小,则采取全部源数据抽取;如果源数量量很大,则需要抽取发生变化的数据,这种数据抽取模式叫做变化数据捕获,简称CDC(Change Data Capture)。        
        CDC大致分为两种:侵入式非侵入式。侵入式是指CDC操作会给源系统带来性能影响,只要CDC以任何一种方式对源数据库执行了SQL操作,就认为是侵入式的。

        常用的4中CDC方法是(前三种是侵入式的):

       1. 基于时间戳的CDC:抽取过程中可以根据某些属性列来判断哪些数据时增量的,最常见的属性列有以下两种:        
                时间戳:最好有两个列,一个插入时间戳,表示何时创建;一个更新时间戳,表示最后一次更新时间;
                序列:大多数数据库都提供自增的功能,表中的列定义成自增的,很容易就根据该列识别出新插入的数据;
        时间戳的CDC是最简单最常用的,但有如下缺点:
                不能记录删除记录的操作;
                无法识别多次更新;
                不具有实时能力;

        2. 基于触发器的CDC:当执行INSERT、UPDATE、DELETE这些SQL语句时,触发数据库里的触发器,使用触发器可以捕获变更的数据,并把数据保存到中间历史表里。然后这些边恒数据再从临时表中取出。大多数情况下,不允许向操作型数据库添加触发器,且这种方法会降低系统性能,基本不会被采用;

        3. 基于快照的CDC:可以通过比较源表和快照表来获得数据变化。基于快照的CDC可以检测到插入、更新和删除的数据,这是相对于基于时间戳的CDC方案的优点。其缺点是需要大量的存储空间来保存快照;

        4. 基于日志的CDC:最复杂的和没有侵入性的CDC方法是基于日志的方式。数据库会把每个插入、更新、删除操作记录到日志里。解析日志文件,就可以获取相关信息。每个关系型数据库日志格式不一致,没有通用的产品。阿里巴巴的canal可以完成MySQL日志文件解析。

        增量导入数据分为两种方式:
        基于递增列的增量数据导入(Append方式)
        基于时间列的数据增量导入(LastModified方式)

3.3.1 Append方式

        1. 准备初始数据
                -- 删除 MySQL 表中的全部数据
                truncate table sqoop.goodtbl;
                -- 删除 Hive 表中的全部数据
                truncate table mydb.goodtbl;
                -- 向MySQL的表中插入100条数据
                call batchInsertTestData(1, 100);

        2. 将数据导入hive

sqoop import \
--connect jdbc:mysql://linux123:3306/sqoop \
--username hive --password 12345678 \
--table goodtbl \
--incremental append \
--hive-import \
--fields-terminated-by "\t" \
--hive-table mydb.goodtbl \
--check-column serialNumber \
--last-value 50 \
-m 1

        check-column:用来指定一些列(可以指定多个列),这些列在增量导入时用来检查这些数据是否作为增量数据进行导入,和关系型数据库中的自增字段及时间戳类似。这些被指定的列的类型不能使用任意字符类型,如char、varchar等类型都不可以。
        last-value:指定上一次导入中检查列指定字段最大值。

        3. 检查hive表中是否有数据

        4. 向MySQL 中加入1000条数据,编号从200开始: all batchInsertTestData(200, 1000); 

        5. 再次执行增量导入,将数据从MySQL导入Hive中;此时要将last-value改为100

sqoop import \
--connect jdbc:mysql://linux123:3306/sqoop \
--username hive --password 12345678 \
--table goodtbl \
--incremental append \
--hive-import \
--fields-terminated-by "\t" \
--hive-table mydb.goodtbl \
--check-column serialNumber \
--last-value 100 \
-m 1

        6. 检查hive表中是否有数据,有多少条数据。 

3.4 执行job 

        执行数据增量导入有两种实现方式:
                1. 每次手工配置last-value,收到调整。
                2. 使用job,给定初始last-value,定时任务每天定时调度。

        很明显使用2更方便:
        1. 创建口令文件
                echo -n "12345678" > sqoopPWD.pwd
                hdfs dfs -mkdir -p /sqoop/pwd
                hdfs dfs -put sqoopPWD.pwd /sqoop/pwd
                hdfs dfs -chmod 400 /sqoop/pwd/sqoopPWD.pwd
                # 可以在 sqoop 的 job 中增加:
                --password-file /sqoop/pwd/sqoopPWD.pwd

        2. 创建sqoop job

#创建sqoop job
sqoop job --create myjob1 -- import \
--connect jdbc:mysql://linux123:3306/sqoop?useSSL=false \
--username hive \
--password-file /sqoop/pwd/sqoopPWD.pwd \
--table goodtbl \
--incremental append \
--hive-import \
--hive-table mydb.goodtbl \
--check-column serialNumber \
--last-value 0 \
-m 1

# 查看已有的job
sqoop job --list
    
# 查看job的详细运行参数
sqoop job --show myjob1

# 执行job
sqoop job --exec myjob1

# 删除job
sqoop job --delete myjob1

        3. 执行job:sqoop job --exec myjob1

        4. 查看数据

        实现原理:因为job执行完成后,会把当前check-column的最大值记录到meta中,下次再调起时把此值赋给last-value。
        缺省情况下,元数据保存在 ~/.sqoop/
        其中,metastore.db.script文件记录了对last-value的更新操作。
               cat metastore.db.script |grep incremental.last.value

四、常用命令及参数

4.1 常用命令

        

4.2 常用参数

        所谓公用参数,就是大多数命令都支持的参数。

        1. 公用参数 - 数据库连接
        

        2. 公用参数 - import
        

         3. 公用参数 - export
        

         4. 公用参数 - hive
        

        5. import 参数
        
        

        6.  export参数
        

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/helloworld999999/article/details/121899570

智能推荐

unity:添加随机的游戏元素_unity引入随机模块-程序员宅基地

文章浏览阅读2k次,点赞6次,收藏8次。文章目录前言一、从数组选择随机项目二、用不同概率选择项目1.概率:2.随机排序:3.从一组项目中非重复选取:4.空间中的随机点:总结前言随机选取项目或值在很多游戏中非常重要。该部分说明如何使用 Unity 内置随机函数执行一些常见的游戏机制。一、从数组选择随机项目可随机挑选数组元素:1.是因为能够选择零到数组最大索引值(等于数组长度减去一)之间的随机整数。2.使用内置 Random.Range 函数就可轻松做到:var element = myArray[Random.Range(0, m._unity引入随机模块

【PTA练习】7-19 计算天数_ptapython计算天数-程序员宅基地

文章浏览阅读1.2k次。本题要求编写程序计算某年某月某日是该年中的第几天。输入格式:输入在一行中按照格式“yyyy/mm/dd”(即“年/月/日”)给出日期。注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。闰年的2月有29天。输出格式:在一行输出日期是该年中的第几天。输入样例1:2009/03/02结尾无空行输出样例1:61结尾无空行输入样例2:2000/03/02输出样例2:62#include <stdio.h> _ptapython计算天数

麒麟/Centos系统安装MySQL缺失libssl.so.10(libssl.so.10)(64bit)_libssl.so.10(libssl.so.10)(64bit) is needed by mys-程序员宅基地

文章浏览阅读1.4k次,点赞10次,收藏9次。安装Mysql的相关rpm包时,提示有如下依赖找不到,一定要下载相关的openssl安装包进行安装,.so、.so.3、.so.10都是不一样的包,切莫通过--nodeps --force等参数跳过依赖直接安装,治标不治本,后面还是会出问题的,建议都安装上。这时候一定要安装openssl10系列,如 compat-openssl10-1.0.2o-3.el8.aarch64.rpm,不要以为装过类似openssl-1.1.1f-4.p15.ky10.aarch64.rpm的包就万事大吉了。_libssl.so.10(libssl.so.10)(64bit) is needed by mysql-connector-odbc-8.0.33-1

css自定义设置浏览器(Webkit内核)滚动条样式_webkit scrollbar horizon-程序员宅基地

文章浏览阅读966次。一,常用属性。::-webkit-scrollbar{ } /*滚动条垂直方向的宽度与水平方向的高度,颜色*/::-webkit-scrollbar-button{ } /*滚动条按钮*/::-webkit-scrollbar-track{ } /*滚动条轨道*/::-webkit-scrollbar-track-piece{ } /*滚动条垂直方向轨道件*/ ::-webki..._webkit scrollbar horizon

C++程序设计初步——关系运算和逻辑运算_c++逻辑运算-程序员宅基地

文章浏览阅读3.4k次。关系运算和逻辑运算、判断闰年_c++逻辑运算

4.西游记中,3个徒弟,共同的方法(吃斋,念佛,取经),孙悟空自己的方法(除妖),猪八戒自己的方法(牵马),沙和尚自己的方法(挑行李)_唐僧师徒三人,他们共有技能吃斋、念经、取经外,孙悟空(sunwukong)独有技能除妖,猪-程序员宅基地

文章浏览阅读442次。package advance;abstract class Pupil{ public Pupil() { } public void eat(){ System.out.println("吃斋"); } public void speak(){ System.out.println("念佛"); } public void object(){ System.out.println("取经"); ._唐僧师徒三人,他们共有技能吃斋、念经、取经外,孙悟空(sunwukong)独有技能除妖,猪

随便推点

微信点餐小程序源码系统完整版分享带详细安装教程-程序员宅基地

文章浏览阅读475次,点赞11次,收藏8次。如今微信小程序系统的火爆程度已经不用多说了,要说哪个小程序最火爆,据统计业内对餐饮类小程序的需求一直居高不下,今天给大家带来最新力作外卖点餐小程序平台单店二合一自由切换商业运营版,这套系统功能非常强大,在支持常规餐饮小程序功能:点餐,外卖,付款,营销,会员卡,支付等基础功能和营销功能之外,还支持点餐小程序平台、单店自由切换功能,让商家无缝对接,自由切换,轻松管理,经营更高效更便捷,外卖、店内自由下单,助您轻松实现线上线下完美融合,此款为商业运营版用来构建智慧餐厅系统非常适合。_微信点餐小程序源码

python刷题-dp(最大正方形)+最大公约数问题_最大公约数 dp-程序员宅基地

文章浏览阅读767次。目录1.最简分数(公约数问题)2.最大正方形3.最小路径和4. 杨辉三角官方题解:(学学滚动数组的用法)1.最简分数(公约数问题)1447. 最简分数给你一个整数n,请你返回所有 0 到 1 之间(不包括 0 和 1)满足分母小于等于n的最简分数。分数可以以任意顺序返回。示例 1:输入:n = 2输出:["1/2"]解释:"1/2" 是唯一一个分母小于等于 2 的最简分数。示例 2:输入:n = 3输出:["1/2..._最大公约数 dp

Qt vs2010 中文 newline in constant_qt 中文 new line-程序员宅基地

文章浏览阅读843次。遇到奇葩的情况,vs2010 中写Qt 汉字字符有问题,而且是偶数个汉字没问题,奇数个就有问题。选中文件 file->advanced save option 选中 unicode 1200。_qt 中文 new line

linux开发环境工具_fedora安装kdbg-程序员宅基地

文章浏览阅读2.7k次。linux开发环境工具package: download from:软件集成开发环境(代码编辑、浏览、编译、调试)Emacs http://www.gnu.org/software/emacs/Source-Navigator 5.2b2 http://sourceforge.net/projects/sourcenavAnjuta _fedora安装kdbg

ElementUI表格行编辑单元格编辑支持(输入框,选择框)_elementui 行内编辑-程序员宅基地

文章浏览阅读1.5k次,点赞2次,收藏11次。1、普通版的table可编辑内嵌select选择框,输出框,编辑删除添加等<!DOCTYPE html><html><head> <meta charset="UTF-8"> <!-- import CSS --> <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css"> <!_elementui 行内编辑

在Windows基于anaconda的python3.6环境下安装用于语音信号处理的库librosa_python 3.6 安装librosa-程序员宅基地

文章浏览阅读4.1k次。在Windows基于anaconda的python3.6环境下安装用于语音信号处理的库librosa1 初始环境安装anaconda的方法与windows上安装普通软件没有区别,下载安装包安装即可,其中包括python环境以及众多python的库,包括numpy等。安装完之后包括以下内容:之后可以在Anaconda Prompt(与cmd、powershell类似)中使用pip安装想用的其他库,包括_python 3.6 安装librosa