Hadoop实战:Sqoop 1.99把MySQL导数据到HDFS

Sqoop客户端

sqoop2客户端提供各种命令行交互接口,供用户使用。sqoop2客户端先连接Sqoop Server,将参数传递过去,再调用mapreduce进行数据导入到出作业。以下是sqoop2中比较重要的几个对象。

1)connector:sqoop2中预定一了各种里链接,这些链接是一些配置模板,比如最基本的generic-jdbc-connector,还有hdfs-connector,通过这些模板,可以创建出对应数据源的link,比如我们链接MySQL,就是使用JDBC的方式进行链接,这时候就从这个generic-jdbc-connector模板继承出一个link,可以这么理解。

2)link:从connector继承出的对象,用于指定的对数据源的链接。

3)job:指定一个导入导出作业,必须指定数据源和数据目的地,并配置各项job参数,用于提交给mapreduce。

sqoop2-shell使用

请确保Sqoop2服务器已经启动,并确保Hadoop启动。其中hadoop不仅要启动hdfs(NameNode、DataNode),还要启动yarn(NodeManager、ResourceManager),当然,一般还会有一个SecondaryNameNode,用于原始NameNode的备援进程。Sqoop具体配置请看上一篇博客:Hadoop实战:Sqoop 1.99安装配置

由于sqoop是一个交互式命令行工具,使用如下命令打开sqoop的shell:

1

2

3

4

5

6

7

8

[hadoop@hadoop-nn ~]$ sqoop2-shell

Setting conf dir: /usr/local/sqoop/bin/../conf

Sqoop home directory: /usr/local/sqoop

Jun 19, 2017 10:23:36 PM java.util.prefs.FileSystemPreferences$1 run

INFO: Created user preferences directory.

Sqoop Shell: Type 'help' or '\h' for help.

sqoop:000>

1)配置sqoop server参数

1

2

sqoop:000> set server --host 10.10.0.186 --port 12000 --webapp sqoop

Server is set successfully

port和host就不用说了,port是默认值;最后一个–webapp官方文档说是指定的sqoop jetty服务器名称,大概是一个自己能识别的用于标示这个服务器的名字吧。

完成后可以验证服务器是否能正确链接上:

1

sqoop:000> show version --all

这个命令能显示shell和server的版本信息,若server版本信息能正确显示,则没问题!能正确链接上。

注意:我在运行这条命令时出现一个警告,说hadoop native library无法加载什么的,这个目前也没有查到相关说法,但验证下来,hadoop2.6中的lib/native只有一些提供给C/C++调用的二进制文件。若没有影响直接忽略吧。望哪位知道的能告诉我。

2)一些基本概念

MySQL链接使用的是JDBC,这样想来不难理解,必须有对应的驱动文件jar,还得有对应的访问权限,请确保能在server端访问MySQL。参照上一篇博客。可以先看看默认的connector模板都有哪些:

1

2

3

4

5

6

7

8

9

10

11

12

sqoop:000> show connector

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

|          Name          | Version |                           Class                            | Supported Directions |

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

| generic-jdbc-connector | 1.99.7  | org.apache.sqoop.connector.jdbc.GenericJdbcConnector       | FROM/TO              |

| kite-connector         | 1.99.7  | org.apache.sqoop.connector.kite.KiteConnector              | FROM/TO              |

| oracle-jdbc-connector  | 1.99.7  | org.apache.sqoop.connector.jdbc.oracle.OracleJdbcConnector | FROM/TO              |

| ftp-connector          | 1.99.7  | org.apache.sqoop.connector.ftp.FtpConnector                | TO                   |

| hdfs-connector         | 1.99.7  | org.apache.sqoop.connector.hdfs.HdfsConnector              | FROM/TO              |

| kafka-connector        | 1.99.7  | org.apache.sqoop.connector.kafka.KafkaConnector            | TO                   |

| sftp-connector         | 1.99.7  | org.apache.sqoop.connector.sftp.SftpConnector              | TO                   |

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

