Sqoop导入My'SQL数据到hive及hdfs(全量及增量)

Sqoop安装

配置conf下的sqoop-env.sh文件

添加关键的环境变量


sqoop-env.sh

因为要使用mysql,需要把mysql驱动包添加到lib下


在sqoop安装路径下输入bin/sqoop help

若出现help提示则说明配置成功,但也可能HACT_HOME和ACCUMULO_HOME错误,进入bin路径下将以下内容注释掉



还有可能报找不到sqoop类错误,需要安装对应版本的sqoopjar包,我这里是sqoop-1.4.6.jar添加到hadoop/share/hadoop/mapreduce文件夹中。

这是两个常见错误的处理方式

最后sqoop测试连接mysql

命令:bin/sqoop list-tables --connect jdbc:mysql://localhost:3306/ct --username root --password 123456

中间的参数和我们平时使用jdbc一样。如果列出数据库表示数据库连接正常。

Sqoop导入数据到hdfs

先上参数表



导入


(1)MySQL数据导入HDFS(全量读取全量增加)

bin/sqoop import \

--connect jdbc:mysql://hadoop002:3306/ct \

--username root \

--password 123456 \

--table test_call \ (mysql数据库表名)

--target-dir /user/hive/warehouse/ct.db/hive_test_call \ (hdfs导入目标地址)

--fields-terminated-by '\t' \ (mysql各个列字段的分割符,默认为',',还有另外一个参数设置行分隔符默认为'\n')

-m 1 (设置Mapper数量)

--delete-target-dir (若已有目标文件夹则删除,Sqoop底层跑的是MR,如果不设置该参数,若目标地址已存在,会导致MR启动失败)

这里的全量指的是这种导入方式会覆盖所有的之前同路径下的hdfs数据.

(2)MySQL数据导入HDFS(增量读取增量添加)

bin/sqoop import \

--connect jdbc:mysql://hadoop002:3306/ct \

--username root \

--password 123456 \

--table test_call \

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

--target-dir /user/hive/warehouse/ct.db/hive_test_call \

-m 1

--incremental append \ (启用增量)

--check-column money \   (增量检查字段)

--last-value 500 \  (增量字段值)

上面三个参数的意思是:--incremental append 启用增量模式,该模式会把MySQL中新增的数据传递到hdfs上而非所有的MySQL数据。

该模式下不会因为目的路径已存在就无法执行MR。

设置新增的依据是:--check-column 后面的字段

判断是否为新增字段的依据是:--check-column 所标注字段的值是否大于 --last-value 所设置的值。

注意:因为需要比较值,所以MySQL中该字段一般设置为自增的主键,而且不能为varchar类型,sqoop认为varchar的value无法比较。

在这里的含义就是money>500的字段被认为是新增字段,将这些符合要求的字段传入hdfs,也就是说我的本意是将今天MySQL新增的字段增量传入hdfs但是我设置的是比较money的值,那么哪怕是昨天的数据只要符合money大于500也会被认为是新增字段传入hdfs,所以-check-column字段的设置需要注意。



(3)在Hive上创建与MySQL同字段表

bin/sqoop create-hive-table \

--connect jdbc:mysql://hadoop002:3306/ct \

--username root \

--password 123456 \

--table test_call \

--hive-table ct.hive_test_call \

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

一定要记得加上最后的(--fields-terminated-by '\t' )--fields-terminated-by 默认值是','而非'\t',如果不加该字段选择使用默认值时,那么导入数据时也要记得分割字段是','。否则可能出现多列数据串行的情况。



(4)MySQL数据导入Hive(全量读取,增量添加)

这里的全量指的是把整个MySQL的数据导入Hive


bin/sqoop import \

--connect jdbc:mysql://hadoop002:3306/ct \

--username root \

--password 123456 \

--table test_call \

--hive-import \

--hive-table ct.hive_test_call \

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

-m 1

--hive-overwrite \ (覆盖hive,默认无该参数,也就是说导入的方式为追加)

--create-hive-table \ #创建表(默认也会自动创建表)

应该比较好理解

(5)MySQL数据导入Hive(增量读取增量添加)

需要注意的是导入hive无

--incremental append \ (启用增量读取)

--check-column money \   (增量检查字段)

--last-value 500 \  (增量字段值)

这三个参数。

但是可以直接通过hdfs的方式将数据导入hive对应数据库下的文件夹中

参考(2)其实就是hive的追加导入

另一种方式

使用参数 --where

bin/sqoop import \

--connect jdbc:mysql://hadoop002:3306/ct \

--username root \

--password 123456 \

--table test_call \

--hive-import \

--hive-table ct.hive_test_call \

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

--where "tel!=1289919603" \

-m 1

筛选符合要求的行添加到hive,这种方式和hdfs的增量模式其实类似




--query ‘select tel,money,date from test_call where tel="1289919603" and $CONDITIONS’ 

也可以把符合要求的数据从MySQL读取到hdfs但是只能全量导入

注意:where可以和hive import联用

而query只能和传统hdfs数据导入方式联用,且必须设置--target-dir 所以无法按照hive的增量方式将数据增量添加到hive中,但可以通过将数据按照hdfs方式导入hive存储位置的方式导入hive中。

但若以传统hdfs导入方式,想要实现增量读取又需要设置

--incremental append \ (启用增量读取)

--check-column money \   (增量检查字段)

--last-value 500 \  (增量字段值)

这三个字段,可能会和query有筛选条件上的冲突,所以query一般用于(搭配--delete-target-dir \)做全量导入,即覆盖hdfs上已有数据的导入方式。

bin/sqoop import \

--connect jdbc:mysql://hadoop002:3306/ct \

--username root \

--password 123456 \

--hive-import \

--hive-table ct.hive_test_call \

--target-dir /user/hive/warehouse/ct.db/hive_test_call \

--query 'select tel,money,date from test_call where tel="1289919603" and $CONDITIONS' \

--delete-target-dir \

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

-m 1

通过上述方式,就可以实现全量导入MySQL的指定字段

(6)MySQL数据导入Hbase

bin/sqoop import \

--connect jdbc:mysql://hadoop02:3306/mysql \

--username root \

--password 123456 \

--table help_keyword \

--hbase-table new_help_keyword \ (hbase表名)

--column-family person \ (列族名)

--hbase-row-key help_keyword_id (对应hbase上rowkey的MySQL字段,该字段将被设置为rowkey)


导出

拿别人的贴一贴


可以看到hive的导出也需要用传统的hdfs导出方式。


总结:

Sqoop的增量读取,导出到hive上。主要还是通过传统hdfs直接增量读取直接写入到hive路径或使用where这两种方式。

hive的导入默认是增量,想要全量导入只要设置 --hive-overwrite 即可。

query则是特殊情况如,选择MySQL的几个字段而非全部字段导入hive中的这种情况下使用,但是因为sqoop并不会智能的匹配hive中的字段,所以若hive表并非通过sqoop自动生成,很容易出现格式上的错误。

还是尽可能把sqoop的任务设置为简单的导入导出。

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

推荐阅读更多精彩内容