Sqoop-学习笔记

文章目录

  • 前言
  • 1.Sqoop简介(1.4.6)
  • 2.原理
  • 3.JDBC驱动
  • 4.SqoopDemo
    • 4.1 MySQL->HDFS
    • 4.2 RDBMS -> HIVE
    • 4.3 RDBMS -> HBase
    • 4.3 HIVE / HDFS -> RDBMS
  • 5.脚本编写
  • 总结


前言

本文分享本菜鸟的Sqoop学习笔记。Sqoop能够实现Hadoop(hive)与传统数据库之间的数据传递。主要用于数仓(Hive)与数据库之间的数据传输。
本菜鸟QQ:599903582
笨鸟先飞,熟能生巧 ~
比心心 ~


提示:以下是本篇文章正文内容,下面案例可供参考

1.Sqoop简介(1.4.6)

开源工具,主要用户在Hadoop(Hive)与传统的数据库之间进行数据的传递。
可以将一个关系型数据库中的数据到进到Hadoop的HDFS中,也可以将HDFS的数据倒进到关系型数据库中。
注意:Sqoop2不打算应用于生产环境。Sqoop1可以。


2.原理

Sqoop,将导入导出的命令翻译成MapReduce程序来实现. (其实只有map)。
在翻译出的mapreduce中主要是对inputformat和outputformat进行定制。


3.JDBC驱动

拷贝jdbc驱动到sqoop的lib目录下

$ cp mysql-connector-java-5.1.27-bin.jar /opt/module/sqoop-1.4.6.bin__hadoop-2.0.4-alpha/lib/

4.SqoopDemo

4.1 MySQL->HDFS

全部导入:

bin/sqoop import \
--connect jdbc:mysql://hadoop102:3306/company \
--username root \
--password 123456 \
--table staff \
--target-dir /company \    //指定要发送到的HDFS 的路径,路径不存在自动创建
--delete-target-dir \      //因为是通过Mapreduce程序来实现的,如果目标文件存在会报错,所有如果有就将其删除
--num-mappers 1 \			//设置Map的个数
--fields-terminated-by "\t" \   //元素之间使用什么分割
--split-by id;               //分区按照id来分区

注意:

  • –target-dir的默认路径是: /user/用户名/表名
  • —split-by 默认值是主键

查询导入:

bin/sqoop import \
--connect jdbc:mysql://hadoop102:3306/company \
--username root \
--password 123456 \
--target-dir /company \
--delete-target-dir \
--num-mappers 2 \
--fields-terminated-by "\t" \
	//根据查询语句来进行导入,must contain 
	//'$CONDITIONS' in WHERE clause.   必须有
--query 'select id,name,sex from staff where id <= 10 and $CONDITIONS' \
--split-by id
	//注意:使用query,必须制定target-dir和split-by,因为这是没有默认值
	//如果query后面使用的是创引号,则$CONDITIONS前必须加转移符,放置shell识别为自己的变量

导入指定列:

bin/sqoop import \
--connect jdbc:mysql://hadoop102:3306/company \
--username root \
--password 123456 \
--table staff \
--target-dir /company \
--delete-target-dir \
--num-mappers 2 \ 
--fields-terminated-by "\t" \
--columns id,name \    //指定要上传的指定列
--split-by id
//注意:columns中如果涉及到多列,用逗号分割,分割时不要添加空格

通过sqoop关键字筛选查询指定数据

bin/sqoop import \
--connect jdbc:mysql://hadoop102:3306/company \
--username root \
--password 123456 \
--target-dir /company \
--delete-target-dir  \
--num-mappers 2 \
--fields-terminated-by "\t" \
--table staff \
--where "id=1"    //指定查询规则

4.2 RDBMS -> HIVE

bin/sqoop import \
--connect jdbc:mysql://hadoop102:3306/company \
--username root \
--password 123456 \
--table staff \
--delete-target-dir \
--num-mappers 2 \
--hive-import \       //声明hive   
--fields-terminated-by "\t" \
--hive-overwrite \     //写入选项
--hive-table staff_hive    //传入后的表名

注意:过程分两步。

  • 1.将数据导入到HDFS。
  • 2.HDFS到hive
    第一步默认的临时目录是**/user/用户名/表名**

4.3 RDBMS -> HBase

$ bin/sqoop import \
--connect jdbc:mysql://hadoop102:3306/company \
--username root \
--password 000000 \
--table staff \
--columns "id,name,sex" \
--column-family "info" \
--hbase-create-table \
--hbase-row-key "id" \
--hbase-table "hbase_company" \
--num-mappers 1 \
--split-by id

注意

  • 导入到HBase不会自动创建表(sqoop1.4.6只支持HBase1.0.1之前的版本的自动创建HBase表的功能)。
  • sqoop1.4.6只支持HBase1.0.1之前的版本的自动创建HBase表的功能

4.3 HIVE / HDFS -> RDBMS

bin/sqoop export \
--connect jdbc:mysql://hadoop102:3306/company \
--username root \
--password 123456 \
--table staff \
--num-mappers 2 \
--export-dir /user/hive/warehouse/staff_hive \    //指定要输出的文件的路径
--input-fields-terminated-by "\t" 

注意

  • 导入到HBase不会自动创建表(sqoop1.4.6只支持HBase1.0.1之前的版本的自动创建HBase表的功能)。
  • 导出到Mysql不会自动创建表。

5.脚本编写

touch opt/job_HDFS2RDBMS.opt

vi opt/job_HDFS2RDBMS.opt
 
export \
--connect jdbc:mysql://hadoop102:3306/company \
--username root \
--password 000000 \
--table staff  \
--num-mappers 1 \
--export-dir /user/hive/warehouse/staff_hive \
--input-fields-terminated-by "\t"

执行

$ bin/sqoop --options-file opt/job_HDFS2RDBMS.opt

总结

Sqoop的内容相对来说比较少,也比较简单,主要也是用于数仓(Hive)与数据库之间的数据传输。
本菜鸟QQ:599903582
笨鸟先飞,熟能生巧 ~
比心心 ~

你可能感兴趣的:(数据库,数据采集,数仓,sqoop)