Sqoop基础 (二)导入,导出,创建job

全量将mysql数据导入到HDFS中。

bin/sqoop import \
--connect jdbc:mysql://node03:3306/userdb \
--username root \
--password 密码 \
--delete-target-dir \
--target-dir /sqoopresult \
--table emp --m 1

其中--target-dir 可以用来指定导出数据存放至HDFS的目录。

可以看出它会在 HDFS 上默认用逗号,分隔 emp 表的数据和字段。可以通过

--fields-terminated-by '\t'

来指定分隔符。

bin/sqoop import \
--connect jdbc:mysql://node03:3306/userdb \
--username root \
--password 密码 \
--delete-target-dir \
--fields-terminated-by '\t'
--target-dir /sqoopresult \
--table emp --m 1

如果表的数据比较大,可以启动并行多个maptask执行导入,如果表没有主键,请根据某个字段进行切分

bin/sqoop import \
--connect jdbc:mysql://node03:3306/userdb \
--username root \
--password 密码 \
--delete-target-dir \
--fields-terminated-by '\t'
--target-dir /sqoopresult \
--split-by id
--table emp --m 2

导入数据到hive

bin/sqoop import \
--connect jdbc:mysql://node03:3306/userdb \
--username root \
--password 密码 \
--table emp_conn \
--hive-import \
--m 1 \
--hive-database test;

--hive-database test 导入数据到hive的databases中test数据库。

导入表数据子集(where 过滤)

--where 可以指定从关系数据库导入数据时的查询条件,它执行在数据库服务器相应的 SQL 查询,并将结果存储在 HDFS 的目标目录。

bin/sqoop import \
--connect jdbc:mysql://node03:3306/userdb \
--username root \
--password 88116142 \
--where "city ='sec-bad'" \
--target-dir /wherequery \
--table emp_add --m 1

导入表数据子集(query 查询)

注意事项:

  • 使用 query sql 语句来进行查找不能加参数--table ;
  • 并且必须要添加 where 条件;
  • 并且 where 条件后面必须带一个$CONDITIONS 这个字符串;
  • 并且这个 sql 语句必须用单引号,不能用双引号;
bin/sqoop import \
--connect jdbc:mysql://node-1:3306/userdb \
--username root \
--password 密码 \
--target-dir /wherequery12 \
--query 'select id,name,deg from emp WHERE
--split-by id \
--fields-terminated-by '\t' \
id>1203 and $CONDITIONS' \
--m 2

sqoop 命令中,--split-by id 通常配合-m 10 参数使用。用于指定根据哪个字段进行划分并启动多少个 maptask。

增量导入

在实际工作当中,数据的导入,很多时候都是只需要导入增量数据即可,并 不需要将表中的数据每次都全部导入到 hive 或者 hdfs 当中去,这样会造成数据 重复的问题。因此一般都是选用一些字段进行增量的导入, sqoop 支持增量的 导入数据。

增量导入是仅导入新添加的表中的行的技术

--check-column (col)
用来指定一些列,这些列在增量导入时用来检查这些数据是否作为增量数据 进行导入,和关系型数据库中的自增字段及时间戳类似。 注意:这些被指定的列的类型不能使任意字符类型,如 char、varchar 等类 型都是不可以的,同时-- check-column 可以去指定多个列。

--incremental (mode)
append:追加,比如对大于 last-value 指定的值之后的记录进行追加导入。 lastmodified:最后的修改时间,追加 last-value 指定的日期之后的记录

--last-value (value)
指定自从上次导入后列的最大值(大于该指定的值),也可以自己设定某一值

1. Append 模式增量导入

bin/sqoop import \
--connect jdbc:mysql://node03:3306/userdb \
--username root \
--password 88116142 \
--table emp --m 1 \
--target-dir /appendresult \
--incremental append \
--check-column id \
--last-value 1205

--check-column id
--last-value 1205

这两行的意思就是检查id列,定义上一次更新到哪里,我们就从这个数的下一个开始导入。

Lastmodified 模式增量导入

这种模式的增量导入一般都是带有时间戳形式的。

所以使用 incremental 的方式进行增量的导入:

bin/sqoop import \
--connect jdbc:mysql://node03:3306/userdb \
--username root \
--password 88116142 \
--table customertest \
--target-dir /lastmodifiedresult \
--check-column last_mod \
--incremental lastmodified \
--last-value "2019-05-28 18:42:06" \
--m 1 \
--append

但是,这种形式的导入会将last-value "2019-05-28 18:42:06"的这条信息重复的导入,为了避免数据的重复导入,我们应该稍微修改这条数据,保证大于等于时间为2019-05-28 18:42:06的数据。比如我们可以将18:42:06改为18:42:07。

Lastmodified 模式:append、merge-key

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

bin/sqoop import \
--connect jdbc:mysql://node-1:3306/userdb \
--username root \
--password hadoop \
--table customertest \
--target-dir /lastmodifiedresult \
--check-column last_mod \
--incremental lastmodified \
--last-value "2019-05-28 18:42:06" \
--m 1 \
--merge-key id

--merge-key id可以将表中修改的值和增量的值同时赋值并且更新到一张表中,这里不同于--append是将增量数据更新到新的一张表中。这种相对于更加的合理。

Sqoop 导出

将数据从 Hadoop 生态体系导出到 RDBMS 数据库导出前,目标表必须存在于目标数据库中。

export 有三种模式:

  • 默认操作是从将文件中的数据使用 INSERT 语句插入到表中。
  • 更新模式:Sqoop 将生成 UPDATE 替换数据库中现有记录的语句。
  • 调用模式:Sqoop 将为每条记录创建一个存储过程调用。

默认模式导出 HDFS 数据到 mysql

