2018-09-07期 Sqoop将关系型数据导入到HDFS文件系统

一、将关系型数据导入到HDFS文件系统

1、数据准备

这里以MYSQL为例,将MYSQL中部分表导入HDFS

我这里有一个sakila数据库

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| hive               |

| mysql              |

| performance_schema |

| sakila             |

| sqoopdb            |

| sys                |

+--------------------+

7 rows in set (0.01 sec)

该数据库中有如下表

mysql> show tables

   -> ;

+----------------------------+

| Tables_in_sakila           |

+----------------------------+

| actor                      |

| actor_info                 |

| address                    |

| category                   |

| city                       |

| country                    |

| customer                   |

| customer_list              |

| film                       |

| film_actor                 |

| film_category              |

| film_list                  |

| film_text                  |

| inventory                  |

| language                   |

| nicer_but_slower_film_list |

| payment                    |

| rental                     |

| sales_by_film_category     |

| sales_by_store             |

| staff                      |

| staff_list                 |

| store                      |

这里有个actor表,这个表中有200条数据,数据形式如下:

+----------+-------------+--------------+---------------------+

| actor_id | first_name  | last_name    | last_update         |

+----------+-------------+--------------+---------------------+

|        1 | PENELOPE    | GUINESS      | 2006-02-15 04:34:33 |

|        2 | NICK        | WAHLBERG     | 2006-02-15 04:34:33 |

|        3 | ED          | CHASE        | 2006-02-15 04:34:33 |

现在通过sqoop工具将actor表数据导入到HDFS集群

2、执行导入前的准备工作

(1)由于sqoop是一个数据迁移工具,通过内置一些数据导入导出的MR程序来实现数据迁移,因此需要依赖Hadoop集群才能进行迁移操作。这里需要启动HDFS和Yarn进程

[root@hadoop-server01 ~]# start-dfs.sh

[root@hadoop-server01 ~]# start-yarn.sh

[root@hadoop-server01 ~]# jps

2802 SecondaryNameNode

3042 NodeManager

2534 NameNode

2653 DataNode

2943 ResourceManager

(2)sqoop导入需要连接关系型数据库,因此执行导入操作前需要将关系型数据库的jdbc驱动包拷贝到sqoop安装目录的lib目录,这里以mysql为例:

[root@hadoop-server01 lib]# ll /usr/local/apps/sqoop-1.4.4.bin__hadoop-2.0.4-alpha/lib/mysql-connector-java-5.0.8-bin.jar

-rw-r--r--. 1 root root 540852 Jul  9 05:36 /usr/local/apps/sqoop-1.4.4.bin__hadoop-2.0.4-alpha/lib/mysql-connector-java-5.0.8-bin.jar

3、执行导入操作

使用以下命令执行关系型数据导入HDFS操作

sqoop import --connect jdbc:mysql://ip:port/dbname --username username--password passwd --table tablename

参数说明:

--import 导入命令

--connect  指定连接关系型数据库连接字符串,不同数据库类型连接方式有差异

--username 连接关系型数据库用户名

--password  连接关系型数据库的密码

--table 指定要导入HDFS的表

下面正式执行导入操作:

[root@hadoop-server01 lib]# sqoop import --connect jdbc:mysql://hadoop-server03:3306/sakila --username sqoop --password hive#2018 --table actor

18/07/09 05:37:36 INFO client.RMProxy: Connecting to ResourceManager at hadoop-server01/192.168.1.201:8032

18/07/09 05:37:39 INFO db.DataDrivenDBInputFormat: BoundingValsQuery: SELECT MIN(`actor_id`), MAX(`actor_id`) FROM `actor`

18/07/09 05:37:39 INFO mapreduce.JobSubmitter: number of splits:4

18/07/09 05:37:39 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1531139617936_0002

18/07/09 05:37:40 INFO impl.YarnClientImpl: Submitted application application_1531139617936_0002

