使用SQOOP导入数据的HDFS
想象一下已经采取的虚构服务使用的关系数据库(我们猜到了它)Apache Hadoop服务呼叫,现在希望将一些数据移动到Hadoop以运行Hive查询,利用HBase可扩展性和性能,并运行文本分析其客户的问题描述。
SQOOM是我们要用于将数据从关系表导入Hadoop上的HBase表中的工具。
在下列列表中,我们可以看到用于构建我们在图中看到的服务订单数据库的MySQL命令。
已安装是一个MySQL RDBMS,我们可以从中导入和导出到使用SQOOP。
/* Create the Service Orders Database */ CREATE DATABASE serviceorderdb; USE serviceorderdb; /* Create the Product Information Table */ CREATE TABLE productinfo( productnum CHAR (4) PRIMARY KEY, productdesc VARCHAR(100) ); /* Create the Customer Contact Information Table */ CREATE TABLE customercontactinfo( customernum INT PRIMARY KEY, customername VARCHAR(100), contactinfo VARCHAR(100), productnums SET('A100','A200','A300','B400','B500','C500','C600','D700') ); /* Create the Service Orders Table */ CREATE TABLE serviceorders( serviceordernum INT PRIMARY KEY, customernum INT, productnum CHAR(4), status VARCHAR(100), FOREIGN KEY (customernum) REFERENCES customercontactinfo(customernum), FOREIGN KEY (productnum) REFERENCES productinfo(productnum) ); /* Insert product data into the Product Information Table */ INSERT INTO productinfo VALUES ('A100', 'HBase Support Product'); INSERT INTO productinfo VALUES ('A200', 'Hive Support Product'); INSERT INTO productinfo VALUES ('A300', 'Sqoop Support Product'); INSERT INTO productinfo VALUES ('B400', 'Ambari Support Product'); INSERT INTO productinfo VALUES ('B500', 'HDFS Support Product'); INSERT INTO productinfo VALUES ('C500', 'Mahout Support Product'); INSERT INTO productinfo VALUES ('C600', 'Zookeeper Support Product'); INSERT INTO productinfo VALUES ('D700', 'Pig Support Product'); /* Insert customer data into the Customer Contact Information Table */ INSERT INTO customercontactinfo VALUES (10000, 'John Timothy Smith', '1 Hadoop Lane, NY, 11111, [email protected]', 'B500'); INSERT INTO customercontactinfo VALUES (10001, 'Bill Jones', '2 HBase Ave, CA, 22222', 'A100,A200,A300,B400,B500,C500,C600,D700'); INSERT INTO customercontactinfo VALUES (20000, 'Jane Ann Doe', '1 Expert HBase Ave, CA, 22222', 'A100,A200,A300'); INSERT INTO customercontactinfo VALUES (20001, 'Joe Developer', '1 Piglatin Ave, CO, 33333', 'D700'); INSERT INTO customercontactinfo VALUES (30000, 'Data Scientist', '1 Statistics Lane, MA, 33333', 'A300,C500'); /* Enter service orders into the Service Orders Table */ INSERT INTO serviceorders VALUES (100000, 20000, 'A200', 'I have some questions on building HiveQL queries? My Hadoop for theitroad book has not arrived yet!'); INSERT INTO serviceorders VALUES (100001, 10001, 'A100', 'I need to understand how to configure Zookeeper for my HBase Cluster?'); INSERT INTO serviceorders VALUES (200000, 20001, 'D700', 'I am writing some Piglatin and I have a few questions?'); INSERT INTO serviceorders VALUES (200001, 30000, 'A300', 'How do I merge my data sets after Sqoop incremental imports?');
以下列表确认已使用先前显示的命令创建MySQL服务订单数据库,并显示我们将从使用SQOOP导入的表名称。
mysql> show tables; +--------------------------+ | Tables_in_serviceorderdb | +--------------------------+ | customercontactinfo | | productinfo | | serviceorders | +--------------------------+ 3 rows in set (0.00 sec)
现在我们已经看到了刚刚等待被剥削的MySQL服务订单数据库记录,是时候将注意力转向Hadoop并运行第一个SQOOM命令。
不要将可靠的导入命令拉出蝙蝠。
SQOOM包括多个方便的工具以及导入和导出,包括列表数据库命令,该命令在下列列表中使用。
使用该命令,我们可以确认我们可以在MySQL数据库中提供连接和可见性。
$sqoop list-databases --connect jdbc:mysql://localhost/ --username root -P Enter password: 13/08/15 17:21:00 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset. information_schema mysql performance_schema serviceorderdb
ServiceOrderDB显示可用,因此现在我们可以使用SQOP列表-Tables命令列出serviceOrderDB中的表。
请注意,现在我们正在添加要在JDBC中访问的数据库:MySQL URL:
$sqoop list-tables --connect jdbc:mysql://localhost/serviceorderdb --username root -P Enter password: 13/08/15 17:22:01 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset. customercontactinfo productinfo serviceorders
SQOOP现在有连接,可以从图中访问三个表。
这意味着我们可以执行第一个SQOOP Import命令并以清洁的良心针对服务表。
SQOOM Import命令具有此格式:
sqoop import (generic arguments) (import arguments)
使用通用参数,我们指向MySQL数据库并提供必要的登录信息,就像使用前面的列表表工具一样。
在导入参数中,我们(用户)有能力指定要导入的内容以及要如何执行导入的内容。
在下列列表中,我们可以使用-m 1 cla指定服务表,并请求将一个映射任务用于导入。
(默认情况下,SQOOP将使用四个地图任务,但这将是这个小型表和我们的虚拟机的矫枉过正。
)
我们还为生成的代码指定了类名,并指定了所编译代码和.jar文件的Bindir。
(没有这些参数,SQOOP会将生成的Java源文件放在当前工作目录中和编译的.class文件和.jar文件中/tmp/sqoop- <username> /编译。
)
除非我们在类名命令行参数(CLA)的帮助下指定名称,否则类名只是从表名称派生。
目标-DIR是HDFS中的位置,我们希望将进口表放置其中。
$sqoop import --connect jdbc:mysql://localhost/serviceorderdb --username root -P --table serviceorders -m 1 --class-name serviceorders --target-dir /usr/biadmin/serviceorders-import --bindir . Enter password: ... 13/08/25 14:43:56 INFO mapreduce.ImportJobBase: Transferred 356 bytes in 21.0736 seconds (16.8932 bytes/sec) 13/08/25 14:43:56 INFO mapreduce.ImportJobBase: Retrieved 4 records.