设为首页 加入收藏

TOP

Sqoop学习笔记——关系数据库与hdfs间数据迁移
2019-02-08 12:17:23 】 浏览:15
Tags:Sqoop 学习 笔记 关系 数据库 hdfs 数据 迁移
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lsxy117/article/details/47256967

一、安装:

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

二、配置:

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

三、配置mysql远程连接

GRANTALLPRIVILEGESONekp_11.*TO'root'@'192.168.1.10'IDENTIFIEDBY'123456'WITHGRANTOPTION;

FLUSHPRIVILEGES;

GRANTALLPRIVILEGESON*.*TO'root'@'%'IDENTIFIEDBY'123456'WITHGRANTOPTION;

FLUSHPRIVILEGES

四、使用:

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

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

./sqoopimport--connectjdbc:mysql://192.168.1.10:3306/ekp_11--usernameroot--password123456--tablejob_log--columns'fd_id,fd_start_time,fd_end_time,fd_subject,fd_success'-m1

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

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

./sqoopimport--connectjdbc:mysql://192.168.1.10:3306/ekp_11--usernameroot--password123456--tablejob_log--target-dir'/sqoop/jl'--fields-terminated-by'\t'-m1

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

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

./sqoopimport--connectjdbc:mysql://192.168.1.10:3306/ekp_11--usernameroot--password123456--tablejob_log--where'fd_start_time>"2015-06-0000:00:00"'--target-dir'/sqoop/jl2'-m1

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

./sqoopimport--connectjdbc:mysql://192.168.1.10:3306/ekp_11--usernameroot--password123456--query'SELECT*FROMjob_logwherefd_start_time>"2015-06-0000:00:00"AND$CONDITIONS'--target-dir'/sqoop/jl3'-m1

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

1.5指定Map数量-m

./sqoopimport--connectjdbc:mysql://192.168.1.10:3306/ekp_11--usernameroot--password123456--tablejob_log--target-dir'/sqoop/jl4'--fields-terminated-by'\t'-m4--split-byfd_start_time

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

执行结果如下图:

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

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

./sqoopimport--connectjdbc:mysql://192.168.1.10:3306/ekp_11--usernameroot--password123456--tablejob_log--target-dir'/sqoop/jl4'--fields-terminated-by'\t'-m4--split-byfd_id

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

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

createtablejob_log_bakselectfd_id,fd_start_time,fd_end_time,fd_subject,fd_successfromjob_logwherefd_id='1'

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

./sqoopexport--connectjdbc:mysql://192.168.1.10:3306/ekp_11--usernameroot--password123456--export-dir'/user/root/job_log'--tablejob_log_bak-m1--fields-terminated-by','

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

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

./sqoopcreate-hive-table--connectjdbc:mysql://192.168.1.10:3306/ekp_11--tablejob_log--usernameroot--password123456--hive-tablejob_log

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

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

./sqoopimport--connectjdbc:mysql://192.168.1.10:3306/ekp_11--usernameroot--password123456--tablejob_log--hive-import-m1--fields-terminated-by'\t'

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

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

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

./sqoopexport--connectjdbc:mysql://192.168.1.10:3306/ekp_11--usernameroot--password123456--tablejob_log_bak--export-dir/user/hive/warehouse/job_log/-m1--input-fields-terminated-by'\t'--fields-terminated-by','

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

其他使用:

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

./sqooplist-databases--connectjdbc:mysql://192.168.1.10:3306/--usernameroot--password123456

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

./sqooplist-tables--connectjdbc:mysql://192.168.1.10:3306/ekp_11--usernameroot--password123456

未完待续。。。


编程开发网
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇使用python访问hdfs——pyhdfs库.. 下一篇spark on hive 写入hdfs 用csv格式

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

array(4) { ["type"]=> int(8) ["message"]=> string(24) "Undefined variable: jobs" ["file"]=> string(32) "/mnt/wp/cppentry/do/bencandy.php" ["line"]=> int(214) }