大数据专栏 | ||
---|---|---|
上一篇 | 主目录 | 下一篇 |
目录
【前言】
注意以下的导入【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 的写入性能。