Sqoop的用法
1. 系统配置
电脑1(Lenovo E420),win7 64位系统,8G内存,此电脑虚拟机上运行两个ubuntu14.10系统。
电脑2(Lenovo SL410),win7 64位系统,4G内存,此电脑虚拟机上运行一个ubuntu14.10系统。
虚拟机:Vmware10.0
Hadoop2.7.0
Zookeeper3.4.6
Sqoop1.4.4
2. Sqoop简介
Sqoop 主要用于在HADOOP(Hive)与传统数据库之间进行数据的传递。可以将一个关系型数据库(mysql,oracle..)中的数据导入Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。
3. Sqoop安装与配置
Sqoop框架比较简单,只要将其安装到集群中的一个节点上就可以使用了,在这里我们将其安装在ubuntu1之上。
1) 跳转到sqoop安装目录:
cd /home/brian/hadoop
2) 解压Sqoop安装文件
tar –zxvf sqoop-1.4.4.bin_hadoop-2.0.4-alpha.tar.gz
3) 重命名Sqoop安装目录
mv sqoop-1.4.4.bin-hadoop-2.0.4-alpha sqoop
4) 在~/.bashrc中设置SQOOP_HOME环境变量
5) 把mysql的jdbc驱动mysql-connector-java-5.1.35-bin.jar复制到sqoop安装目录的lib目录下。
6) 配置sqoop安装目录下conf中的sqoop-env.sh
其实sqoop-env.sh也可以不配置,只要安装sqoop的这台机器上有安装hadoop,并且在hadoop中有配置resourcemanager和namenode。这个时候,sqoop可以自动搜索HADOOP_HOME的目录,从而找到相关的配置,我选的是这种方式。
如果本台机器没有安装hadoop,则可以按照以下方式进行配置:
Ø 进入sqoop安装目录下的conf目录
cd /home/brian/hadoop/sqoop/conf
Ø 重命名sqoop-env-template.sh
Mv sqoop-env-template.sh sqoop
Ø 修改配置文件sqoop-env.sh
4. 配置mysql为远程连接
sqoop框架的目的就是在mysql,oracle等数据库和hadoop之间传送数据,这样就要求我们能够在远程登陆关系型数据库。而mysql默认只能进行本地(local)连接,所以我们首先要配置mysql的远程连接。
mysql 远程连接格式如下(其中红色的表示不用修改的固定格式):
grant 权限 on 数据库名.表名 to 用户@登录主机 identifiedby "用户密码";
修改完后要重新刷新
FLUSH PRIVILEGES
在此我们将远程连接的权限设置成”ALL PRIVILEGES”,将用户设置为”root”,用户密码为“qiangbo”,登陆主机值改为%表示任何客户端主机上都能以root用户登录到mysql。具体设置如下所示:
MySQL>GRANTALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY ‘123’ WITH GRANT OPTION;
MySQL>FLUSHPRIVILEGES;
5. 验证mysql的远程连接
在这里推荐用“SQLyog企业版”软件来验证是否设置成功,配置如下:
MySQL主机地址(M):安装MySQL软件的主机的IP地址。
用户名(u):必须为root,必须跟上边设置远程连接是的用户名(root)一致。
密码(P):123, 必须跟上边设置远程连接是的密码(qiangbo)一致。
其他不用设置,点击“测试连接”,出现如下界面表示连接成功:
6. Sqoop使用
Sqoop的使用主要包括将关系型数据库数据导入 HDFS和将HDFS数据导出到关系型数据库两种,不管是哪种形式,都首先必须“连接到数据库”然后输入“用户名”,再然后输入“密码”,下来才是别的操作。
1) 数据库数据导入到HDFS上的默认路径。
sqoop import --connect jdbc:mysql://192.168.1.104:3306/school_data12 --username root --password 123--table student_table --columns 'student_name,java_teacher'
命令解析:
Sqoop ------>sqoop 命令
import------>从mysql将数据导入HDFS时的命令
--connet------>连接数据库命令
jdbc:mysql://192.168.1.104:3306/------>192.168.1.104为mysql安装电脑的IP地址,3306为mysql的端口
school_data12------>mysql中的database名称,可以从“SQLyog”中查看到该电脑上数据库的名称,其中就有school_data12,如下图所示:
--username------>mysql用户名指令
root------>远程连接时设置的用户名
--password------>mysql密码指令
123------>远程连接时设置的
--table------>表指令
student_table------>表名,可从“SQLyog”中查看到该电脑上数据库中的表名,如下图所示:
--columns------>列指令
student_name------>mysql中的列名,如下图所示:
java_teacher------>mysql中的列名
指令验证:
可以从Hadoop的客户端(ht
从上图可以看出,HDFS上确实有了从mysql上传输过来的数据,其默认地址为:/user/root/student_table,也可以看出将mysql上传输过来的数据分成了4个map,分别为:part-m-0000,part-m-0001,part-m-0002,part-m-0003。也可以从Hadoop的命令行指令查看各个map上的数据,如下所示:
跟SQLyog中的表一对比完全正确。
2) 指定输出路径,指定数据分隔符
sqoop import --connect jdbc:mysql://192.168.1.104:3306/school_data12 --username root --password 123--table student_table --target-dir '/sqoop/td' --fields-terminated-by '\t'
--tar-get-dir------>指定输出路径指令
‘sqoop/td’------>在HDFS中指定了sqoop/td目录
--fields-terminate-by------>指定数据分隔符指令
指令验证:
可以从Hadoop的客户端(http://192.168.1.120:50070)查看HDFS上是否有从mysql上传过来的数据,如下图所示:
从上图可以看出确实在HDFS上生成了/sqoop/td路径
3) 指定map数量
Sqoop中默认的map数量为4,我们可以用-m指令来设置map数量。
sqoop import --connect jdbc:mysql://192.168.1.104:3306/school_data12 --username root --password 123--table student_table --target-dir'/sqoop/td1' --fields-terminated-
by '\t' -m 2
-m------>指定map数量指令
指令验证:
可以从Hadoop的客户端(http://192.168.1.120:50070)查看HDFS上是否有从mysql上传过来的数据,如下图所示:
从上图可以看出确实在HDFS/sqoop/td1中产生了两个map,分别为part-m-00000,Part-m-00001。
4) 增加where条件
sqoop import --connect jdbc:mysql://192.168.1.104:3306/school_data12 --username root --password 123--table student_table --where ‘student_id>2 and student_id
<7’--target-dir '/sqoop/td2' --fields-terminated-by'\t' -m 2
--where------>where指令 增加where条件时要注意:条件必须用引号引起来。
指令验证:
可以通过hadoop命令行指令(hadoop fs –cat /sqoop/td2/part-m-00000)来查看,如下图所示:
可以从上图看出,得到的数据student_id范围确实是(2,7)之间。
5) 增加query语句
sqoop import --connect jdbc:mysql://192.168.1.10:3306/school_data12--username root --password 123 \--query'SELECT * FROM student_table where student_id > 2 AND $CONDITIONS'--target-dir '/sqoop/td3' -m 1
\--query------>增加query指令
注意:如果使用--query这个命令的时候,需要注意的是where后面的参数,AND $CONDITIONS这个参数必须加上而且存在单引号与双引号的区别,如果--query后面使用的是双引号,那么需要在$CONDITIONS前加上\即\$CONDITIONS。
指令验证:
6) 将HDFS上的数据导出到数据库中
sqoop export--connect jdbc:mysql://192.168.8.104:3306/school_data12 --username root--password 123 --export-dir '/td3' --table td_bak -m 1 --fields-termianted-by'\t'
export ------>从HDFS将数据导出到关系型数据库指令