sqoop1.4.6 用法总结一
Sqoop是一个用于在Hadoop和关系数据库或大型机之间传输数据的工具。
您可以使用Sqoop将关系数据库管理系统(RDBMS)中的数据导入Hadoop分布式文件系统(HDFS),在Hadoop MapReduce中转换数据,然后将数据导出回RDBMS。
Sqoop自动化了这个过程的大部分,它依赖于数据库来描述要导入的数据的模式。Sqoop使用MapReduce导入和导出数据,提供并行操作和容错
使用Sqoop,您可以将数据从关系数据库系统或大型机导入HDFS。导入过程的输入要么是数据库表,要么是大型机数据集。对于数据库,Sqoop将逐行将表读入HDFS。对于大型机数据集,Sqoop将从每个大型机数据集中读取记录到HDFS。这个导入过程的输出是一组文件,其中包含导入的表或数据集的副本。导入过程是并行执行的。由于这个原因,输出将在多个文件中。这些文件可以是带分隔符的文本文件(例如,用逗号或制表符分隔每个字段),也可以是包含序列化记录数据的二进制Avro或sequencefile。导入过程的副产品是生成的Java类,该类可以封装导入表的一行。该类在导入过程中由Sqoop本身使用。还为您提供了该类的Java源代码,以便在后续的MapReduce数据处理中使用。该类可以在SequenceFile格式之间序列化和反序列化数据。它还可以解析记录的分隔文本形式。这些功能允许您快速开发使用处理管道中存储的hdfs记录的MapReduce应用程序。您还可以使用自己喜欢的任何其他工具自由地解析delimiteds记录数据。在操作导入的记录之后(例如,使用MapReduce或Hive),您可能有一个结果数据集,然后可以将其导出回关系数据库。
Sqoop的导出过程将并行地从HDFS读取一组带分隔符的文本文件,将它们解析为记录,并将它们作为新行插入目标数据库表中,供外部应用程序或用户使用。
Sqoop还包含一些其他命令,允许您检查正在使用的数据库。例如,可以列出可用的数据库模式(使用sqop -list-databases工具)和模式中的表(使用sqop -list-tables工具)。
Sqoop还包括一个基本的SQL执行shell (sqop -eval工具)。导入、代码生成和导出过程的大多数方面都可以定制。对于数据库,可以控制导入的特定行范围或列。
您可以为基于文件的数据表示以及使用的文件格式指定特定的分隔符和转义字符。您还可以控制生成代码中使用的类名或包名。
sqoop-import
导入工具将单个表从RDBMS导入到HDFS。表中的每一行在HDFS中都表示为一条单独的记录。记录可以存储为文本文件(每行一条记录),或者以Avro或sequencefile的二进制表示形式存储。
--append 将数据追加到HDFS中的现有数据集 --as-avrodatafile 将数据导入Avro数据文件 --as-sequencefile 将数据导入到sequencefile --as-textfile 以纯文本形式导入数据(默认) --as-parquetfile 导入数据到拼花文件 --boundary-query <statement> 用于创建分割的边界查询 --columns <col,col,col…> 要从表导入的列 --delete-target-dir 如果导入目标目录存在,则删除它 --direct 如果数据库存在,请使用直接连接器 --fetch-size <n> 一次从数据库读取的条目数。 --inline-lob-limit <n> 设置内联LOB的最大大小 -m,--num-mappers <n> 使用n个map任务并行导入 -e,--query <statement> 导入语句的结果。 --split-by <column-name> 用于分割工作单元的表的列。不能与——autoreset-to-one-mapper选项一起使用。 --autoreset-to-one-mapper 如果一个表没有主键,也没有提供split-by列,那么导入应该使用一个映射器。不能与——split-by 选项一起使用。 --table <table-name> 表名 --target-dir <dir> HDFS目的地dir --warehouse-dir <dir> 表目标的HDFS父节点 --where <where clause> 进口时使用WHERE子句 -z,--compress 启用压缩 --compression-codec <c> 使用Hadoop编解码器(默认gzip) --null-string <null-string> 要为字符串列的空值编写的字符串 --null-non-string <null-string> 要为非字符串列的空值编写的字符串
输出行格式化参数:
--enclosed-by <char> 设置所需字段的封闭字符 --escaped-by <char> 设置转义字符 --fields-terminated-by <char> 设置字段分隔符 --lines-terminated-by <char> 设置行尾字符 --mysql-delimiters 使用MySQL默认的分隔符集:fields:, lines: \n escape -by: \ option - closed-by: ' --optionally-enclosed-by <char> 设置包含字符的字段
hive 的参数
--hive-home <dir> 覆盖HIVE_HOME --hive-import 将表导入到Hive中(如果没有设置任何分隔符,则使用Hive的默认分隔符)。 --hive-overwrite 重写Hive表中的现有数据。 --create-hive-table 如果设置好,表存在,则任务将在目标hive中失败 。默认情况下,此属性为false。 --hive-table <table-name> 设置导入到Hive时要使用的表名。 --hive-drop-import-delims 将\n、\r和\01从字符串字段导入Hive时删除。 --hive-delims-replacement 当导入到Hive时,用用户定义的字符串替换字符串字段中的\n、\r和\01。 --hive-partition-key 要分区的hive字段的名称被分片 --hive-partition-value <v> String-value作为该作业中导入到hive的分区键。 --map-column-hive <map> 为已配置列重写从SQL类型到Hive类型的默认映射。
sqoop-export
导出工具将一组文件从HDFS导出回RDBMS。目标表必须已经存在于数据库中。根据用户指定的分隔符,读取输入文件并将其解析为一组记录。
默认操作是将这些转换为一组INSERT语句,将记录注入数据库。在“更新模式”中,Sqoop将生成更新语句来替换数据库中的现有记录,在“调用模式”中,Sqoop将对每个记录执行存储过程调用。
常见的参数
--connect <jdbc-uri> 指定JDBC连接字符串 --connection-manager <class-name> 指定要使用的连接管理器类 --driver <class-name> 手动指定要使用的JDBC驱动程序类 --hadoop-mapred-home <dir> 覆盖HADOOP_MAPRED_HOME美元 --help 打印使用说明 --password-file 为包含身份验证密码的文件设置路径 -P 从控制台读取密码 --password <password> 设置身份验证密码 --username <username> 设置身份验证的用户名 --verbose 工作时打印更多信息 --connection-param-file <filename> 提供连接参数的可选属性文件
导出的控制参数
--columns <col,col,col…> 要导出到表中的列 --direct 使用直接导出快速路径 --export-dir <dir> 导出的HDFS源路径 -m,--num-mappers <n> 使用n个map任务并行导出 --table <table-name> 表名 --call <stored-proc-name> 要调用的存储过程 --update-key <col-name> 用于更新的锚列。如果有多个列,则使用逗号分隔的列列表。 --update-mode <mode> 指定在数据库中发现具有不匹配键的新行时如何执行更新。模式的合法值包括updateonly(默认值)和allowinsert。" --input-null-string <null-string> 要解释为空的字符串用于字符串列 --input-null-non-string <null-string> 对于非字符串列,要解释为null的字符串 --staging-table <staging-table-name> 将数据暂存于其中的表,然后插入目标表。 --clear-staging-table 指示可以删除登台表中存在的任何数据。 --batch 使用批处理模式执行底层语句。
说明:
需要—export-dir参数和—table或—调用中的一个。它们指定要填充到数据库中的表(或要调用的存储过程),以及包含源数据的HDFS目录。
默认情况下,表中的所有列都选择导出。您可以选择列的子集,并使用——columns参数控制它们的顺序。这应该包括要导出的列的逗号分隔列表。例如:——列“col1,col2,col3”。注意,没有包含在——columns参数中的列需要定义默认值或允许空值。否则,数据库将拒绝导入的数据,从而导致Sqoop作业失败。
您可以独立于目录中文件的数量控制映射器的数量。导出性能取决于并行度。默认情况下,Sqoop将为导出过程并行使用四个任务。这可能不是最优的;您需要对自己的特定设置进行试验。额外的任务可能提供更好的并发性,但是如果数据库已经在更新索引、调用触发器等方面遇到瓶颈,那么额外的负载可能会降低性能。- nummappers或-m参数控制映射任务的数量,这是使用的并行度。
一些数据库还为导出提供了直接模式。使用——direct参数指定这个代码路径。
——input-null-string和——input-null-non-string参数是可选的。如果——input-null-string没有指定,那么字符串“null”将被解释为string类型列的null。如果——input-null-non-string没有指定,那么字符串“null”和空字符串都将被解释为非字符串列的null。注意,对于非字符串列,空字符串总是被解释为null,如果使用——input-null-non-string指定其他字符串,则空字符串将被解释为null。
由于Sqoop将导出过程分解为多个事务,所以失败的导出作业可能导致部分数据提交到数据库。这可能进一步导致后续作业在某些情况下由于插入冲突而失败,或者在其他情况下导致数据重复。
您可以通过—stage -table选项指定一个staging表来克服这个问题,—stage -table选项充当一个辅助表,用于对导出的数据进行分段。阶段数据最终在单个事务中移动到目标表。
为了使用登台功能,您必须在运行导出作业之前创建登台表。此表的结构必须与目标表相同。这个表应该在导出作业运行之前为空,或者必须指定——clear- stage -table选项。如果staging表包含数据,并且指定了——clear- stage -table选项,Sqoop将在启动导出作业之前删除所有数据。
sqoop 支持的数据库
Database version --direct support connect string matches HSQLDB 1.8.0+ No jdbc:hsqldb:*// MySQL 5.0+ Yes jdbc:mysql:// Oracle 10.2.0+ No jdbc:oracle:*// PostgreSQL 8.3+ Yes (import only) jdbc:postgresql:// CUBRID 9.2+ NO jdbc:cubrid:*
源库是oracle
1.全表导入
sqoop import \ --connect "jdbc:oracle:thin:@192.168.xxx.xxx:1521:CMIS" \ --username="glloans" \ --password="glloans" \ --outdir \/BIG_DATA/tmp/.sqoop/java/ \ --table "GLLOANS_XF.LM_ACCT_INFO" \ --columns "LOAN_NO,ACCT_BANK_CDE,ACCT_BCH_CDE,LOAN_ACCT_TYP,ACCT_NO,ACCT_NAME,ACCT_VAL_DT,ACCT_CREATE_DT,ACCT_EXPIRY_DT,ACCT_RMK,ATPY_STS" \ -m 3 \ --hive-import \ --delete-target-dir \ --hive-overwrite \ --hive-table "SDATA.LM_ACCT_INFO" \ --hive-partition-key "dt" \ --hive-partition-value "20190504" \ --hive-drop-import-delims \ --fields-terminated-by "\001" \ --lines-terminated-by "\n" \ --null-string "\\\N" \ --null-non-string "\\\N"
hive-drop-import-delims --将\n、\r和\01从字符串字段导入Hive时删除。
null-string --要为字符串列的空值编写的字符串
null-non-strin --要为非字符串列的空值编写的字符串
delete-target-dir --如果导入目标目录存在,则删除
2.条件查询导入
sqoop import \ --connect "jdbc:oracle:thin:@192.168.xxx.xxx:1521:CMIS" \ --username="glloans" --password="glloans" \ --outdir \/BIG_DATA/tmp/.sqoop/java/ \ --table "GLLOANS.INTF_TRADE_LOAN_LOG" \ --columns "GEN_GL_NO,TX_LOG_SEQ,LOAN_NO,LOAN_CONT_NO,BCH_CDE,TX_DT,TX_TIME,TX_TYP,HOST_TX_NO,HOST_TX_DT" \ -m 3 \ --hive-import \ --hive-overwrite \ --hive-table "SDATA.INTF_TRADE_LOAN_LOG" \ --hive-partition-key "dt" \ --hive-partition-value "20190504" \ --where "SUBSTR(TX_DT,1,4)||SUBSTR(TX_DT,6,2)||SUBSTR(TX_DT,9,2)='20190504'" \ --hive-drop-import-delims \ --fields-terminated-by "\001" \ --lines-terminated-by "\n" \ --null-string "\\\N" --null-non-string "\\\N"
3.查询关联
sqoop import \ --connect "jdbc:oracle:thin:@192.168.xxx.xxx:1521:CMIS" \ --username="glloans" \ --password="glloans" \ --outdir \/BIG_DATA/tmp/.sqoop/java/ \ -m 1 \ --hive-import \ --hive-overwrite \ --target-dir /user/taskctl/GLLOANS_XF.LM_WV_FEE_DTL_T \ --hive-table "SDATA.LM_WV_FEE_DTL_T" \ --hive-partition-key "dt" \ --hive-partition-value "20190504" \ --query "select GEN_GL_NO,SEQ_NO,WV_TX_LOG_SEQ from glloans.LM_WV_FEE_DTL_T t1 WHERE exists (select t2.GEN_GL_NO
from glloans.LM_WV_FEE_T t2 where t1.GEN_GL_NO = t2.GEN_GL_NO and t2.ADJ_DT=TO_CHAR(TO_DATE(20190504,'YYYY-MM-DD'),'YYYY-MM-DD')) AND \$CONDITIONS" \ --hive-drop-import-delims \ --fields-terminated-by "\001" \ --lines-terminated-by "\n" \ --null-string "\\\N" \ --null-non-string "\\\N"
(2)源库是mysql
1.全表抽取
sqoop import \ --connect "jdbc:mysql://192.168.xxx.xxx:3306/mysqldb" \ --username="user" \ --password="password" \ --outdir \/BIG_DATA/tmp/.sqoop/java/ \ --table "MCS_UPSTREAM" \ --columns "MU_COMMAND_ID,MU_COMMAND,MU_COMMAND_TYPE,MU_MOBILE,MU_EXT,MU_CONTENT,MU_TIME,MU_CREATETIME" \ -m 3 \ --hive-import \ --delete-target-dir \ --hive-overwrite \ --hive-table "SDATA.MCS_UPSTREAM" \ --hive-partition-key "dt" \ --hive-partition-value "20190504" \ --hive-drop-import-delims \ --fields-terminated-by "\001" \ --lines-terminated-by "\n" \ --null-string "\\\N" \ --null-non-string "\\\N"
2.增量抽取
sqoop import \ --connect "jdbc:mysql://192.168.xxx.xxx:3306/mysqldb" \ --username="user" \ --password="password" \ --outdir \/BIG_DATA/tmp/.sqoop/java/ \ --table "MCS_MSG_WX" \ --columns "MMW_WXID,MMW_MODELCODE,MMW_MESSAGE,MMW_MOBILE,MMW_CERTNO,MMW_SENDFLAG,MMW_SENDDATE,MMW_SENDTIME,MMW_STATE,MMW_CHANNEL,MMW_RETCODE,MMW_CREATETIME,LAST_CHG_DT" \ -m 3 \ --hive-import \ --delete-target-dir \ --hive-overwrite \ --hive-table "SDATA.MCS_MSG_WX" \ --hive-partition-key "dt" \ --hive-partition-value "20190504" \ --where "concat(substr(MMW_CREATETIME,1,4),substr(MMW_CREATETIME,6,2),substr(MMW_CREATETIME,9,2))='20190504'" \ --hive-drop-import-delims \ --fields-terminated-by "\001" \ --lines-terminated-by "\n" \ --null-string "\\\N" \ --null-non-string "\\\N"
3.条件抽取
sqoop import \ --connect "jdbc:mysql://192.168.xxx.xxx:3306/mysqldb" \ --username="user" \ --password="password" \ --outdir \/BIG_DATA/tmp/.sqoop/java/ \ -m 1 \ --hive-import \ --hive-overwrite \ --target-dir /user/taskctl/MCS_MSG_WARN_MOBILE \ --hive-table "SDATA.S101_MCS_MSG_WARN_MOBILE" \ --hive-partition-key "dt" \ --hive-partition-value "20190504" \ --query "select * from mcs.MCS_MSG_WARN_MOBILE where date_format(LAST_CHG_DT,'%Y%m%d')='20190504' AND \$CONDITIONS" \ --hive-drop-import-delims \ --fields-terminated-by "\001" \ --lines-terminated-by "\n" \ --null-string "\\\N" \ --null-non-string "\\\N"