sqoop

大数据专栏
上一篇主目录 下一篇

【前言】
注意以下的导入【sqoop import \】导出【sqoop export \】\前面有一个空格


1 简介

sqoop 是 apache 旗下一款“Hadoop 和关系数据库之间传送数据”的工具
在这里插入图片描述
导入数据:MySQL,Oracle 导入数据到 Hadoop 的 HDFS、HIVE、HBASE 等数据存储系统
导出数据:从 Hadoop 的文件系统中导出数据到关系数据库 mysql 等

工作机制
将导入或导出命令翻译成 MapReduce 程序来实现
在翻译出的 MapReduce 中主要是对 InputFormat 和 OutputFormat 进行定制

2 安装

安装 Sqoop 的前提是已经具备 Java 和 Hadoop 的环境

1、 准备安装包 sqoop-1.4.6.bin_hadoop-2.0.4-alpha.tar.gz
2、 解压安装包到安装目录

tar -zxvf sqoop-1.4.6.bin_hadoop-2.0.4-alpha.tar.gz -C apps/
cd apps
mv sqoop-1.4.6.bin_hadoop-2.0.4-alpha/ sqoop-1.4.6

3、 进入到 conf 文件夹,找到 sqoop-env-template.sh,修改其名称为 sqoop-env.sh

mv sqoop-env-template.sh sqoop-env.sh

4、 修改 sqoop-env.sh

export HADOOP_COMMON_HOME=/home/hadoop/apps/hadoop-2.7.3
export HADOOP_MAPRED_HOME=/home/hadoop/apps/hadoop-2.7.3
#export HBASE_HOME=/home/hadoop/apps/hbase-1.2.6
export HIVE_HOME=/home/hadoop/apps/apache-hive-2.3.2-bin
#export ZOOCFGDIR=/home/hadoop/apps/zookeeper-3.4.10/conf

zookeeper 和 hbase 没有安装。那就不用管了。如果也安装的有,并且要使用,那么就给配置上
5、 加入 mysql 驱动包到 sqoop1.4.6/lib 目录下

cp mysql-connector-java-5.1.40-bin.jar apps/sqoop-1.4.6/lib/

6、 配置系统环境变量
vi ~/.bashrc
然后输入:

export SQOOP_HOME=/home/hadoop/apps/sqoop-1.4.6
export PATH=$PATH:$SQOOP_HOME/bin

然后保存退出

source ~/.bashrc

7、 验证安装是否成功

sqoop-version 

出现如图所示画面,证明安装成功,那么接下来就可以正常使用了
在这里插入图片描述

3 使用

使用 sqoop help 来查看,sqoop 支持哪些命令

Available commands:
  codegen            Generate code to interact with database records
  create-hive-table  Import a table definition into Hive
  eval               Evaluate a SQL statement and display the results
  export             Export an HDFS directory to a database table
  help               List available commands
  import             Import a table from a database to HDFS
  import-all-tables  Import tables from a database to HDFS
  import-mainframe   Import datasets from a mainframe server to HDFS
  job                Work with saved jobs
  list-databases     List available databases on a server
  list-tables        List available tables in a database
  merge              Merge results of incremental imports
  metastore          Run a standalone Sqoop metastore
  version            Display version information

See 'sqoop help COMMAND' for information on a specific command.

3.1 查询

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

在这里插入图片描述

[hadoop@hadoop05 ~]$ sqoop list-tables --connect jdbc:mysql://localhost:3306/azkaban --username root --password 123456

在这里插入图片描述

创建一张跟mysql中的help_keyword表一样的hive表hk:
(没有指定hive数据库,默认为default。若需要指定,在表hk前面加上[数据库名.],例如:temp_db.hk)

[hadoop@hadoop05 ~]$ sqoop create-hive-table --connect jdbc:mysql://localhost:3306/mysql --username root --password 123456 --table help_keyword --hive-table hk

3.2 MySQL 导入 到hadoop

(以hadoop为‘自我’,hive是hadoop的生态产品,从MySQL到hive叫导入。反之,叫导出)

3.2.1 MySQL普通导入到hive

Sqoop 导入关系型数据到 hive 的过程是先导入到 hdfs,然后再 load 进入 hive
-m 1 :是指定map的任务数为1

sqoop import \
--connect jdbc:mysql://localhost:3306/mysql \
--username root \
--password 123456 \
--table help_keyword \
--hive-import \
-m 1

这个将本地hadoop05的MySQL数据库中数据库名为mysql的名为help_keyword的表的数据导入到hive默认的数据库default,创建同名的表help_keyword并导入数据。【hive-import关键字
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
或者这样写:

sqoop import \
--connect jdbc:mysql://localhost:3306/mysql \
--username root \
--password 123456 \
--table help_keyword \
--fields-terminated-by "\t" \
--lines-terminated-by "\n" \
--hive-import \
--hive-overwrite \
--create-hive-table \
--hive-table temp_db.help_keyword \
--delete-target-dir

