利用Sqoop实现HDFS的数据与MySQL数据的互导

利用Sqoop实现HDFS的数据与MySQL数据的互导

1. 查看帮助

[root@repo bin]# ./sqoop help

Available commands:
  codegen            Generate code to interact with database records
  create-hive-table  Import a table definition into Hive
  eval               Evaluate a SQL statement and display the results
  export             Export an HDFS directory to a database table
  help               List available commands
  import             Import a table from a database to HDFS
  import-all-tables  Import tables from a database to HDFS
  import-mainframe   Import datasets from a mainframe server to HDFS
  job                Work with saved jobs
  list-databases     List available databases on a server
  list-tables        List available tables in a database
  merge              Merge results of incremental imports
  metastore          Run a standalone Sqoop metastore
  version            Display version information
  
See 'sqoop help COMMAND' for information on a specific command.

2. 查看mysql数据中有哪些数据库

[root@repo bin]# ./sqoop list-databases \
--connect jdbc:mysql://192.168.9.100:3306/ \
--username root \
--password 123456

# 结果:
information_schema
hive_more_users
hive_single_user
mysql
test

3. 导入数据到HDFS

(1) 配置概述

Common arguments:
   --connect <jdbc-uri>                         Specify JDBC connect string
   --connection-manager <class-name>            Specify connection manager class name
   --connection-param-file <properties-file>    Specify connection parameters file
   --driver <class-name>                        Manually specify JDBC driver class to use
   --hadoop-home <hdir>                         Override $HADOOP_MAPRED_HOME_ARG
   --hadoop-mapred-home <dir>                   Override $HADOOP_MAPRED_HOME_ARG
   --help

(2) mysql表准备

mysql> select * from Ownerinfo;
+--------------------+--------+------+
| Ownerid            | Name   | Age  |
+--------------------+--------+------+
| 110101200001010001 | 刘备   |   53 |
| 110101200001010002 | 关羽   |   42 |
| 110101200001010003 | 张飞   |   35 |
| 110101200001010004 | 赵云   |   33 |
| 110101200001010005 | 马超   |   38 |
| 110101200001010006 | 黄忠   |   70 |
+--------------------+--------+------+

(3) Mysql表中数据导入HDFS的默认路径下

[root@repo bin]# ./sqoop import \
--connect jdbc:mysql://192.168.9.100:3306/test \
--username root \
--password 123456 \
--table Ownerinfo \
--split-by Ownerid

# 结果:

[root@repo bin]# hdfs dfs -cat /user/root/Ownerinfo/*
110101200001010001,刘备,53
110101200001010002,关羽,42
110101200001010003,张飞,35
110101200001010004,赵云,33
110101200001010005,马超,38
110101200001010006,黄忠,70

注意:

  1. 如果不指定存储在HDFS哪个路径下,会直接存到/user/user_name/table_name/下
  2. 如果表中没有主键,需要使用--split-by选项来指定
  3. 默认用4个map task并行导入

(4) Mysql表中数据导入HDFS的指定路径下,并指定导入时的map task个数

[root@repo bin]# ./sqoop import \
--connect jdbc:mysql://192.168.9.100:3306/test \
--username root \
--password 123456 \
--table Ownerinfo \
--target-dir /user/root/SQOOP/import/Ownerinfo_common \
--num-mappers 1 \
--split-by Ownerid

结果:
[root@repo bin]# hdfs dfs -cat SQOOP/import/Ownerinfo_common/*
110101200001010001,刘备,53
110101200001010002,关羽,42
110101200001010003,张飞,35
110101200001010004,赵云,33
110101200001010005,马超,38
110101200001010006,黄忠,70

(5) Mysql表中数据导入HDFS时设置数据存储格式为parquet

命令:
[root@repo bin]# ./sqoop import \
--connect jdbc:mysql://192.168.9.100:3306/test \
--username root \
--password 123456 \
--table Ownerinfo \
--target-dir /user/root/SQOOP/import/Ownerinfo_parquet \
--num-mappers 1 \
--as-parquetfile \
--split-by Ownerid

HDFS的存储文件有以下3种格式:

  • textfile(默认)
  • sequencefile
  • parquetfile

创建hive表来解读刚才导入的parquetfile:

drop table if exists hive_Ownerinfo;

create table hive_Ownerinfo (Ownerid string,Name string,Age int)
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ','
STORED AS PARQUET;

load data inpath '/user/root/SQOOP/import/Ownerinfo_parquet/3283c8d3-a239-44b9-80dd-0df4bdcebea1.parquet' into table hive_Ownerinfo;

hive> select * from hive_ownerinfo;
110101200001010001  刘备  53
110101200001010002  关羽  42
110101200001010003  张飞  35
110101200001010004  赵云  33
110101200001010005  马超  38
110101200001010006  黄忠  70

(6) 按条件过滤Mysql表中数据后再导入HDFS

