Sqoop知识点整理

Sqoop

Sqoop是一款开源的工具,主要用于在HADOOP不传统的数据库(mysql、postgresql等)进行数据的传递,可以将一个关系型数据库(例如:MySQL、Oracle、Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。 Sqoop中一大亮点就是可以通过hadoop的mapreduce把数据从关系型数据库中导入数据到HDFS。

版本选择

CDH 5.3.x 版本,非常的稳定,好用 cdh-5.3.6,各个版本之间的依赖和兼容不同
* hadoop-2.5.0-cdh5.3.6.tar.gz * hive-0.13.1-cdh5.3.6.tar.gz * zookeeper-3.4.5-cdh5.3.6.tar.gz * sqoop-1.4.5-cdh5.3.6.tar.gz 下载地址 http://archive.cloudera.com/cdh5/cdh/5/

sqoop安装

  
  
  
  1. tar -zxvf sqoop-1.4.5-cdh5.3.6.tar.gz -C /opt/cdh5.3.6

  2. #在sqoop下的conf目录下修改sqoop-env.sh

  3. #Set path to where bin/hadoop is available

  4. export HADOOP_COMMON_HOME=/opt/cdh-5.3.6/hadoop-2.5.0-cdh5.3.6

  5. #Set path to where hadoop-*-core.jar is available

  6. export HADOOP_MAPRED_HOME=/opt/cdh-5.3.6/hadoop-2.5.0-cdh5.3.6

  7. #set the path to where bin/hbase is available

  8. #export HBASE_HOME=

  9. #Set the path to where bin/hive is available

  10. export HIVE_HOME=/opt/cdh-5.3.6/hive-0.13.1-cdh5.3.6

  11. #Set the path for where zookeper config dir is

  12. #export ZOOCFGDIR=

  13. #RDBMS以Mysql数据库为例讲解,拷贝jdbc驱动包到$SQOOP_HOME/lib目录下

  14. cp hive-0.13.1-cdh5.3.6/lib/mysql-connector-java-5.1.27-bin.jar  sqoop-1.4.5-cdh5.3.6/lib/

sqoop常用命令

  
  
  
  1. **************************************

  2. sqoop-import 注意点

  3. import 可能会用到的参数:

  4. Argument    Described

  5. --append    Append data to an existing dataset in HDFS

  6. --as-sequencefile    import序列化的文件

  7. --as-textfile    import plain文件 ,默认

  8. --columns <col,col,col…>    指定列import,逗号分隔,比如:--columns "id,name"

  9. --delete-target-dir    删除存在的import目标目录

  10. --direct    直连模式,速度更快(HBase不支持)

  11. --fetch-size <n>    一次从数据库读取 n 个实例,即n条数据

  12. -m,--num-mappers <n>    建立 n 个并发执行task import

  13. -e,--query <statement>    构建表达式<statement>执行

  14. --split-by <column-name>    根据column分隔实例

  15. --autoreset-to-one-mappe    如果没有主键和split-by one mapper import split-by 和此选项不共存)

  16. --table <table-name>    指定表名import

  17. --target-dir <d>    HDFS destination dir

  18. --warehouse-dir <d>    HDFS parent for table destination

  19. --where <where clause>    指定where从句,如果有双引号,注意转义 \$CONDITIONS,不能用or,子查询,join

  20. -z,--compress    开启压缩

  21. --null-string <null-string>    string列为空指定为此值

  22. --null-non-string <null-string>    string列为空指定为此值,-null这两个参数are optional, 如果不设置,会指定为"null"

  23. 列出mysql数据库中的所有数据库

  24. bin/sqoop list-databases --connect jdbc:mysql://hadoop.jianxin.com:3306 --username root --password missandlove

  25. **************************************

  26. **************************************

  27. 建立mysql

  28. CREATE TABLE my_user(

  29.  `id` int(4) NOT NULL AUTO_INCREMENT,

  30.  `account` varchar(255) DEFAULT NULL,

  31.  `passwd` varchar(255) DEFAULT NULL,

  32.  PRIMARY KEY (`id`)

  33. );

  34. 插入数据

  35. INSERT INTO `my_user` VALUES ('1', 'admin', 'admin');

  36. INSERT INTO `my_user` VALUES ('3', 'system', 'system');

  37. INSERT INTO `my_user` VALUES ('5', 'lee', 'lee');

  38. INSERT INTO `my_user` VALUES ('6', 'les', 'les');

  39. INSERT INTO `my_user` VALUES ('7', 'jianxin', 'jianxin');

  40. **************************************

  41. **************************************

  42. mysql导出数据

  43. bin/sqoop import \

  44. --connect jdbc:mysql://hadoop.jianxin.com:3306/test \

  45. --username root \

  46. --password missandlove \

  47. --table my_user

  48. 如果不指定–target-dir,数据会存储在HDFS中的对应用户名目录下

  49. **************************************

  50. **************************************

  51. 导出到指定文件目录下

  52. sqoop 底层的实现就是MapReduce,import来说,仅仅运行Map Task

  53. bin/sqoop import \

  54. --connect jdbc:mysql://hadoop.jianxin.com:3306/test \

  55. --username root \

  56. --password missandlove \

  57. --table my_user \

  58. --delete-target-dir \

  59. --target-dir /user/jianxin/sqoop/import_myuser \

  60. --num-mappers 3

  61. **************************************

  62. **************************************

  63. 数据导出储存方式(数据存储文件格式---( textfil parquet

  64. --as-textfile    Imports data as plain text (default)

  65. --as-parquetfile    Imports data to Parquet Files

  66. bin/sqoop import \

  67. --connect jdbc:mysql://hadoop.jianxin.com:3306/test \

  68. --username root \

  69. --password missandlove \

  70. --table my_user \

  71. --target-dir /user/jianxin/sqoop/import_myuser_parquet \

  72. --delete-target-dir \

  73. --num-mappers 3 \

  74. --fields-terminated-by ',' \

  75. --as-parquetfile

  76. **************************************

  77. **************************************

  78. hive建立表

  79. drop table if exists default.hive_user_prq;

  80. create table default.hive_user_prq(

  81. id int,

  82. username string,

  83. password string

  84. )

  85. ROW FORMAT DELIMITED FIELDS TERMINATED  BY ','

  86. STORED AS parquet;

  87. 数据入表

  88. load data inpath '/user/jianxin/sqoop/import_myuser_parquet' into table default.hive_user_prq;

  89. **************************************

  90. **************************************

  91. 指定的列导入到数据库

  92. bin/sqoop import \

  93. --connect jdbc:mysql://hadoop.jianxin.com:3306/test \

  94. --username root \

  95. --password missandlove \

  96. --table my_user \

  97. --delete-target-dir \

  98. --target-dir /user/jianxin/sqoop/import_column \

  99. --as-parquetfile \

  100. --num-mappers 3 \

  101. --fields-terminated-by ',' \

  102. --column id,account \

  103. **************************************

  104. **************************************

  105. 初步清洗和过滤数据

  106. bin/sqoop import \

  107. --connect jdbc:mysql://hadoop.jianxin.com:3306/test \

  108. --username root \

  109. --password missandlove \

  110. --table my_user \

  111. --delete-target-dir \

  112. --target-dir /user/jianxin/sqoop/import_query \

  113. --as-parquetfile \

  114. --num-mappers 3 \

  115. --fields-terminated-by ',';

  116. --query 'select id, account from my_user where $CONDITIONS'

  117. 使用query查询导入必须指定条件$CONDITIONS,如果不指定将报错。

  118. create table query_table(id int ,account string) ROW FORMAT DELIMITED FIELDS TERMINATED  BY ',' STORED AS parquet;

  119. load data inpath '/user/jianxin/sqoop/import_query' into table query_table;  

  120. bin/sqoop import \

  121. --connect jdbc:mysql://hadoop.jianxin.com:3306/test \

  122. --username root \

  123. --password missandlove \

  124. --table my_user \

  125. --delete-target-dir \

  126. --target-dir /user/jianxin/sqoop/import_query \

  127. --as-parquetfile \

  128. --num-mappers 3 \

  129. --fields-terminated-by ',';

  130. --query 'select id, account from my_user where id>1'

  131. **************************************

  132. **************************************

  133. 数据压缩

  134. bin/sqoop import \

  135. --connect jdbc:mysql://hadoop.jianxin.com/test \

  136. --username root \

  137. --password missandlove \

  138. --table my_user  \

  139. --target-dir  /user/jianxin/sqoop/imp_my_sannpy \

  140. -- delete-target-dir \

  141. --num-mappers 3 \

  142. --compress \

  143. -- compression-codec  org.apache.hadoop.io.compress.SnappyCodec \

  144. --fields-terminated-by ',' \

  145. --as-parquetfile

  146. **************************************

  147. **************************************

  148. 数据的增量导入

  149. sqoop

  150. Incremental import arguments:

  151. --check-column <column>        Source column to check for incremental change

  152. --incremental <import-type>    Define an incremental import of type 'append' or 'lastmodified'

  153. --last-value <value>         Last imported value in the incremental check column    

  154. check-column,用来指定一些列,这些列在导入时用来检查做决定数据是否要被作为增量数据,在一般关系型数据库中,都存在类似Last_Mod_Date的字段或主键。注意:这些被检查的列的类型不能是任意字符类型,例如CharVARCHAR…(即字符类型不能作为增量标识字段)

  155. incremental,用来指定增量导入的模式(Mode),appendlastmodified

  156. last-value,指定上一次导入中检查列指定字段最大值

  157. 1append,在导入的新数据ID值是连续时采用,对数据进行附加 加不加–last-value的区别在于:数据是否冗余,如果不加,则会导入源表中的所有数据导致数据冗余。

  158. 2lastmodified,在源表中有数据更新的时候使用,检查列就必须是一个时间戳或日期类型的字段,更新完之后,last-value会被设置为执行增量导入时的当前系统时间,当使用–incremental lastmodified模式进行导入且导入目录已存在时,需要使用–merge-key或–append

  159. 导入>=last-value的值。--incremental lastmodified --check-column created --last-value '2012-02-01 11:0:00'

  160. 就是只导入created '2012-02-01 11:0:00'更大的数据。

  161. bin/sqoop import \

  162. --connect jdbc:mysql://hadoop.jianxin.com:3306/test \

  163. --username root \

  164. --password missandlove \

  165. --table my_user \

  166. --target-dir /user/jianxin/sqoop/increament \

  167. --num-mappers 1 \

  168. --incremental append \

  169. --check-column id \

  170. --last-value 0

  171. [root@hadoop hadoop-2.5.0-cdh5.3.6]# bin/hdfs dfs -cat /user/jianxin/sqoop/increament/part-m-00000

  172. 1,admin,admin

  173. 3,system,system

  174. 5,lee,lee

  175. 6,les,les

  176. 7,jianxin,jianxin

  177. INSERT INTO `my_user` VALUES ('12', 'admin', 'admin');

  178. INSERT INTO `my_user` VALUES ('11', 'system', 'system');

  179. INSERT INTO `my_user` VALUES ('10', 'lee', 'lee');

  180. INSERT INTO `my_user` VALUES ('8', 'les', 'les');

  181. INSERT INTO `my_user` VALUES ('9', 'jianxin', 'jianxin');

  182. bin/sqoop import \

  183. --connect jdbc:mysql://hadoop.jianxin.com:3306/test \

  184. --username root \

  185. --password missandlove \

  186. --table my_user \

  187. --target-dir /user/jianxin/sqoop/increament \

  188. --num-mappers 1 \

  189. --incremental append \

  190. --check-column id \

  191. --last-value 7

  192. [root@hadoop hadoop-2.5.0-cdh5.3.6]# bin/hdfs dfs -cat /user/jianxin/sqoop/increament/part-m-00001

  193. 8,les,les

  194. 9,jianxin,jianxin

  195. 10,lee,lee

  196. 11,system,system

  197. 12,admin,admin

  198. create table customer(id int,name varchar(20),last_mod timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);

  199. insert into customer(id,name) values(1,'neil');

  200. insert into customer(id,name) values(2,'jack');

  201. insert into customer(id,name) values(3,'martin');

  202. insert into customer(id,name) values(4,'tony');

  203. insert into customer(id,name) values(5,'eric');

  204. mysql> select * from customer;

  205. +------+--------+---------------------+

  206. | id   | name   | last_mod            |

  207. +------+--------+---------------------+

  208. |    1 | neil   | 2018-04-26 14:00:08 |

  209. |    2 | jack   | 2018-04-26 14:00:08 |

  210. |    3 | martin | 2018-04-26 14:00:08 |

  211. |    4 | tony   | 2018-04-26 14:00:08 |

  212. |    5 | eric   | 2018-04-26 14:00:09 |

  213. +------+--------+---------------------+

  214. bin/sqoop import \

  215. --connect jdbc:mysql://hadoop.jianxin.com/test \

  216. --username root \

  217. --password missandlove \

  218. --table customer \

  219. --target-dir /user/jianxin/sqoop/increament_bytime \

  220. --num-mappers 1 \

  221. --check-column last_mod \

  222. --incremental lastmodified  \

  223. --last-value  0

  224. [root@hadoop hadoop-2.5.0-cdh5.3.6]# bin/hdfs dfs -cat /user/jianxin/sqoop/increament_bytime/part-m-00000

  225. 1,neil,2018-04-26 14:00:08.0

  226. 2,jack,2018-04-26 14:00:08.0

  227. 3,martin,2018-04-26 14:00:08.0

  228. 4,tony,2018-04-26 14:00:08.0

  229. 5,eric,2018-04-26 14:00:09.0

  230. 使用lastmodified模式进行增量处理要指定增量数据是以append模式(附加)还是merge-key(合并)模式添加

  231. insert into customertest(id,name) values(6,'james')

  232. bin/sqoop import \

  233. --connect jdbc:mysql://hadoop.jianxin.com/test \

  234. --username root \

  235. --password missandlove \

  236. --table customer \

  237. --target-dir /user/jianxin/sqoop/increament_bytime \

  238. --num-mappers 1 \

  239. --check-column last_mod \

  240. --incremental lastmodified  \

  241. --last-value  '2018-04-26 14:00:09' \

  242. --merge-key id

  243. 这种方式不会新建立hdfs文件系统下的文件

  244. **************************************

  245. **************************************

  246. 直接导入

  247. bin/sqoop import \

  248. --connect jdbc:mysql://hadoop.jianxin.com:3306/test \

  249. --username root \

  250. --password missandlove \

  251. --table customer \

  252. --num-mappers 1 \

  253. --target-dir /user/jianxin/sqoop/derict \

  254. --delete-target-dir

  255. --direct

  256. **************************************

  257. **************************************

  258. 导出到数据库

  259. 论据    描述

  260. --connect <jdbc-uri>    指定JDBC连接字符串

  261. --connection-manager <class-name>    指定要使用的连接管理器类

  262. --driver <class-name>    手动指定要使用的JDBC驱动程序类

  263. --hadoop-mapred-home <dir>    覆盖$ HADOOP_MAPRED_HOME

  264. --help    打印使用说明

  265. --password-file    为包含认证密码的文件设置路径

  266. -P    从控制台读取密码

  267. --password <password>    设置验证密码

  268. --username <username>    设置验证用户名

  269. --verbose    在工作时打印更多信息

  270. --connection-param-file <filename>    提供连接参数的可选属性文件

  271. --relaxed-isolation    将连接事务隔离设置为未提交给映射器的读取。

  272. --columns <col,col,col…>    要导出到表格的列

  273. --direct    使用直接导出快速路径

  274. --export-dir <dir>    用于导出的HDFS源路径

  275. -m,--num-mappers <n>    使用n个地图任务并行导出

  276. --table <table-name>    要填充的表

  277. --call <stored-proc-name>    存储过程调用

  278. --update-key <col-name>    锚点列用于更新。如果有多个列,请使用以逗号分隔的列列表。

  279. --update-mode <mode>    指定在数据库中使用不匹配的键找到新行时如何执行更新。

  280. mode包含的 updateonly默认 值(默认)和 allowinsert

  281. --input-null-string <null-string>    字符串列被解释为空的字符串

  282. --input-null-non-string <null-string>    要对非字符串列解释为空的字符串

  283. --staging-table <staging-table-name>    数据在插入目标表之前将在其中展开的表格。

  284. --clear-staging-table    表示可以删除登台表中的任何数据。

  285. --batch    使用批处理模式执行基础语句。

  286. touch /opt/datas/my_user_fromhive

  287. [root@hadoop datas]# vi my_user_fromhive

  288. 16,hiveuser,hiveuser

  289. 18,hivemiss,hivemiss

  290. [root@hadoop hadoop-2.5.0-cdh5.3.6]# bin/hdfs dfs -mkdir -p /user/jianxin/hive_to_mysql

  291. [root@hadoop hadoop-2.5.0-cdh5.3.6]# bin/hdfs dfs -put /opt/datas/my_user_fromhive  /user/jianxin/hive_to_mysql

  292. bin/sqoop export \

  293. --connect  jdbc:mysql://hadoop.jianxin.com:3306/test \

  294. --username root \

  295. --password missandlove \

  296. --table my_user \

  297. --export-dir /user/jianxin/hive_to_mysql \

  298. --num-mappers 1

  299. mysql> select * from my_user;

  300. +----+----------+----------+

  301. | id | account  | passwd   |

  302. +----+----------+----------+

  303. |  1 | admin    | admin    |

  304. |  3 | system   | system   |

  305. |  5 | lee      | lee      |

  306. |  6 | les      | les      |

  307. |  7 | jianxin  | jianxin  |

  308. |  8 | les      | les      |

  309. |  9 | jianxin  | jianxin  |

  310. | 10 | lee      | lee      |

  311. | 11 | system   | system   |

  312. | 12 | admin    | admin    |

  313. | 13 | admin    | admin    |

  314. | 16 | hiveuser | hiveuser |

  315. | 18 | hivemiss | hivemiss |

  316. +----+----------+----------+

  317. **************************************


本文分享自微信公众号 - 我爱问读书(wawds_)。
如有侵权,请联系 [email protected] 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章