这时候会显示各个conector信息,在1.99.7版本以前,每个connector会有一个id,当创建link时,用这个id指定所继承的connector,但在这个版本中没有这个id了,创建link时直接使用connector名称创建。

其中,最基本的是generic-jdbc-connector,是MySQL等关系型数据库的连接器。支持数据的从关系型数据库的导入导出。除此之外,支持导入导出的还有:hdfs-connector、kite-connector和oracle-jdbc-connector。仅支持数据导入的连接器有: sftp-connector 、 ftp-connector 以及kafka-connector 。

通过这些模板,可以创建出对应数据源的link,比如我们链接MySQL,就是使用JDBC的方式进行链接,这时候就从这个generic-jdbc-connector模板继承出一个link。那如果我们需要连接hdfs,则需要使用hdfs-connector模版。

link:从connector继承出的对象,用于指定的对数据源的链接。

job:指定一个导入导出作业,必须指定数据源和数据目的地,并配置各项job参数,用于提交给mapreduce。

3)创建一个jdbc的link

这里我们使用的是generic-jdbc-connector:

1

sqoop:000> create link -connector generic-jdbc-connector

这时候就会出现交互会话,提示你输入各项参数:

Name:标示这个link的字符串,如:link-name。

JDBC Driver Class:指定JDBC启动时所需要加载的Driver类,填写:com.mysql.jdbc.Driver。

JDBC Connection String:指定JDBC连接字符串,后面跟上需要连接的数据库,如:jdbc:mysql://localhost:3306/test。

Username:指定需要连接的用户名(要有test库的select权限)。

Password:指定连接用户名的密码。

FetchSize:这个属性并没有在官方文档上描述,我也不知道说的是什么,直接回车了,使用的默认值。

填写完上面几项,将提供一个可以输入JDBC属性的hash,提示符是entry#,这时候可以手动指定很多JDBC属性的值。

本例只覆盖了一个protocol值为tcp:protocol=tcp

再按回车,之后会再定义一下SQL标准。各个数据库系统提供商们对SQL语言标准的理解和实现各有不同,于是各有各的一些细微差别。以下属性就是用于指定这些区别的。至此,就可以完成这个link的创建。命令行提示符也会还原为sqoop:000>。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

sqoop:000> create link -connector generic-jdbc-connector

Creating link for connector with name generic-jdbc-connector

Please fill following values to create new link object

Name: link-mysql

Database connection

Driver class: com.mysql.jdbc.Driver

Connection String: jdbc:mysql://10.10.0.245:3306/sbtest

Username: root

Password: ******

Fetch Size:

Connection Properties:

There are currently 0 values in the map:

entry# protocol=tcp

There are currently 1 values in the map:

protocol = tcp

entry#

SQL Dialect

Identifier enclose:  

New link was successfully created with validation status OK and name link-mysql

注意Identifier enclose:  这里不能直接回车!要打一个空格符号然后再回车!因为如果不打空格,查询MySQL表的时候会在表上加上“”,导致查询出错!

4)创建一个hdfs的link

1

2

3

4

5

6

7

8

9

10

11

12

13

sqoop:000> create link -connector hdfs-connector

Creating link for connector with name hdfs-connector

Please fill following values to create new link object

Name: link-hdfs

HDFS cluster

URI: hdfs://10.10.0.186:8020

Conf directory:

Additional configs::

There are currently 0 values in the map:

entry#

New link was successfully created with validation status OK and name link-hdfs

查看创建的link

1

2

3

4

5

6

7

sqoop:000> show link

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

|    Name    |     Connector Name     | Enabled |

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

| link-mysql | generic-jdbc-connector | true    |

| link-hdfs  | hdfs-connector         | true    |

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

5)创建传输JOB

1

sqoop:000> create job -f "link-mysql" -t "link-hdfs"