默认情况下,sqoop export 将每行输入记录转换成一条 INSERT 语句,添加到 目标数据库表中。如果数据库中的表具有约束条件(例如,其值必须唯一的主键 列)并且已有数据存在,则必须注意避免插入违反这些约束条件的记录。如果 INSERT 语句失败,导出过程将失败。此模式主要用于将记录导出到可以接收这些结果的空表中。通常用于全表数据导出。

导出时可以是将 Hive 表中的全部记录或者 HDFS 数据(可以是全部字段也可 以部分字段)导出到 Mysql 目标表。

准备 HDFS 数据

在 HDFS 文件系统中“/input/sqoop”目录的下创建一个文件emp_data.txt:

1201,gopal,manager,50000,TP 
1202,manisha,preader,50000,TP 
1203,kalil,php dev,30000,AC 
1204,prasanth,php dev,30000,AC 
1205,kranthi,admin,20000,TP 
1206,satishp,grpdes,20000,GR

手动创建 mysql 中的目标表

USE userdb; 
CREATE TABLE employee (
    id INT NOT NULL PRIMARY KEY, 
    name VARCHAR(20), 
    deg VARCHAR(20), 
    salary INT, 
    dept VARCHAR(10)
);

执行导出命令

bin/sqoop export \
--connect jdbc:mysql://node03:3306/userdb \
--username root \
--password 88116142 \
--table employee \
--export-dir /input/sqoop

相关配置参数

指定文件中的分隔符

--input-fields-terminated-by '\t'

指定每行的字段名称

选择列并控制它们的排序。当导出数据文件和目标表字段列顺序完全一 致的时候可以不写。否则以逗号为间隔选择和排列各个列。没有被包含在columns 后面列名或字段要么具备默认值,要么就允许插入空值。否则数据 库会拒绝接受 sqoop 导出的数据,导致 Sqoop 作业失败

--columns

bin/sqoop export \
--connect jdbc:mysql://node03:3306/userdb \
--username root \
--password 88116142 \
--table employee \
--columns id,salary,dev,
--export-dir /input/sqoop

导出目录
在执行导出的时候,必须指定这个参数,同时需要具 备--table 或--call 参数两者之一,--table 是指的导出数据库当中对应的表,--call 是指的某个存储过程。

--export-dir

指定空
如果没有指定第一个参数,对于字符串类型的列来说,“NULL”这个字符 串就回被翻译成空值,如果没有使用第二个参数,无论是“NULL”字符串还 是说空字符串也好,对于非字符串类型的字段来说,这两个类型的空串都会 被翻译成空值。比如:

--input-null-string --input-null-non-string

--input-null-string "\\N" --input-null-non-string "\\N"

更新导出(updateonly 模式)

参数说明

--update-key,更新标识,即根据某个字段进行更新,例如 id,可以指定多 个更新标识的字段,多个字段之间用逗号分隔。

--updatemod,指定 updateonly(默认模式),仅仅更新已存在的数据记录, 不会插入新纪录。

举例:

bin/sqoop export \
--connect jdbc:mysql://node-1:3306/userdb \
--username root --password hadoop \
--table updateonly \
--export-dir /updateonly_2/ \
--update-key id \
--update-mode updateonly

更新导出(allowinsert 模式)

参数说明

-- update-key,更新标识,即根据某个字段进行更新,例如 id,可以指定多 个更新标识的字段,多个字段之间用逗号分隔。

-- updatemod,指定 allowinsert,更新已存在的数据记录,同时插入新纪录。 实质上是一个 insert & update 的操作。

bin/sqoop export \
--connect jdbc:mysql://node-1:3306/userdb \
--username root --password hadoop \
--table allowinsert \
--export-dir /allowinsert_2/ \
--update-key id \
--update-mode allowinsert

这种导入不仅会更新已经更新的数据,还会导入没有的数据,比updateonly更加全面

Sqoop job 作业

创建 job

在这里,我们创建一个名为leonjob,这可以从 RDBMS 表的数据导入到HDFS 作业。

bin/sqoop job --create leonjob -- import --connect jdbc:mysql://node03:3306/userdb \
--username root \
--password hadoop \
--target-dir /sqoopresult333 \
--table emp --m 1

注意 import 前要有空格

验证 job

bin/sqoop job --list

检查 job

bin/sqoop job --show leonjob

执行 job

bin/sqoop job --exec leonjob

免密执行 job

sqoop 在创建 job 时,使用--password-file 参数,可以避免输入 mysql 密码, 如果使用--password 将出现警告,并且每次都要手动输入密码才能执行 job,sqoop 规定密码文件必须存放在 HDFS 上,并且权限必须是 400。

然后新建一个.pwd结尾的配置文件,写入密码

echo -n "密码" > leon.pwd
hdfs dfs -mkdir -p /input/sqoop/pwd/
hdfs dfs -put leon.pwd /input/sqoop/pwd
hdfs dfs -chmod 400 /input/sqoop/pwd/leon.pwd

并且检查 sqoop 的 sqoop-site.xml 是否存在如下配置:

<property> 
    <name>sqoop.metastore.client.record.password</name>         
    <value>true</value> 
    <description>If true, allow saved passwords in the metastore. </description> 
</property>

创建job

bin/sqoop job --create leonjob1 -- import --connect jdbc:mysql://cdh-1:3306/userdb \
--username root \
--password-file /input/sqoop/pwd/leon.pwd \
--target-dir /sqoopresult333 \
--table emp --m 1

执行job

bin/sqoop job --exec leonjob1
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,264评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,549评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,389评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,616评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,461评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,351评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,776评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,414评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,722评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,760评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,537评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,381评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,787评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,030评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,304评论 1 252
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,734评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,943评论 2 336