最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

Sqoop

运维笔记admin7浏览0评论

Sqoop

Sqoop

Sqoop--全量增量数据导⼊导出⼀、导⼊数据在Sqoop中,“导⼊”概念指:从⾮⼤数据集群(RDBMS)向⼤数据集群(HDFS,HIVE,HBASE)中传输数据,叫做:导⼊,即使⽤import关键字。RDBMS到HDFS(1)全部导⼊全量数据导⼊就是⼀次性将所有需要导⼊的数据,从关系型数据库⼀次性地导⼊到Hadoop中(可以是HDFS、Hive等)。bin/sqoop import \--connect jdbc:mysql://hadoop102:3306/company \--username root \--password 123 \--table staff \--target-dir /user/company \--delete-target-dir \--num-mappers 1 \--fields-terminated-by "\t"可以看到sqoop的作⽤其实是类似于hive的,都是将输⼊的指令转换为mapreduce任务:(2)查询导⼊--target-dir /user/company \--delete-target-dir \--num-mappers 1 \--fields-terminated-by "\t" \--query 'select name,sex from staff where id <=1 and $CONDITIONS;'and $CONDITIONS 不可省略,因为sqoop会补充当前操作所需的其他条件。如果不加该关键字,系统会提⽰:must contain‘$CONDITIONS’ in WHERE clause.如果query后使⽤的是双引号,则$CONDITIONS前必须加转移符,防⽌shell识别为⾃⼰的变量(3)导⼊指定列bin/sqoop import \--connect jdbc:mysql://hadoop102:3306/company \--username root \--password 123 \--target-dir /user/company \--delete-target-dir \--num-mappers 1 \--fields-terminated-by "\t" \--columns id,sex \--table staffcolumns中如果涉及到多列,⽤逗号分隔,分隔时不要添加空格,原因在于命令⾏参数是⽤空格来隔开的(4)使⽤sqoop关键字筛选查询导⼊数据bin/sqoop import \--connect jdbc:mysql://hadoop102:3306/company \--username root \--password 123 \--target-dir /user/company \--delete-target-dir \--num-mappers 1 \--fields-terminated-by "\t" \--table staff \--where "id=1"⼆、RDBMS到Hive--table staff \--num-mappers 1 \--hive-import \--fields-terminated-by "\t" \--hive-overwrite \--hive-table staff_hive提⽰:该过程分为两步,第⼀步将数据导⼊到HDFS,第⼆步将导⼊到HDFS的数据迁移到Hive仓库,第⼀步默认的临时⽬录是/user/username/表名⽅法1(直接导⼊):将mysql数据直接导⼊hive表中#直接导⼊适⽤于将单个表中部分数据或所有数据导⼊hive表中的情况sqoop import \--connect jdbc:mysql://localhost:3306/bdp \--username root \--password 123456 \--table emp \--hive-import #从关系型数据库向hive中导⼊数据的标志--hive-database test #导⼊的hive库--hive-table EMP #导⼊的hive表#--columns class_id,class_name,teacher #仅导⼊class_id,class_name,teacher#–columns接的字段时mysql表的字段,要求这些字段要和Hive表中的字段对应,数据类型要对应,否则会出现异常#--where 'id>10' #where指定条件,⽤引号引起来--hive-partition-key time # hive表的分区字段,字段类型默认为string--hive-partition-value '2018-05-18' #与--hive-partition-key同时使⽤,指定导⼊的分区值--hive-overwrite #可选,导⼊前清理hive表中所有数据--null-string '\\N' #指定字符串类型为null时的替代字符--null-non-string '\\N' #指定⾮字符串类型为null时的替代字符--fields-terminated-by ','--lines-terminated-by '\n'-m 1#多分区时,对应的参数应该为:#--hcatalog-database,--hcatalog-table,--hcatalog-partition-keys和--hcatalog-partition-values注意:fields-terminated-by 要是不指定值的话,默认分隔符为'\001',并且以后每次导⼊数据都要设置 --fields-terminated-by '\001',不然导⼊的数据为NULL。建议⼿动设置 --fields-terminated-by的值⽅法2(导⼊hdfs):先将mysql数据导⼊hdfs上,之后再将hdfs数据加载到hive中# 全量数据导⼊sqoop import \--connect jdbc:mysql://x:3316/testdb \--username root \--password 123456 \--query “select * from test_table where \$CONDITIONS” \--query 'select id, brand_id,name ,sysdate from bbs_product where $CONDITIONS LIMIT 100' \#将 bbs_product 表中的前100条数据导导出来只要id brand_id和 name 这3个字段--query 'select * from emp inner join user on emp.id=user.id where id>10'#--query参数可以对多个mysql表join后的数据集进⾏筛选,该⽅法可以将指定的数据集(可能涉及多张表)导⼊hdfs,并不限于单张表 --target-dir /user/root/person_all \--fields-terminated-by “,” \--hive-drop-import-delims \--null-string “\\N” \--null-non-string “\\N” \--split-by id \-m 6 \参数说明– query SQL查询语句,与--target-dir共⽤-query-sql:使⽤的查询语句,例如:”SELECT * FROM Table WHERE id>1 AND \$CONDITIONS”。记得要⽤引号包围,最后⼀定要带上 AND \$CONDITIONS。– target-dir HDFS⽬标⽬录(确保⽬录不存在,否则会报错,因为Sqoop在导⼊数据⾄HDFS时会⾃⼰在HDFS上创建⽬录)–hive-drop-import- delims删除数据中包含的Hive默认分隔符(^A, ^B, \n)–null-string string类型空值的替换符(Hive中Null⽤\n表⽰)–null-non-string⾮string类型空值的替换符–split-by 数据切⽚字段(int类型,m>1时必须指定)指定根据哪⼀列来实现哈希分⽚,从⽽将不同分⽚的数据分发到不同 map 任务上去跑,避免数据倾斜。-m Mapper任务数,默认为4加载数据到hive表:load data inpath '/user/data/mysql/emp ' into table test.EMP22、增量数据导⼊事实上,在⽣产环境中,系统可能会定期从与业务相关的关系型数据库向Hadoop导⼊数据,导⼊数仓后进⾏后续离线分析。故我们此时不可能再将所有数据重新导⼀遍,此时我们就需要增量数据导⼊这⼀模式了。增量数据导⼊分两种,⼀是基于递增列的增量数据导⼊(Append⽅式)。⼆是基于时间列的增量数据导⼊(LastModified⽅式)。⼀)Append⽅式举个栗⼦,有⼀个订单表,⾥⾯每个订单有⼀个唯⼀标识⾃增列ID,在关系型数据库中以主键形式存在。之前已经将id在0~5201314之间的编号的订单导⼊到Hadoop中了(这⾥为HDFS),现在⼀段时间后我们需要将近期产⽣的新的订单数据导⼊Hadoop中(这⾥为HDFS),以供后续数仓进⾏分析。此时我们只需要指定–incremental 参数为append,–last-value参数为5201314即可。表⽰只从id ⼤于5201314后开始导⼊。# Append⽅式的全量数据导⼊sqoop import \--connect jdbc:mysql://x:3316/testdb \--username root \--password 123456 \--query “select order_id, name from order_table where \$CONDITIONS” \--target-dir /user/root/orders_all \--split-by order_id \-m 6 \--incremental append \--check-column order_id \--last-value 5201314sqoop import --connect jdbc:mysql://192.168.0.8:3306/hxy \--username root \--password 123456 \--table data \--target-dir '/soft/hive/warehouse/data' \--incremental append \--check-column id \--last-value 3 \-m 1参数说明–incremental append基于递增列的增量导⼊(将递增列值⼤于阈值的所有数据增量导⼊Hadoop)–check-column递增列(int)是指定原表中⽤来做增量判断条件的那⼀字段–last-value阈值(int)

数据,增量,指定,数据库,条件,关系

发布评论

评论列表(0)

  1. 暂无评论