-f指定from,即是数据源位置,-t指定to,即是目的地位置。本例是从MySQL传递数据到HDFS,所以就是from mysql to HDFS。参数值就是在创建链接(link)时指定的Name。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

sqoop:000> create job -f "link-mysql" -t "link-hdfs"

Creating job for links with from name link-mysql and to name link-hdfs

Please fill following values to create new job object

Name: mysql-hdfs

Database source

Schema name: sbtest

Table name: sbtest1

SQL statement:

Column names:

There are currently 0 values in the list:

element#

Partition column:

Partition column nullable:

Boundary query:

Incremental read

Check column:

Last value:

Target configuration

Override null value:

Null value:

File format:

  0 : TEXT_FILE

  1 : SEQUENCE_FILE

  2 : PARQUET_FILE

Choose: 0

Compression codec:

  0 : NONE

  1 : DEFAULT

  2 : DEFLATE

  3 : GZIP

  4 : BZIP2

  5 : LZO

  6 : LZ4

  7 : SNAPPY

  8 : CUSTOM

Choose: 0

Custom codec:

Output directory: /sqoop

Append mode:

Throttling resources

Extractors:

Loaders:

Classpath configuration

Extra mapper jars:

There are currently 0 values in the list:

element#

New job was successfully created with validation status OK  and name mysql-hdfs

以下是各个属性

Name:一个标示符,自己指定即可。

Schema Name:指定Database或Schema的名字,这里指定数据库名字为sbtest即可,本例的数据库。

Table Name:本例使用的数据库表为sbtest1,自己指定导出的表,多表的情况请自行查看官方文档。

SQL Statement:如果指定了表这里就不需要指定SQL查询语句了。

配置完以上几项,又回出现element#提示符,提示输入一些hash值,这里我没有再指定什么。直接回车过。而以下几个配置我也是直接回车,使用默认值,大概是一些与数据库相关的参数。

Partition column:

Partition column nullable:

Boundary query

Last value

后面需要配置数据目的地各项值:

Null alue:大概说的是如果有空值用什么覆盖

File format:指定在HDFS中的数据文件是什么文件格式,这里使用TEXT_FILE,即最简单的文本文件。

Compression codec:用于指定使用什么压缩算法进行导出数据文件压缩,我指定NONE。

Custom codec:这个就是指定的custom压缩算法,本例选择NONE,所以直接回车过去。

Output directory:指定存储在HDFS文件系统中的路径,本例中指定/sqoop(会自动在HDFS创建)。

Append mode:用于指定是否是在已存在导出文件的情况下将新数据追加到数据文件中。

Extractors:不清楚是什么

Loaders:不清楚是什么

最后再次出现element#提示符,用于输入extra mapper jars的属性,可以什么都不写。直接回车。至此若出现successful则证明已经成功创建。

查看任务

1

2

3

4

5

6

sqoop:000> show job

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

| Id |     Name      |           From Connector            |        To Connector        | Enabled |

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

| 3  | mysql-hdfs    | link-mysql (generic-jdbc-connector) | link-hdfs (hdfs-connector) | true    |

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

6)启动JOB

我这里MySQL数据库有一百万数据

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

[root@hadoop-nn ~]# mysql -h10.10.0.245 -P3306 -uroot -p123456 sbtest

mysql: [Warning] Using a password on the command line interface can be insecure.

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 331

Server version: 5.7.18-log MySQL Community Server (GPL)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> select count(*) from sbtest1;

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

| count(*) |

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

|  1000000 |

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

1 row in set (0.18 sec)

然后start job即可

1

2

3

4

5

6

7

8

9

10

sqoop:000> start job -n mysql-hdfs

Submission details

Job Name: mysql-hdfs

Server URL: http://localhost:12000/sqoop/

Created by: hadoop

Creation date: 2017-06-20 07:00:56 EDT

Lastly updated by: hadoop

External ID: job_1497872194266_0002

        http://master:8088/proxy/application_1497872194266_0002/

