一:sqoop简介:
Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql…)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。

这里需要了解一下关于的导入数据和导出数据的概念。
导入数据(import):从非大数据集群(mysql,sql Server)向大数据集群(HDFS,HIVE,HBASE)中传输数据。
导出数据(export): 从大数据集群(HDFS,HIVE,HBASE)向非大数据集群(RDBMS)中传输数据。

二:sqoop的安装
1.将/opt/oftware下的tar包解压到/opt/module下
这里我使用的是1.4.6版本,尽量不要下载1.99系列版本的,因为官网明确表示1.99.7与1.4.7不兼容,而且功能不完整,它不适用于生产部署

sqoop和hadoop版本配套表 sqoop安装到hadoop集群_hadoop

tar -zxvf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz -C /opt/module/

2.进入module目录,将sqoop-1.4.6.bin__hadoop-2.0.4-alpha目录名字修改为sqoop

mv sqoop-1.4.6.bin__hadoop-2.0.4-alpha/   sqoop

3.将/opt/module/sqoop/conf下的sqoop-env-template.sh修改为sqoop-env.sh,然后在将如下内容添加到这个文件的最后一行后保存退出(类似于hadoop,zk的安装目录可根据自己实际安装的路径调整)。

mv sqoop-env-template.sh sqoop-env.sh
export HADOOP_COMMON_HOME=/opt/module/hadoop-2.7.2
export HADOOP_MAPRED_HOME=/opt/module/hadoop-2.7.2
export HIVE_HOME=/opt/module/hive
export ZOOKEEPER_HOME=/opt/module/zookeeper-3.4.10
export ZOOCFGDIR=/opt/module/zookeeper-3.4.10
export HBASE_HOME=/opt/module/hbase

4.将mysql-connector-java-5.1.27-bin.jar这个jar包拷贝到sqoop的lib目录下,r如果没有这个jar包的话去网上下载一个,基本上5.x版本的都可以

[root@hadoop102 sqoop]# cp /opt/software/mysql-libs/mysql-connector-java-5.1.27/mysql-connector-java-5.1.27-bin.jar ./lib/

以上就是sqoop的安装全过程,这时我们去验证一下sqoop的配置是否正确
执行[root@hadoop102 sqoop]# bin/sqoop help

[root@hadoop102 sqoop]# bin/sqoop help
Warning: /opt/module/sqoop/bin/../../hcatalog does not exist! HCatalog jobs will fail.
Please set $HCAT_HOME to the root of your HCatalog installation.
Warning: /opt/module/sqoop/bin/../../accumulo does not exist! Accumulo imports will fail.
Please set $ACCUMULO_HOME to the root of your Accumulo installation.
20/07/30 19:14:15 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6
usage: sqoop COMMAND [ARGS]

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.
[root@hadoop102 sqoop]#

上述的warning可以忽略,出现上述的内容说明我们的sqoop已经安装和配置成功。

测试Sqoop是否能够成功连接数据库,注意mysql的密码根据自己的设置,然后我的主机名是hadoop102

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

sqoop和hadoop版本配套表 sqoop安装到hadoop集群_sqoop_02

出现以上内容说明Sqoop是能够成功连接数据库。

三:sqoop的简单使用:
在使用之前我们先在mysql中创建一个数据库,然后在这个数据库中创建一个表并添加相关的内容。
mysql -uroot -p123456
mysql> create database company;
mysql> create table company.staff(id int(4) primary key not null auto_increment, name varchar(255), sex varchar(255));
mysql> insert into company.staff(name, sex) values(‘Thomas’, ‘Male’);
mysql> insert into company.staff(name, sex) values(‘Catalina’, ‘FeMale’);

1.mysql的数据导入到HDFS(这里需要先启动hadoop)

1).全部导入(这里的\是换行符的意思,因为都写在一行可读性会很差,下同)

