1、将关系型数据导入到HDFS文件系统java
一、数据准备mysql
这里以MYSQL为例,将MYSQL中部分表导入HDFSsql
我这里有一个sakila数据库数据库
mysql> show databases;app
+--------------------+ide
| Database |工具
+--------------------+oop
| information_schema |url
| hive |spa
| 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集群
二、执行导入前的准备工做
(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
三、执行导入操做
使用如下命令执行关系型数据导入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程序来实现数据的迁移。
四、验证导入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集群简单验证结束。