Sqoop的简单使用
1、Sqoop的介绍
Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、oracle…)间进行数据的传递,可以将一个关系型数据库中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。一般情况下,是将数据分析的结果导出到关系型数据库中。
2、Sqoop的安装步骤
Sqoop选择版本sqoop-1.4.5-cdh5.3.6,安装步骤如下:
- 下载:wget http://archive.cloudera.com/cdh5/cdh/5/sqoop-1.4.5-cdh5.3.6.tar.gz
- 解压,sqoop根目录为:~/bigdater/sqoop-1.4.5-cdh5.3.6
- 复制相关的依赖包到lib文件夹中。
copy mysql的驱动类到lib文件夹中
cp ~/bigdater/hive-0.13.1-cdh5.3.6/lib/mysql-connector-java-5.1.31.jar ./lib/
或者
cp ~/bigdater/softs/mysql-connector-java-5.1.31.jar ./lib/
copy hadoop的hadoop-common-2.5.0-cdh5.3.6.jar hadoop-hdfs-2.5.0-cdh5.3.6.jar hadoop-mapreduce-client-core-2.5.0-cdh5.3.6.jar三个jar到lib文件夹中。
cp ~/bigdater/hadoop-2.5.0-cdh5.3.6/share/hadoop/common/hadoop-common-2.5.0-cdh5.3.6.jar ./lib/
cp ~/bigdater/hadoop-2.5.0-cdh5.3.6/share/hadoop/hdfs/hadoop-hdfs-2.5.0-cdh5.3.6.jar ./lib/
cp ~/bigdater/hadoop-2.5.0-cdh5.3.6/share/hadoop/mapreduce/hadoop-mapreduce-client-core-2.5.0-cdh5.3.6.jar ./lib/
- 修改conf/sqoop-env.sh文件。
将sqoop下conf中的sqoop-env-template.sh复制命名为sqoop-env.sh,配置sqoop-env
vim conf/sqoop-env.sh
配置hadoop相关的根目录到sqoop中,内容如下:
export HADOOP_COMMON_HOME=/home/hadoop/bigdater/hadoop-2.5.0-cdh5.3.6
export HADOOP_MAPRED_HOME=/home/hadoop/bigdater/hadoop-2.5.0-cdh5.3.6
export HBASE_HOME=/home/hadoop/bigdater/hbase-0.98.6-cdh5.3.6
export HIVE_HOME=/home/hadoop/bigdater/hive-0.13.1-cdh5.3.6
- 添加sqoop常量到用户环境变量中去
vim ~/.bash_profile
在最后添加内容(如下):
###### sqoop
export SQOOP_HOME=/home/hadoop/bigdater/sqoop-1.4.5-cdh5.3.6
export PATH=$PATH:$SQOOP_HOME/bin
退出保存后执行命令source ~/.bash_profile
- 测试是否安装成功
测试是否安装成功sqoop version
3、Sqoop命令介绍
Sqoop总共有14个命令,包括:codegen,create-hive-table, eval, export, help, import, import-all-tables, import-mainframe, job, list-databases, list-tables, merge, metastore, version。
其中常用命令为create-hive-table, export, import, help
等。
sqoop命令格式:sqoop <command> <generic-options> <command-options>
,也就是说sqoop的所有命令有公用的参数列表,除此之外每个命令都有自己特定的执行参数。
help
命令主要作用是查看sqoop提供的帮助信息,命令格式如下:sqoop help [<command>]
。help后面的参数为sqoop支持的命令名称。如果不给定help后面的参数,那么表示显示sqoop命令的帮助信息,如果给定后面的参数,那么表示显示具体sqoop命令的帮助信息。
实例:
1. sqoop help
2. sqoop help list-tables
list-tables
和list-databases
两个命令都是针对关系型数据库(可以通过jdbc连接的数据库/数据仓库)而言的,我们一般可以通过该命令查看对应数据库中的table&database
的列表。基本命令格式为: sqoop (list-tables|list-databases) --connect jdbc_url --username user_name --password user_pwd
实例:
sqoop list-tables --connect jdbc:mysql://hh:3306/hive --username hive --password hive
sqoop list-databases --connect jdbc:mysql://hh:3306/hive --username hive --password hive
create-hive-table
命令根据关系型数据库中的表创建hive表,不进行数据的copy,只进行表结构的copy。如果hive中存在要创建的表,默认情况下不进行任何操作。命令格式:sqoop create-hive-table --connect jdbc_url --username db_name --password db_pwd --table db_table_name --hive-table hive_table_name
实例:
sqoop create-hive-table --connect jdbc:mysql://hh:3306/test --username hive --password hive --table test --hive-table hivetest
import
命令的主要作用是将关系型数据库中的数据导入到hdfs文件系统中(或者hbase/hive
中),不管是导入到hbase还是导入到hive中,都需要先导入到hdfs中,然后再导入到最终的位置。一般情况下,只会采用将关系型数据库的数据导入到hdfs或者hive中,不会导入到hbase中。import命令导入到hdfs中默认采用','
进行分割字段值,导入到hive中默认采用'\u0001'
来进行分割字段值,如果有特殊的分割方式,我们可以通过参数指定。
import命令导入到hive的时候,会先在/user/${user.name}/
文件夹下创建一个同关系型数据库表名的一个文件夹作为中转文件夹,如果该文件夹存在,则报错。可以通过命令sqoop help import查看import命令的帮助信息。
实例:
案例1:将mysql表test中的数据导入hive的hivetest表,hive的hivetest表不存在。
sqoop import --connect jdbc:mysql://hh:3306/test --username hive --password hive --table test --hive-table hivetest --hive-import -m 1
案例2:在案例1的基础上,分别进行overwrite(覆盖)导入和into(直接加入)导入。
into: 命令同案例1
overwrite:
sqoop import --connect jdbc:mysql://hh:3306/test --username hive --password hive --table test --hive-table hivetest --hive-import -m 1 --hive-overwrite
案例3:在案例2的基础上,通过增加mysql的test表数据,增量导入到hive表中。
sqoop import --connect jdbc:mysql://hh:3306/test --username hive --password hive --table test --where "id>9" --hive-table hivetest --hive-import -m 1
或者
sqoop import --connect jdbc:mysql://hh:3306/test --username hive --password hive --table test --query "select id,name from test where id>9" --hive-table hivetest --hive-import -m 1
案例4:将test表中的数据导出到使用','分割字段的hive表(hivetest2)中。
创建表: create table hivetest2(id int,name string) row format delimited fields terminated by ',';
sqoop:
sqoop import --connect jdbc:mysql://hh:3306/test --username hive --password hive --table test --hive-table hivetest2 --hive-import -m 1 --fields-terminated-by ","
案例5:将test表的数据导入到hdfs中。
sqoop import --connect jdbc:mysql://hh:3306/test --username hive --password hive --table test --target-dir /test -m 1
案例6:在案例5的基础上,增量导入数据到hdfs中。
sqoop import --connect jdbc:mysql://hh:3306/test --username hive --password hive --table test --target-dir /test -m 1 --check-column id --incremental append --last-value 11
export
命令的主要作用是将hdfs文件数据导入到关系型数据库中,不支持从hive和hbase中导出数据,但是由于hive的底层就是hdfs的一个基本文件,所以可以将hive导出数据转换为从hdfs导出数据。导出数据的时候,默认字段分割方式是','
,所以如果hive的字段分割不是','
,那么就需要设计成对应格式的分割符号。可以通过命令:sqoop help export
查看export
命令的详细参数使用方式&各个参数的含义。
注意:前提条件,关系型数据库中目的表已经存在。
实例:
案例1:将hdfs上的文件导出到关系型数据库test2表中。
sqoop export --connect jdbc:mysql://hh:3306/test --username hive --password hive --table test2 --export-dir /test
案例2:将hive表(hivetest)数据导出到关系型数据库test2表中(使用insertOrUpdate方法导入)。
hivetest表只留id为1,2,3,4,5的数据,其他数据删除。
hivetest表分隔方式是'\u0001',但是export命令默认使用','分隔数据
sqoop export --connect jdbc:mysql://hh:3306/test --username hive --password hive --table test2 --export-dir /hive/hivetest --input-fields-terminated-by "\\01" --update-mode allowinsert --update-key id
下一篇: iis 添加新的.shtml的影射