参数解读:
username :mysql连接的用户名
password :mysql的密码
table: 要导入哪一张表的数据
target-dir:显示指定数据导入到HDFS中的位置,默认保存路径为:/user/{当前用户}/{表名}/表数据文件
delete-target-dir:如果导入时需要将已存在的HDFS文件删除则可以使用delete参数。

bin/sqoop import \
--connect jdbc:mysql://hadoop102:3306/company \
--username root \
--password 123456 \
--table staff \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t"

执行完以后我们在/user/company目录下可以发现生成了part-m-00000这个文件,我们将文件下载到本地可以看到文件已经按照 ‘\t’ 分割

sqoop和hadoop版本配套表 sqoop安装到hadoop集群_sqoop_03

2)查询导入:
query:既可以select,又可以在sql语句中加入where子句
$CONDITIONS的意思是维持导入的顺序不变,这个关键字一定要加上。

bin/sqoop import \
--connect jdbc:mysql://hadoop102:3306/company \
--username root \
--password 123456 \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--query 'select name,sex from staff where id <=1 and $CONDITIONS;'

下载生成的文件可以看到已经按照预期输出

sqoop和hadoop版本配套表 sqoop安装到hadoop集群_sqoop_04

3).导入指定列

注意:columns中如果涉及到多列,用逗号分隔,分隔时不要添加空格

bin/sqoop import \
--connect jdbc:mysql://hadoop102:3306/company \
--username root \
--password 123456 \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--columns id,sex \
--table staff

sqoop和hadoop版本配套表 sqoop安装到hadoop集群_sqoop_05


4).使用sqoop关键字筛选查询导入数据

bin/sqoop import \
--connect jdbc:mysql://hadoop102:3306/company \
--username root \
--password 123456 \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--table staff \
--where "id=1"

sqoop和hadoop版本配套表 sqoop安装到hadoop集群_hadoop_06

2.mysql数据导入到hive中
*这里导入到hive中直接在命令行中写上表名,不需要在hive中手动的创建一个表。
*该过程分为两步,第一步将数据导入到HDFS,第二步将导入到HDFS的数据迁移到Hive仓库,第一步默认的临时目录是/user/root/表名

bin/sqoop import \
--connect jdbc:mysql://hadoop102:3306/company \
--username root \
--password 123456 \
--table staff \
--num-mappers 1 \
--hive-import \
--fields-terminated-by "\t" \
--hive-overwrite \
--hive-table staff_hive

sqoop和hadoop版本配套表 sqoop安装到hadoop集群_sqoop_07

3.mysql的数据导入到hbase
–hbase-create-table:如果指定,则创建缺少的HBase表,(值得注意的是由于mysql和hbase版本不兼容的问题,本身可以由命令创建表的,现在需要我们手动的在hbase中创建一个表)
–split-by:用于拆分工作单位的表的列

bin/sqoop import \
--connect jdbc:mysql://hadoop102:3306/company \
--username root \
--password 123456 \
--table staff \
--columns "id,name,sex" \
--column-family "info" \
--hbase-create-table \
--hbase-row-key "id" \
--hbase-table "hbase_company" \
--num-mappers 1 \
--split-by id

这里在scan一下hbase中的表发现数据已经导入进来了

sqoop和hadoop版本配套表 sqoop安装到hadoop集群_mysql_08

数据的导出(export),注意导出的时候是不支持hbase导出到mysql的,支持hive或者hadoop导出到mysql.
注意:这里一定要加上分隔符

bin/sqoop export \
--connect jdbc:mysql://hadoop102:3306/company \
--username root \
--password 123456 \
--table staff1 \
--num-mappers 1 \
--export-dir /user/hive/warehouse/staff_hive \
--input-fields-terminated-by "\t"

注意Mysql中如果表不存在,不会自动创建
这里我想把数据导出到mysql中的staff1表中,但是staff1表并没有创建,所以会报下面的错误。

sqoop和hadoop版本配套表 sqoop安装到hadoop集群_mysql_09

当我再次创建表以后然后执行语句可以看到数据已经从hive中导入到了mysql

sqoop和hadoop版本配套表 sqoop安装到hadoop集群_mysql_10