--<1> 指定要导入的列
[root@repo bin]# ./sqoop import \
--connect jdbc:mysql://192.168.9.100:3306/test \
--username root \
--password 123456 \
--table Ownerinfo \
--target-dir /user/root/SQOOP/import/Ownerinfo_column \
--num-mappers 1 \
--columns Ownerid,Age \
--split-by Ownerid

--<2> 指定查询语句
[root@repo bin]# ./sqoop import \
--connect jdbc:mysql://192.168.9.100:3306/test \
--username root \
--password 123456 \
--query 'select Ownerid, Age from Ownerinfo where $CONDITIONS' \
--target-dir /user/root/SQOOP/import/Ownerinfo_select \
--num-mappers 1 \
--split-by Ownerid

# 结果:

[root@repo bin]# hdfs dfs -cat SQOOP/import/Ownerinfo_select/*
110101200001010001,53
110101200001010002,42
110101200001010003,35
110101200001010004,33
110101200001010005,38
110101200001010006,70

注意
查询语句必须包含where条件,即使不需要where条件,也需要写上"where $CONDITIONS"来表示没有select语句没有where条件

(7) Mysql表中数据导入HDFS时设置数据压缩格为snappy,并自动判断输出路径是否存在,存在则删除

[root@repo bin]# ./sqoop import \
--connect jdbc:mysql://192.168.9.100:3306/test \
--username root \
--password 123456 \
--table Ownerinfo \
--target-dir /user/root/SQOOP/import/Ownerinfo_compress \
--num-mappers 1 \
--columns Ownerid,Age \
--compress \
--compression-codec org.apache.hadoop.io.compress.SnappyCodec \
--delete-target-dir
--split-by Ownerid

创建hive表来解读刚才导入的snappy压缩格式文件:

drop table if exists hive_Ownerinfo;

create table hive_Ownerinfo (Ownerid string, Age int)
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ',';

load data inpath '/user/root/SQOOP/import/Ownerinfo_compress/part-m-00000.snappy' into table hive_Ownerinfo;

hive> select * from hive_Ownerinfo;
110101200001010001  53
110101200001010002  42
110101200001010003  35
110101200001010004  33
110101200001010005  38
110101200001010006  70

4. 增量导入

(1) 逐条导入

-- 方法一:指定查询语句
[root@repo bin]# ./sqoop import \
--connect jdbc:mysql://192.168.9.100:3306/test \
--username root \
--password 123456 \
--query 'select * from Ownerinfo where Age > 30 and Age < 50 \
--target-dir /user/root/SQOOP/import/Ownerinfo_select \
--num-mappers 1 \
--split-by Ownerid

-- 方法二:使用相关的选项参数(用追加的方式导入Age>33的数据)
[root@repo bin]# ./sqoop import \
--connect jdbc:mysql://192.168.9.100:3306/test \
--username root \
--password 123456 \
--table Ownerinfo \
--target-dir /user/root/SQOOP/import/Ownerinfo_incremental \
--num-mappers 1 \
--incremental append \
--check-column Age \
--last-value 33

# 结果

[root@repo bin]# hdfs dfs -cat /user/root/SQOOP/import/Ownerinfo_incremental/part-m-00000
110101200001010001,刘备,53
110101200001010002,关羽,42
110101200001010003,张飞,35
110101200001010005,马超,38
110101200001010006,黄忠,70

注意
(1) 非数值型的值不能当做增量

Error during import: Character column (Ownerid) can not be used to determine which rows to incrementally import.

(2) 增量导入不能与--delete-target-dir参数一起使用

(2) direct方式:直接从数据库导出数据,效率高

[root@repo bin]# ./sqoop import \
--connect jdbc:mysql://192.168.9.100:3306/test \
--username root \
--password 123456 \
--table Ownerinfo \
--target-dir /user/root/SQOOP/import/Ownerinfo_direct \
--columns Ownerid,Age \
--direct \
--delete-target-dir \
--split-by Ownerid

5. 把HDFS上的数据导出到MySQL表中

/user/root/SQOOP/export/users.txt内容:

1,Jed,15
2,Tom,16
3,Tony,17
4,Bob,18
5,Harry,19
6,Jack,20

[root@repo bin]# ./sqoop export \
--connect jdbc:mysql://192.168.9.100:3306/test \
--username root \
--password 123456 \
--table users \
--export-dir /user/root/SQOOP/export \
--num-mappers 1


mysql> select * from users;
+----+-------+------+
| Id | name  | age  |
+----+-------+------+
|  1 | Jed   |   15 |
|  2 | Tom   |   16 |
|  3 | Tony  |   17 |
|  4 | Bob   |   18 |
|  5 | Harry |   19 |
|  6 | Jack  |   20 |
+----+-------+------+

注意
MySQL表需要提前创建好

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

推荐阅读更多精彩内容