Sqoop介绍

sqoop参数的传递方式

sqooop中的参数分为两种一种是工具自己的参数,另外一种是和hadoop相关的参数。hadoop相关参数(-conf, -D等)需要放置在工具名字(import,export等)之后,工具参数之前。hadoop参数以(-)开头,工具参数以(--)开头。如果工具参数是一个大写字母也用(-)开头比如-P。
直接传递
sqoop import - -connect jdbc:mysql://localhost/db - -username foo - -table TEST
使用文件传递
sqoop - -options-file /users/homer/work/import.txt - -table TEST
import.txt

# 
# Options file for Sqoop import
# 
# Specifies the tool being invoked

import

# Connect parameter and value
--connect
jdbc:mysql://localhost/db

# Username parameter and value
--username
foo
# 
# Remaining options should be specified in the command line.
#

注释需要在单独的一行,sqoop会把文件里的内容解析出来去掉注释和空行,原封不动的替换到- -options-file的位置

import
import将table从RDBMS导出到HDFS上

连接数据库相关参数:

参数 描述
--connect Specify JDBC connect string
--connection-manager Specify connection manager class to use
--driver Manually specify JDBC driver class to use

例子:

sqoop import \
--driver com.mysql.jdbc.Driver \ --connect jdbc:mysql://localhost/loudacre \ --username cloudera --password cloudera \ --table accounts \ --split-by acct_num \ --target-dir sqoop/accounts

数据库密码相关

参数 描述
--password-file Set path for a file containing the authentication password
-P Read password from console
--password Set authentication password
--username Set authentication username
--verbose Print more information while working
--connection-param-file Optional properties file that provides connection parameters

例子:

sqoop import --connect jdbc:mysql://database.example.com/employees \
    --username venkatesh --password-file ${user.home}/.password

数据查询方式

一般查询

sqoop import  
--connect jdbc:mysql://database.example.com/employees --direct --username xyz --password xyz --table customers --columns cust_id, name, address, date, history, occupation --where "item>=1234" --target-dir /tmp/customers --m 8 --split-by cust_id --fields-terminated-by , --escaped-by \ --map-column-java   cust_id=string, name=string, address=string, date=string, history=string, occupation=string

说明:
--direct 一般来说从RDBMS导出数据是用MR,如果指定该参数会尝试使用数据库特定的迁移工具,这样做可能会更加高效
--table 指定那个table
--columns 指定那些columns需要导出
--where 指定条件
--target-dir 指定存储目录
--m 8 设置并发度,也就是有多少个map一起执行
--split-by 依据这个字段将数据分成多少份,份数由--m决定
--fields-terminated-by columns分隔符
--escaped-by 设置转义字符
--map-column-java 字段转换格式定义

自由sql查询

sqoop import \
  --query 'SELECT a.*, b.* FROM a JOIN b on (a.id == b.id) WHERE $CONDITIONS' \
  --split-by a.id --target-dir /user/foo/joinresults
说明:

1.$CONDITIONS

如果使用并行的方式importmap任务将会使用不同的条件替换掉这个内容,比如一个map执行SELECT a., b. FROM a JOIN b on (a.id == b.id) WHERE a.id>0 and a.id<10 另外一个执行行SELECT a., b. FROM a JOIN b on (a.id == b.id) WHERE a.id>10 and a.id<20。这样做的好处是不用解析sql语法树就可以替换掉相应内容

数据类型转换

Argument Description
--map-column-java < mapping> Override mapping from SQL to Java type for configured columns.
--map-column-hive < mapping> Override mapping from SQL to Hive type for configured columns.

sqoop import ... - -map-column-java id=String,value=Integer

Import to Hive

数据会被先导入到HDFS中然后在HDFS中通过LOAD DATA INPATH进入hive,会把HDFS那个目录move进hive里面去,所以就算指定了- -target-dir也看不到这个目录。为了防止有其他数据被move进去所以每次需要指定- -delete-target-dir

sqoop import \
--connect jdbc:oracle:thin:@MSI:1521/study \ --username luo \ --password Sys_20170929\ --table TB_NEWS\ --fields-terminated-by "\001"\ --lines-terminated-by "\n"\ --hive-import\ --hive-overwrite\ --null-string ""\ --null-non-string ""\ --fetch-size 1000 -m 3\ --create-hive-table \ --hive-table luoqi_test.TB_NEWS\ --delete-target-dir 
说明: 
--hive-import 说明导入的数据是到hive中,将会使用hive默认的分割符

