使用SQOOP导入数据的HDFS

时间:2020-02-23 14:33:33  来源:igfitidea点击:

想象一下已经采取的虚构服务使用的关系数据库(我们猜到了它)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.