18/07/09 05:37:40 INFO mapreduce.Job: The url to track the job: http://hadoop-server01:8088/proxy/application_1531139617936_0002/

18/07/09 05:37:40 INFO mapreduce.Job: Running job: job_1531139617936_0002

....................................

从以上信息可以看出,执行的sqoop后会自动转为MR程序,并封装MapReduce job提交Hadoop集群执行,因此这也验证了sqoop执行数据迁移确实是转换成了MapReduce程序来实现数据的迁移。

4、验证导入HDFS数据

[root@hadoop-server01 lib]# hadoop fs -ls /user/root/actor

Found 5 items

-rw-r--r--   1 root supergroup          0 2018-07-09 05:37 /user/root/actor/_SUCCESS

-rw-r--r--   1 root supergroup       1911 2018-07-09 05:37 /user/root/actor/part-m-00000

-rw-r--r--   1 root supergroup       1929 2018-07-09 05:37 /user/root/actor/part-m-00001

-rw-r--r--   1 root supergroup       1978 2018-07-09 05:37 /user/root/actor/part-m-00002

-rw-r--r--   1 root supergroup       1981 2018-07-09 05:37 /user/root/actor/part-m-00003

导入HDFS中的数据存放在 /user/root/actor目录下,默认目录生成机制为/user/当前操作系统用户/表名

生成的数据为/part-m-00000~/part-m-00003 四个文件,说明本次sqoop数据迁移生成的MR程序对原关系型数据库中表迁移操作使用了4个分片,每个分片job生成一个文件。part-m:表示只执行Map Tasks任务,然后直接输出结果,没有使用到ReduceTasks任务。

下面验证导入数据是否和关系型数据库中表actor一致

[root@hadoop-server01 lib]# hadoop fs -cat /user/root/actor/part-m-00000

1,PENELOPE,GUINESS,2006-02-15 04:34:33.0

2,NICK,WAHLBERG,2006-02-15 04:34:33.0

3,ED,CHASE,2006-02-15 04:34:33.0

......省略中间数据

49,ANNE,CRONYN,2006-02-15 04:34:33.0

50,NATALIE,HOPKINS,2006-02-15 04:34:33.0

[root@hadoop-server01 lib]# hadoop fs -cat /user/root/actor/part-m-00001

51,GARY,PHOENIX,2006-02-15 04:34:33.0

52,CARMEN,HUNT,2006-02-15 04:34:33.0

53,MENA,TEMPLE,2006-02-15 04:34:33.0

......省略中间数据

99,JIM,MOSTEL,2006-02-15 04:34:33.0

100,SPENCER,DEPP,2006-02-15 04:34:33.0

100,SPENCER,DEPP,2006-02-15 04:34:33.0

[root@hadoop-server01 lib]# hadoop fs -cat /user/root/actor/part-m-00002

101,SUSAN,DAVIS,2006-02-15 04:34:33.0

102,WALTER,TORN,2006-02-15 04:34:33.0

103,MATTHEW,LEIGH,2006-02-15 04:34:33.0

......省略中间数据

149,RUSSELL,TEMPLE,2006-02-15 04:34:33.0

150,JAYNE,NOLTE,2006-02-15 04:34:33.0

[root@hadoop-server01 lib]# hadoop fs -cat /user/root/actor/part-m-00003

151,GEOFFREY,HESTON,2006-02-15 04:34:33.0

152,BEN,HARRIS,2006-02-15 04:34:33.0

......省略中间数据

199,JULIA,FAWCETT,2006-02-15 04:34:33.0

200,THORA,TEMPLE,2006-02-15 04:34:33.0

通过检验,导入到HDFS中的4个分区文件的数据条数总和刚好为200条,同关系型数据库数据条目一致。同时可以看出导入到HDFS中的数据默认使用逗号分隔。

到此,利用sqoop将关系型数据库中数据导入HDFS集群简单验证结束。


猜你喜欢

转载自blog.51cto.com/2951890/2171519
今日推荐