使用Sqoop从MySQL中导入数据
Sqoop是Apache项目,是Hadoop生态系统的扩展出来的。在某些方面Sqoop类似于distcp工具。两者都建立在MapReduce的基础之上,并且利用并行和容错。然而,Sqoop与Distcp的主要区别是:Sqoop主要被设计用来使得关系型数据库和HDFS之间进行数据的导入与导出(通过JDBC)。
它的功能广泛。这一节将讲述使用Sqoop将weblog数据从MySql导入到HDFS中。
准备工作
安装Sqoop。
安装MySQL,并确保他与Hadoop集群之间的联通性。
将MySQL JDBC driver JAR包拷贝到 $SQOOP_HOME/libs目录下。
实现步骤
1、MySQL数据库实例中创建一个新的数据库logs。
create database logs;
2、创建weblogs表格,并导入数据
use logs;
CREATE TABLE weblogs(
md5 VARCHAR(32),
url VARCHAR(64),
request_date DATE,
request_time TIME,
ip VARCHAR(15)
);
LOAD DATA INFILE '/path/weblog_entries.txt' INTO TABLE weblogs
FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n';
3、查询影响的行数
select count(*) from weblogs;
4、将数据库的数据导入到HDFS
sqoop import -m 1 --connect jdbc:mysql://192.168.11.131:3306/logs --username root --password 308308 --table weblogs --target-dir hdfs://192.168.11.131:9000/data/weblogs/import
输出结果
工作 原理
Sqoop从$SQOOP_HOME/libs中加载JDBC driver,$SQOOP_HOME是Sqoop的安装目录,JDBC driver将在连接中使用到。用户名和密码将在认证的过程中使用到。同时集群中的每一个节点必须具有访问mysql的权限,即在mysql.user中定义,否则的话Sqoop将抛出异常,指示MySQL服务器不允许连接。
mysql> USE mysql;
mysql> select host, user from user;
查询出允许连接的节点
添加节点可以通过以下命令完成:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.1.3'IDENTIFIED BY 'mypassword' WITH GRANT OPTION;
列出导入的目录
grunt> ls /data/weblogs/import
hdfs://192.168.11.131:9000/data/weblogs/import/_SUCCESS<r 1> 0
hdfs://192.168.11.131:9000/data/weblogs/import/_logs <dir>
hdfs://192.168.11.131:9000/data/weblogs/import/part-m-00000<r 1> 251212
这一行命令中隐含着很多复杂的操作。Sqoop使用数据库中的元数据为每一列产生一个DBWritable类。这些类将别DBInputFormat使用,DBInputFormat为Hadoop的输入格式,它可以对数据库进行任意的查询。在上面的例子中,一个MapReduce作业被提交,使用DBInputFormat从weblogs表中获取数据。整个weblogs表格将被扫描并且存入/data/weblogs/import中。
了解更多
Sqoop导入数据还有更多的选项。Sqoop可以通过 --as-avrodatafile和--as-sequencefile将数据导入为Avro和Sequence文件,导入的数据可以通过 -z和--compress参数进行压缩。默认的压缩方式为GZIP,它可以通过--compression-codec <CODEC>指定,只要它被HDFS支持。另外一个有用的参数为--direct,这一参数指定Sqoop去使用本地的导入导出工具如果它们被配置的数据库支持。如果--direct被添加上,上一个实例将采用mysqldumpfor导出表格。