码迷,mamicode.com
首页 > 数据库 > 详细

Sqoop学习笔记——关系数据库与hdfs间数据迁移

时间:2015-08-03 17:02:27      阅读:318      评论:0      收藏:0      [点我收藏+]

标签:sqoop   hive   hadoop   关系数据库与hdfs间迁移   

一、安装:

上传到hadoop集群的某一个节点上,将sqoop压缩包解压即可直接使用;

 

二、配置:

将需要连接的数据库(比如OracleMySQL)的连接驱动拷贝到 sqoop目录的lib

 

三、配置mysql远程连接

GRANT ALL PRIVILEGES ON ekp_11.* TO ‘root‘@‘192.168.1.10‘ IDENTIFIED BY ‘123456‘ WITH GRANT OPTION;

FLUSH PRIVILEGES; 

GRANT ALL PRIVILEGES ON *.* TO ‘root‘@‘%‘ IDENTIFIED BY ‘123456‘ WITH GRANT OPTION;

FLUSH PRIVILEGES

 

四、使用:

第一类:关系型数据库中的数据导入到HDFS

1.1使用默认输出路径、指定导出的字段、设置map数量为1

./sqoop import --connect jdbc:mysql://192.168.1.10:3306/ekp_11 --username root --password 123456  --table job_log --columns ‘fd_id, fd_start_time, fd_end_time, fd_subject,fd_success -m 1

      

执行成功后,会在hdfs/user/目录下会根据操作的用户名自动生成同名的root目录,root 目录下会生成同表名的job_log 目录,在job_log 目录下就是真正的导入到hdfs的数据文件。如下图:

 技术分享

 

1.2指定输出路径、指定数据导入后的分隔符、指定Map数量1

./sqoop import --connect jdbc:mysql://192.168.1.10:3306/ekp_11 --username root --password 123456  --table job_log --target-dir ‘/sqoop/jl‘ --fields-terminated-by ‘\t‘ -m 1

 

执行成功后,会在hdfs的根目录下创建我们的指定目录/sqoop/jl ,在jl目录下就是真正的导入到hdfs的数据文件。查看导入的数据文件内容,数据的列分隔符根据我们的要求使用了制表符分割,如下图:

技术分享

 

1.3增加where条件注意:条件必须用引号引起来

./sqoop import --connect jdbc:mysql://192.168.1.10:3306/ekp_11 --username root --password 123456  --table job_log --where ‘ fd_start_time >"2015-06-00 00:00:00" ‘ --target-dir ‘/sqoop/jl2‘ -m 1

 

 

1.4增加query语句(使用 将语句换行)

./sqoop import --connect jdbc:mysql://192.168.1.10:3306/ekp_11 --username root --password 123456 --query ‘SELECT * FROM job_log where fd_start_time >"2015-06-00 00:00:00" AND $CONDITIONS‘ --target-dir ‘/sqoop/jl3‘ -m 1

注意:使用--query这个命令的时候,需要注意where后面的参数,AND $CONDITIONS这个参数必须加上,而且存在单引号与双引号的区别,如果--query后面使用的是双引号,那么需要在$CONDITIONS前加上\\$CONDITIONS

 

 

1.5指定Map数量 -m 

./sqoop import --connect jdbc:mysql://192.168.1.10:3306/ekp_11 --username root --password 123456  --table job_log --target-dir ‘/sqoop/jl4‘ --fields-terminated-by ‘\t‘ -m --split-by fd_start_time

 

注意:如果设置map数量为1个时即-m 1,不用加上--split-by ${tablename.column}当设定的map 数量大于1时,需要加上参数 --split-by ${tablename.column} ,指定多个map任务执行的内容划分。

执行结果如下图:

 技术分享

这里发现个小问题,我是按时间来分割的,出现了数据丢失的问题。可以看到part-m-0001文件大小为0,没有数据内容。

 指定多个map,并根据fd_id进行分割:

./sqoop import --connect jdbc:mysql://192.168.1.10:3306/ekp_11 --username root --password 123456  --table job_log --target-dir ‘/sqoop/jl4‘ --fields-terminated-by ‘\t‘ -m --split-by fd_id

 

 

第二类:将HDFS上的数据导出到关系型数据库中(不要忘记指定分隔符)

2.1首先在关系数据库中创建好表空表job_log_bak 

create table job_log_bak select fd_id,fd_start_time,fd_end_time,fd_subject,fd_success from job_log where fd_id =‘1‘ 

然后执行命令,将hdfs上的数据导入到该表中:

./sqoop export --connect jdbc:mysql://192.168.1.10:3306/ekp_11 --username root --password 123456 --export-dir ‘/user/root/job_log‘ --table job_log_bak -m 1 --fields-terminated-by ‘,‘

 

 

第三类:将关系型数据库的数据导出到hive

3.1将数据库的表结构复制到hive,只是复制表的结构:

./sqoop create-hive-table --connect jdbc:mysql://192.168.1.10:3306/ekp_11 --table job_log --username root --password 123456 --hive-table job_log

  

执行成功后,其实是在hdfs hive 目录上创建了一个 job_log 目录,如下图:

 技术分享

 

3.2从关系数据库导入文件到hive

./sqoop import --connect jdbc:mysql://192.168.1.10:3306/ekp_11 --username root --password 123456 --table job_log --hive-import -m 1 --fields-terminated-by ‘\t‘

 

执行成功后,会在hive的默认路径下/user/hive/warehouse/下首先创建表目录job_log,然后在该表目录下生成导入的数据的文件如part-m-00000。具体效果如下图:

 技术分享

 

注意:如果未指定字段的分隔符,将使用hive默认的分隔符 ‘\001‘

 

 

第四类:将hive的数据导出到关系型数据库

./sqoop export --connect jdbc:mysql://192.168.1.10:3306/ekp_11 --username root --password 123456 --table job_log_bak --export-dir /user/hive/warehouse/job_log/  -m 1 --input-fields-terminated-by ‘\t‘  --fields-terminated-by ‘,‘

 

注意:需要在执行的时候给sqoop增加参数 --input-fields-terminated-by,告诉sqoop读取的文件的分隔符,使它能够正确的解析文件字段。

 

 

其他使用:

列出mysql数据库中的所有数据库

./sqoop list-databases --connect jdbc:mysql://192.168.1.10:3306/ --username root --password 123456

连接mysql并列出ekp_11数据库中的表

./sqoop list-tables --connect jdbc:mysql://192.168.1.10:3306/ekp_11 --username root --password 123456

 

 未完待续。。。

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

Sqoop学习笔记——关系数据库与hdfs间数据迁移

标签:sqoop   hive   hadoop   关系数据库与hdfs间迁移   

原文地址:http://blog.csdn.net/lsxy117/article/details/47256967

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!