一、Sqoop介绍:数据迁移工具

Sqoop用于在Hadoop(HDFS)和关系型数据库之间,进行数据的迁移。
Sqoop的导入:将关系型数据库中的数据导入到HDFS中
Sqoop的导出:将HDFS的数据导出到关系型数据中
本质:将导入或导出命令翻译成 MapReduce 程序来实现
在翻译出的 MapReduce 中主要是对 InputFormat 和 OutputFormat 进行定制

二、Sqoop安装:

1、上传、解压、配置profile并刷新

2、进入到 conf 文件夹,找到 sqoop-env-template.sh
复制并修改其名称为 sqoop-env.sh 修改 sqoop-env.sh 文件中文件路径

#Set path to where bin/hadoop is available

export HADOOP_COMMON_HOME=/opt/hadoop-2.7.3
    
#Set path to where hadoop-*-core.jar is available
    		export HADOOP_MAPRED_HOME=/opt/hadoop-2.7.3

#set the path to where bin/hbase is available
		export HBASE_HOME=/opt/hbase-1.2.6  

#Set the path to where bin/hive is available
		export HIVE_HOME=/opt/apache-hive-1.2.2

#Set the path for where zookeper config dir is
		export ZOOCFGDIR=/opt/zookeeper-3.4.14

3、加入 mysql 驱动包到 sqoop1.4.7/lib 目录下

三、Sqoop基本指令:

1.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

2.sqoop help -查看某一具体指令

eg : sqoop help import 
……

3、查看数据库列表

sqoop-list-databases \
--connect jdbc:mysql://localhost:3306 \
--username root \
--P

4、查看表

sqoop list-tables \
 --connect jdbc:mysql://localhost:3306/mysql \
 --username root \
 --P

5、创建与mysql中test表相同的hive表hive_test:

sqoop create-hive-table \
--connect jdbc:mysql://hadoop1:3306/mysql \
--username root \
--P \
--table test \
--hive-table hive_test

四、Sqoop导入

连接windows数据库需要:开启远程访问、使用ipconfig中的ip、开启3306端口
1.简单导入
eg1:全部导入
use xzdb
select * from article

sqoop import \
--connect jdbc:mysql://192.168.56.1:3306/xzdb \
--username root \
--P \
--table hero \
--target-dir /sqoop/test \
[-m 1]

eg2:带条件导入
use xzdb
select * from hero where name = ‘name1’

sqoop import \
--connect jdbc:mysql://192.168.56.1:3306/xzdb \
--username root \
--P  \
--table hero \
--where 'name = "name1"' \
--target-dir /sqoop/hero1 -m 1

eg3:带条件导入列

sqoop import \
--connect jdbc:mysql://192.168.56.1:3306/xzdb \
--username root \
--P  \
--table hero \
--columns 'name' \
--where 'name = "name1"' \
--target-dir /sqoop/hero2 -m 1

eg4:自定义导入

sqoop import \
--connect jdbc:mysql://192.168.56.1:3306/xzdb \
--username root \
--P  \
--query 'select * from hero where $CONDITIONS and id > 6150' \
--target-dir /sqoop/hero -m 1 
注:
1、自定义的SQL语句中必须带有WHERE $CONDITIONS
2、外层使用单引号,内层使用双引号,$CONDITIONS的$符号不用转义

控制参数:
–table 指定要导入的表
–target-dir 指定目录路径(HDFS)
–columns “id,name,age” 指定要导入的字段
-m 指定mapper任务数量 默认4
–split-by column 通常和–m一起使用,用于并行导入
–where 指定要导入哪些行记录
–query 可以导入SQL的执行结果(不能使用–table --columns参数)

2.增量导入:
1、导入原始数据

sqoop import \
--connect jdbc:mysql://192.168.56.1:3306/xzdb \
--username root --P  \
--query 'select * from hero where $CONDITIONS' \
--target-dir /sqoop/hero
-m 1

2、增添数据后:

sqoop import \
--connect jdbc:mysql://192.168.56.1:3306/xzdb \
--username root --P  \
--query 'select * from hero where $CONDITIONS' \
--incremental append \     --指定增量导入方式
--check-column id \		   --指定检查列
--last-value 6193 \		   --上次导入时检查列的最大值
--target-dir /sqoop/hero
-m 1

五、Mysql导入Hive

1.简单导入

sqoop import   \
--connect jdbc:mysql://192.168.56.1:3306/xzdb   \
--username root  \
--P  \
--table hero   \
--hive-import \
-m 1

注:org.apache.hadoop.hive.conf.HiveConf. Make sure HIVE_CONF_DIR is set correctly
将hive 里面的lib下的hive-exec-**.jar hive-common-*.jar 放到sqoop 的lib

sqoop import  \
--connect jdbc:mysql://192.168.56.1:3306/xzdb  \
--username root  \
--P  \
--table hero  \
--fields-terminated-by "\t"  \
--lines-terminated-by "\n"  \
--hive-import  \
--hive-overwrite  \
--create-hive-table  \
--delete-target-dir \
--hive-database  test \
--hive-table hero

导入过程:
-导入hero表到hdfs的默认路径 (/usr/root/表名)
-通过hdfs导入到hive表中
-自动删除hdfs中数据

2.增量导入
需要清空hive表重新导入 truncate table xxx

六、Mysql导入Hbase

eg:普通导入

sqoop import \
--connect jdbc:mysql://192.168.56.1:3306/xzdb \
--username root \
--P \
--table hero \
--hbase-table hero \
--column-family data \
--hbase-row-key id

注:
导入前需要先建表
–hbase-table hbase表名
–column-family 列族名
–hbase-row-key 对应行键

七、Sqoop导出:

将HDFS中数据导出到关系型数据库中。
要求目标表已经在数据库中
若表为空,则会将操作转换为insert语句
否则转变为update语句
必须确保在导出数据的时候,主键唯一。

sqoop export
参数:
–connect
–username
–P
–table 将HDFS中数据导出到指定表中
–columns<col1,col2> 按照数据顺序,将数据导入到指定列中
–export-dir 指定HDFS的原文件存储路径
–update-key 更新的列
–update-mode 更新模式:updateonly,allowinsert

eg:导入 1,xxx,123 (注意数据格式)

sqoop export \
--connect jdbc:mysql://192.168.56.1:3306/xzdb \
--username root \
--P \
--table usr \
--export-dir /sqoop/data \
--columns "id,name,pwd" \
-m 1

eg.增量导出 添加 2,yyy,234 后

sqoop export \
--connect jdbc:mysql://192.168.56.1:3306/xzdb \
--username root \
--P \
--table usr \
--export-dir /sqoop/data \
--update-key id \
--update-mode allowinsert \
--columns "id,name,pwd" \
-m 1