Sqoop用法

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

Sqoop用法_第1张图片

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企业版”软件来验证是否设置成功,配置如下:

Sqoop用法_第2张图片


MySQL主机地址(M):安装MySQL软件的主机的IP地址。

用户名(u):必须为root,必须跟上边设置远程连接是的用户名(root)一致。

密码(P):123, 必须跟上边设置远程连接是的密码(qiangbo)一致。

其他不用设置,点击“测试连接”,出现如下界面表示连接成功:

Sqoop用法_第3张图片

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,如下图所示:

        Sqoop用法_第4张图片

--username------>mysql用户名指令

root------>远程连接时设置的用户名

--password------>mysql密码指令

123------>远程连接时设置的

--table------>表指令

student_table------>表名,可从“SQLyog”中查看到该电脑上数据库中的表名,如下图所示:

Sqoop用法_第5张图片

--columns------>列指令

student_name------>mysql中的列名,如下图所示:

Sqoop用法_第6张图片

java_teacher------>mysql中的列名

指令验证:

可以从Hadoop的客户端(ht

Sqoop用法_第7张图片


从上图可以看出,HDFS上确实有了从mysql上传输过来的数据,其默认地址为:/user/root/student_table,也可以看出将mysql上传输过来的数据分成了4个map,分别为:part-m-0000,part-m-0001,part-m-0002,part-m-0003。也可以从Hadoop的命令行指令查看各个map上的数据,如下所示:

Sqoop用法_第8张图片

跟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上传过来的数据,如下图所示:

Sqoop用法_第9张图片

从上图可以看出确实在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上传过来的数据,如下图所示:

Sqoop用法_第10张图片

从上图可以看出确实在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。

指令验证:

Sqoop用法_第11张图片

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将数据导出到关系型数据库指令

 

 

 

 

你可能感兴趣的:(hadoop学习)