一个导入的例子
在安装Sqoop之后,可以用它将数据导入Hadoop。
Sqoop可以从数据库导入数据,如果你还没有安装数据库服务器,则需要选择一个。MySQL是一个支持很多平台的易于使用的数据库。
例15-1.创建一个新的MySQL数据库模式
% mysql -u root -pEnter password:Welcome to the MySQL monitor. Commands end with ; on \g.Your MySQL connection id is 349Server version: 5.1.37-1ubuntu5.4 (Ubuntu)Type 'help;' on '\h' for help. Type '\c' to clean the current input statement.mysql> CREATE DATABASE hadoopguide;Query OK, 1 now affected (0.02 sec)mysql> GRANT ALL PRIVILEGES ON hadoopguide.* TO '%*@'localhost';Query OK, 0 nows affected (0.00 sec)mysql> GRANT ALL PRIVILEGES ON hadoopguide.* TO *'@'localhost';Query OK, 0 nows affected (0.00 sec)mysql> quit;Bye
前面的密码提示要求你输入root用户的密码,就像root用户通过密码进行shell登 录一样。如果你正在使用Ubuntu或其他不支持root直接登录的Linux系统,则键 入安装MySQL时挑选的密码。
在这个会话中,我们创建了一个新的名为hadoopguide的数据库模式,本章中我 们将一直使用这个数据库模式。接着我们允许所有本地用户査看和修改hadoopguide模式的内容。最后,关闭这个会话。
现在让我们登录到数据库(这次不是作为root,而是你自己),然后创建一个将被导 入HDFS的表(例 15-2)。
例15-2.填充数据库
% mysql hadoopguideWelcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 352Server version: 5.1.37-lubuntu5.4 (Ubuntu)Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> CREATE TABLE widgets(id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, -> widget_name VARCHAR(64) NOT NULL, -> price DECIMAL(10,2), -> design_date DATE, -> version INT, -> design_comment VARCHAR(100));Query OK, 0 rows affected (0.00 sec)mysql> INSERT INTO widgets VALUES (NULL, 'sprocket*, 0.25> '2010-02-10', -> 1, *Connects two gizmos');Query OK, 1 row affected (0.00 sec)mysql> INSERT INTO widgets VALUES (NULL,'gizmo',00, '2009-ll-30',4, -> NULL);Query OK, 1 row affected (0.00 sec)mysql> INSERT INTO widgets VALUES (NULL,'gadget', 99.99, '1983-08-l3', -> 13, 'Our flagship product');Query OK, 1 row affected (0.00 sec)mysql> quit;
在上面的会话中,我们创建了一个名为widgets的新表。在本章更多的例子中我们都将使用这个虚构的产品数据库。表widgets有几个不同数据类型的字段。现在让我们使用Sqoop将这个表导入HDFS:
% sqoop import --connect jdbc:mysql://localhost/hadoopguide \>--table widgets -m 110/06/23 14:44:18 INFO tool.CodeGenTool:Beginning code generation ...10/06/23 14:44:20 INFO mapred.JobClient: Running job: job_201006231439_000210/06/23 14:44:21 INFO mapred.DobClient: map 0% reduce 0%10/06/23 14:44:32 INFO mapred.DobClient: map 100% reduce 0%10/06/23 14:44:34 INFO mapred.DobClient: Job complete:job_201006231439_0002...10/06/23 14:44:34 INFO mapreduce.ImportJobBase: Retrieved 3 records.
Sqoop的import工具会运行一个MapReduce作业,该作业会连接MySQL数据库并读取表中的数据。默认情况下,该作业会并行使用4个map任务来加速导入过程。毎个任务都会将其所导入的数据写到一个单独的文件,但所有4个文件都位于同一个目录中。在本例中,由于我们知道只有三行可以导入的数据,因此指定Sqoop只使用一个map任务(-m 1),这样我们只得到一个保存在HDFS中的文件。
我们可以检査这个文件的内容,如下所示:
% hadoop fs -cat widgets/part-m-000001,Sprocket,0.25,2010-02-10,1,Connects two gizmos2,gizmo,4.00,2009-ll-30,4,null3,gadget,99.99,1983-08-13,13,0ur flagship product
默认情况下,Sqoop会将我们导入的数据保存为逗号分隔的文本文件。如果导入数据的字段内容中存在分隔符,则我们可以另外指定分隔符、字段包围字符和转义字符。使用命令行参数可以指定分隔符、文件格式、压缩以及对导入过程进行更细粒度的控制,Sqoop自带的“SqoopUserGuide”,或在Sqoop的在线帮助中(sqoophelp import,在CDH中使用man sqoop-import),可以找到对相关参数的描述。