2017-06-20 07:00:56 EDT: BOOTING  - Progress is not available

然后赶快查看这个任务的状态(当任务执行完成后无法查看的):

1

2

3

4

5

6

7

8

9

10

sqoop:000> status job -n mysql-hdfs

Submission details

Job Name: mysql-hdfs-02

Server URL: http://localhost:12000/sqoop/

Created by: hadoop

Creation date: 2017-06-20 08:57:18 EDT

Lastly updated by: hadoop

External ID: job_1497961863680_0001

        http://master:8088/proxy/application_1497961863680_0001/

2017-06-20 08:57:51 EDT: RUNNING  - 45.00 %

所以推荐去Web UI查看,当job运行的时候,你去某个节点上jps一下,会发现有几个YarnChild和AppMaster的进程。所以,sqoop2也是由yarn框架来管理的,我们可以通过 http://Hadoop:8088来查看进程的运行的状态(当Yarn重启后,历史任务会消失,可以安装JobHistoryServer解决)。

启动过程中很有可能会报错,我测试中报错很多,这是后来成功的。比如启动job的时候提示:“Exception: org.apache.sqoop.common.SqoopException Message: GENERIC_JDBC_CONNECTOR_0016:Can’t fetch schema -”。需要好好检查在创建数据库链接时,链接参数格式问题,特别是注意Identifier enclose:  这里不能直接回车!要打一个空格符号然后再回车!因为如果不打空格,查询MySQL表的时候会在表上加上“”,导致查询出错!

要设置可查看具体出错信息

1

2

sqoop:000> set option --name verbose --value true

Verbose option was changed to true

当任务完成后,可以去HDFS查看文件:

1

2

3

4

5

6

7

8

9

10

11

12

[hadoop@hadoop-nn ~]$ hdfs dfs -ls /sqoop

Found 10 items

-rw-r--r--   3 hadoop supergroup   19800000 2017-06-20 08:57 /sqoop/093b9956-962a-4377-b423-0b825215ce6b.txt

-rw-r--r--   3 hadoop supergroup   19800000 2017-06-20 08:57 /sqoop/93e6efc5-03ac-4551-abbe-d447c528c57d.txt

-rw-r--r--   3 hadoop supergroup   19800000 2017-06-20 08:57 /sqoop/97051dbc-fc53-4d33-b651-bc68dc21c296.txt

-rw-r--r--   3 hadoop supergroup   19800000 2017-06-20 08:57 /sqoop/a8df348e-d4de-4883-a22b-565d87e3e255.txt

-rw-r--r--   3 hadoop supergroup   19800000 2017-06-20 08:57 /sqoop/ade642e6-55bb-4f28-8067-da53eecf5d8f.txt

-rw-r--r--   3 hadoop supergroup   19800000 2017-06-20 08:57 /sqoop/bbb1b081-4286-4815-ae48-6adfabf39eb6.txt

-rw-r--r--   3 hadoop supergroup   19800000 2017-06-20 08:57 /sqoop/bff764be-51f0-4440-b360-448109b34f03.txt

-rw-r--r--   3 hadoop supergroup   19800001 2017-06-20 08:57 /sqoop/e12c764c-0c63-46bc-ad98-22d1fa3b2eb1.txt

-rw-r--r--   3 hadoop supergroup   19800000 2017-06-20 08:57 /sqoop/e16cf287-1551-47b4-a264-241251cf9a91.txt

-rw-r--r--   3 hadoop supergroup   19688895 2017-06-20 08:57 /sqoop/fe77ccf9-532a-4041-84dc-8f1322d9fed7.txt

引用:

http://www.ywnds.com/?p=10266

http://sqoop.apache.org/docs/1.99.7/user/Sqoop5MinutesDemo.html

https://www.jianshu.com/p/b00e1a368bfc
https://blog.csdn.net/u014729236/article/details/46876651

猜你喜欢

转载自blog.csdn.net/zhanglong_4444/article/details/84110345