注意:表会自动创建,但是库不会。所以在执行该语句之前,一定要确保 hive 的数据库temp_db是存在的,否则程序会报错
在这里插入图片描述
在这里插入图片描述

3.2.2 MySQL增量导入到hdfs

增量导入是仅导入表中新添加的行的技术。
它需要添加 ‘incremental’ , ‘check-column’, 和 ‘last-value’ 选项来执行增量导入。

sqoop import \
--connect jdbc:mysql://localhost:3306/mysql \
--username root \
--password 123456 \
--table help_keyword \
--target-dir /user/hive/warehouse/sqoop_import \
--incremental append \
--check-column help_keyword_id \
--last-value 500 \
-m 1

【注】这里是导入到hdfs集群中,没有创建hive表(create-hive-table),在hive数据仓库中没有创建相应的表格
在这里插入图片描述
数据都是从500开始
在这里插入图片描述

3.2.3 MySQL导入到HBase

3.3 从hadoop导出到MySQL

注意:导出前,目标表必须存在于目标数据库中。

export 主要参数
--direct 快速导入
--export-dir <dir> HDFS 到处数据的目录
-m,--num-mappers <n> 都少个 map 线程
--table <table-name> 导出哪个表
--call <stored-proc-name> 存储过程
--update-key <col-name> 通过哪个字段来判断更新
--update-mode <mode> 插入模式,默认是只更新,可以设置为 allowinsert.
--input-null-string <null-string> 字符类型 null 处理
--input-null-non-string <null-string> 非字符类型 null 处理
--staging-table <staging-table-name> 临时表
--clear-staging-table 清空临时表
--batch 批量模式

3.3.1 从HDFS导出到MySQL

要导出的数据:
在这里插入图片描述
在mysql数据库中创建相应的表格

create database sqoopdb default character set utf8 COLLATE utf8_general_ci;
use sqoopdb;
CREATE TABLE sqoopstudent ( 
 id INT NOT NULL PRIMARY KEY, 
 name VARCHAR(20), 
 sex VARCHAR(20),
 age INT,
department VARCHAR(20)
)character set utf8 collate utf8_general_ci;

在这里插入图片描述
执行导出(在shell):

sqoop export \
--connect "jdbc:mysql://localhost:3306/sqoopdb?useUnicode=true&characterEncoding=utf-8" \
--username root \
--password 123456 \
--table sqoopstudent \
--export-dir /sqoopdata \
--fields-terminated-by ',';

查看结果:

在这里插入图片描述

中文乱码的解决方案

3.3.1 从Hive导出到MySQL

找到hive表的目录,将文件导入mysql

CREATE TABLE sqooptest( 
 id INT NOT NULL PRIMARY KEY, 
 name VARCHAR(20), 
 state VARCHAR(20),
 city VARCHAR(20),
 age INT
);
sqoop export \
--connect jdbc:mysql://localhost:3306/sqoopdb \
--username root \
--password 123456 \
--table sqooptest \
--export-dir /user/hive/warehouse/temp_db.db/test \
--input-fields-terminated-by ',';

在这里插入图片描述

3.3.1 从HBase导出到MySQL

4 sqoop原理

4.1 导入原理

sqoop 工具是通过 MapReduce 进行导入作业的。总体来说,是把关系型数据库中的某张表的一行行记录都写入到 hdfs
在这里插入图片描述

第一步,Sqoop 会通过 JDBC 来获取所需要的数据库元数据,例如,导入表的列名,数据类型等。
第二步,这些数据库的数据类型(varchar, number 等)会被映射成 Java 的数据类型(String, int等),根据这些信息,Sqoop 会生成一个与表名同名的类用来完成序列化工作,保存表中的每一行记录。(每一行就是一个实例对象)
第三步,Sqoop 启动 MapReducer 作业
第四步,启动的作业在 input 的过程中,会通过 JDBC 读取数据表中的内容,这时,会使用 Sqoop 生成的类进行反序列化操作
第五步,最后将这些记录写到 HDFS 中,在写入到 HDFS 的过程中,同样会使用 Sqoop 生成的类进行反序列化

4.2 导出原理

在这里插入图片描述
详细文字描述:
第一步,sqoop 依然会通过 JDBC 访问关系型数据库,得到需要导出数据的元数据信息
第二步,根据获取到的元数据的信息,sqoop 生成一个 Java 类,用来进行数据的传输载体。该类必须实现序列化和反序列化
第三步,启动 mapreduce 作业
第四步,sqoop 利用生成的这个 java 类,并行的从 hdfs 中读取数据
第五步,每个 map 作业都会根据读取到的导出表的元数据信息和读取到的数据,生成一批 insert 语句,然后多个 map 作业会并行的向数据库 mysql 中插入数据所以,数据是从 hdfs 中并行的进行读取,也是并行的进入写入,那并行的读取是依赖 hdfs的性能,而并行的写入到 mysql 中,那就要依赖于 mysql 的写入性能。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值