INFO-Sqoop介绍
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:
如果使用并行的方式import,map任务将会使用不同的条件替换掉这个内容,比如一个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.
以上内容对您是否有帮助?