表格创建相关

Argument Description
--hive-overwrite Overwrite existing data in the Hive table.
--create-hive-table If set, then the job will fail if the target hivetable exists. By default this property is false.
--hive-table < table-name>Sets the table name to use when importing to Hive.

hive分割符相关

Argument Description
--hive-drop-import-delims Drops \n, \r, and \01 from string fields when importing to Hive.
--hive-delims-replacement Replace \n, \r, and \01 from string fields with user defined string when importing to Hive.

注意这两个只能在hive使用默认delims的时候才能使用
hive分区相关

Argument Description
--hive-partition-key Name of a hive field to partition are sharded on
--hive-partition-value < v> String-value that serves as partition key for this imported into hive in this job.

hive字段转换

Argument Description
--map-column-hive < map> Override default mapping from SQL type to Hive type for configured columns. If specify commas in this argument, use URL encoded keys and values, for example, use DECIMAL(1%2C%201) instead of DECIMAL(1, 1).

import to hbase

sqoop import --connect jdbc:mysql://xxx.xxx.xxx.xxx:3306/database \
--table tablename\ --hbase-table hbasetablename\ --column-family family\ --hbase-row-key ID\ --hbase-create-table\ --username 'root' -P

一个表中的数据只能导入到一个column family里面

HDFS export to RDBMS

sqoop export --connect jdbc:mysql://db.example.com/foo --table bar  \
    --export-dir /results/bar_data

增量导入

支持两种数据类型的增量,一种是数值类型,一种是时间类型
参数说明:

Argument Description
--check-column (col) Specifies the column to be examined when determining which rows to import.
--incremental (mode) Specifies how Sqoop determines which rows are new. Legal values for mode include append and lastmodified.
--last-value (value) Specifies the maximum value of the check column from the previous import.

数字

sqoop import \
--connect jdbc:mysql://master:3306/test \ --username hive \ --password 123456 \ --table customer \ --check-column id \ --incremental append \ --last-value 5 
说明:
id>5的内容以append方式导入

时间戳 merge-key

sqoop import \
--connect jdbc:mysql://master:3306/test \ --username hive \ --password 123456 \ --table customertest \ --check-column last_mod \ --incremental lastmodified \ --last-value "2016-12-15 15:47:30" \ -m 1 \ --merge-key id

时间戳 append

sqoop import \
--connect jdbc:mysql://master:3306/test \ --username hive \ --password 123456 \ --table customertest \ --check-column last_mod \ --incremental lastmodified \ --last-value "2016-12-15 15:47:29" \ -m 1 \ --append 
说明:
因为时间的值lastmodified可能会出现同一行被修改的情况,所以这里有两种处理方式,一种是merge-key,根据这个值update,一种是直接append

validation的使用

--validate RDBMS的一张表全部导出数据到HDFS上验证函数是否一样,也可以用--validator <class-name>指定验证类

--validation-threshold <class-name> 指定超过多少阈值判别为错误,默认absolute,还有一种是百分比

--validation-failurehandler <class-name> 判定为错误应该怎么办

sqoop import --connect jdbc:mysql://db.foo.com/corp --table EMPLOYEES \
    --validate --validator org.apache.sqoop.validation.RowCountValidator \
    --validation-threshold \
          org.apache.sqoop.validation.AbsoluteValidationThreshold \
    --validation-failurehandler \
          org.apache.sqoop.validation.AbortOnFailureHandler

Sqoop jobs管理命令

 sqoop job --create myjob -- import --connect jdbc:mysql://example.com/db \
 --table mytable

sqoop job --list

sqoop job --show myjob

sqoop job --exec someIncrementalJob

sqoop job --exec myjob --username someuser -P #这里的参数会覆盖job里面的参数

sqoop中hadoop相关参数设置方式

-D <property=value>
常用例子:-D mapred.job.name=<job_name>
-conf <configuration file>
-fs <local|namenode:port>      specify a namenode
-jt <local|jobtracker:port>    specify a job tracker
-files <comma separated list of files>    specify comma separated files to be copied to the map reduce cluster
-libjars <comma separated list of jars>    specify comma separated jar files to include in the classpath.
-archives <comma separated list of archives>    specify comma separated archives to be unarchived on the compute machines.